こんにちは、吉岡(@yoshiokatsuneo)です。
DockerはLinux上の軽量コンテナ環境として、飛ぶ鳥を落とす勢いで成長しており、paizaでもジャッジシステムで利用しています。 そのDockerのMac OS X、Windows用クライアントの新製品が、"Docker for Mac"、"Docker for Windows" として先日3月24日に案内されています。
従来、Mac OS X, Windows向けクライアントとしては、Docker Toolboxが提供されてきました。 しかしながら、Docker Toolboxは、ある程度Dockerについての知識がないと使いづらい部分がありました。 Docker ToolboxはVirtual Box環境が必要であり、Docker Machineで環境設定を 行わないと利用できませんでしたし、コンテナホストにネットワークで接続するには明示的にIPアドレスを指定する必要もありました。
新しくリリースされたDocker for Mac、Docker for Windowsでは純正の仮想環境xhyve(Mac OS X)、Hyper-V VM(Windows)を利用することで、Virtual Boxなしで利用できるようになっています。 環境設定も必要ありませんし、Mac OS XのDNSと統合されており、非常に簡単にDockerが利用できます。
現時点では、プライベートベータとして登録して承認された人のみ利用できるようになっています。私は本日承認されてキーコードが送られましたので早速使ってみました。
2016/6/21現在、パブリックベータとして誰でも利用できるようになっています。
インストール
Docker for Macのインストーラは以下のURLからdmgパッケージでダウンロードできます。
https://docs.docker.com/docker-for-mac/
インストーラを実行すると、Mac OS Xのアプリケーション"Docker.app"をインストールするように促されますので、 ドラッグ&ドロップでインストールします。
Docker Toolboxをインストールしている場合、コンテナの移行もできます。
インストールができたら、Dockerアイコンがメニューバーに登録されました。Virtual Box等のインストールは必要ありません。
Dockerを使う
それではdockerを動かしてみましょう。 ターミナルから"docker"コマンドを実行するだけです。
Hello World
"docker run hello-world"で"hello-world"コンテナを実行してみます。
~$ docker run hello-world Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/
何も設定することなく、いきなり動きました!
Nginx
今度は、ウェブサーバnginxを起動してみます。
~$ docker run -d -p 80:80 --name webserver nginx 217157fad80c07338bd18d1f5655e1507dd07e6372ab977228b4704143deb6f9
ブラウザで http://localhost を開いてみましょう。Docker for Macでは、IPアドレスを指定する必要はありません。 (注: beta10以降では、"docker.local"ではなく"localhost"で接続するように変更になりました。)
nginxにも難なく接続できました!
Macのファイルシステムのマウント
MacのファイルシステムはDockerホストにマウントされており、ファイルシステム全体が"/Mac"として参照できます。 その他、"/Users", "/var/log", "/Users", "/Volumes", "/tmp", "/private"もマウントされています。
Macのルートフォルダを"-v"オプションでマウントしてみます。
~$ docker run -v /Mac:/Mac -i -t ubuntu /bin/bash root@9289a8664887:/# ls Mac bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Docker for Macでは、従来できなかったinotifyによるファイル変更通知にも対応しており、Mac OS Xとコンテナで共有しているフォルダについて、Mac OS X側でのファイル変更を、Docker for Macで検出できます。 開発ツールではファイル変更を検出して、自動リビルド・リロードを行うことが多いですが、従来はこのような開発フローでの利用が難しかったところがあります。 ファイル変更通知に対応したことで、このような場合でもスムーズに開発することができます。
"/tmp"ディレクトリをマウントして、Mac側で書き込みを行い、確認してみます。
コンテナ側:
~$ docker run -v /tmp:/mactmp -i -t ubuntu /bin/bash root@796e08e96aa8:/# apt-get install inotify-tools root@796e08e96aa8:/# inotifywait -r /mactmp Setting up watches. Beware: since -r was given, this may take a while! Watches established. /mactmp/ CREATE test
Mac OS X側:
$ echo test > /tmp/test
変更が検出できました。
ARM Linuxも動く
QEMUを利用することで、Intel以外のアーキテクテャのLinuxコンテナも動作します。 ARMを使ってみましょう。
~$ docker run resin/armv7hf-debian uname -a Linux 2c84c17a38e6 4.4.6 #1 SMP Mon Apr 4 15:12:22 UTC 2016 armv7l GNU/Linux
難なくARMアーキテクチャのLinuxが動いています!
fork爆弾対策もできる
従来、fork爆弾と呼ばれるDockerではプロセスを無限に作るような攻撃に対応できないという セキュリティ上の大きな問題がありました。 Docker for MacでインストールされるDocker環境では、コンテナ単位でのプロセス制限により、 このfork爆弾対策が行えるようになっています。 プロセス数制限は"--pids-limits"で行えます。 (なお、--pids-limitはDocker Engine 1.11、Kernel4.3以降でCGROUP_PIDSを有効にした場合に利用できます。)
~$ docker run --pids-limit 20 -i -t ubuntu /bin/bash root@95e5c7145b87:/# for i in `seq 1 20`; do sleep 10 & done [1] 16 [2] 17 [3] 18 [4] 19 [5] 20 [6] 21 [7] 22 [8] 23 [9] 24 [10] 25 [11] 26 [12] 27 [13] 28 [14] 29 [15] 30 [16] 31 [17] 32 [18] 33 bash: fork: retry: Resource temporarily unavailable [19] 35 bash: fork: retry: Resource temporarily unavailable bash: fork: retry: Resource temporarily unavailable
Dockerホストに入る
Dockerホストに入るには、screenコマンドでDockerコンテナのttyに接続します。
~$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty Welcome to Moby alpha Kernel 4.4.6 on an x86_64 (/dev/ttyS0) ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ docker login: root Welcome to the Moby alpha, based on Alpine Linux. docker:~#
Alpine Linuxのシェルに接続できました。 psコマンドで、docker関連のコマンドが動作していることがわかります。
docker:~# ps auxww|grep docker 1075 root 0:00 /sbin/9pudc -path /Socket -sock /var/run/docker.sock 1131 root 0:00 /sbin/transfused -p /var/run/transfused.pid -l /var/transfused_start.log -m /Mac -t /Mac/Users/tsuneo/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/transfused.log 1209 root 1:15 /usr/bin/docker daemon --pidfile=/run/docker.pid -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --config-file /Database/branch/master/ro/com.docker.driver.amd64-linux/etc/docker/daemon.json 1244 root 0:00 docker-containerd -l /var/run/docker/libcontainerd/docker-containerd.sock --runtime docker-runc --debug --metrics-interval=0 1350 root 0:00 /sbin/mdnstool -if eth0 -hostname docker.local. 3070 root 0:00 {exe} docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80 3077 root 0:00 docker-containerd-shim 217157fad80c07338bd18d1f5655e1507dd07e6372ab977228b4704143deb6f9 /var/run/docker/libcontainerd/217157fad80c07338bd18d1f5655e1507dd07e6372ab977228b4704143deb6f9 docker-runc 3296 root 0:00 docker-containerd-shim 95e5c7145b87a970ef6f97bf4a24a91a77feabe55790c227c3179290da1d094a /var/run/docker/libcontainerd/95e5c7145b87a970ef6f97bf4a24a91a77feabe55790c227c3179290da1d094a docker-runc
screenコマンドはCtrl-a Ctrl-k(又はCtrl-a k)で終了できます。
まとめ
Docker for Macを使うことでMac上でのDockerの利用が非常に簡単になっており、より手軽に利用することができるようになっています。現在プライベートベータ版ですが利用できるようになりましたら是非使ってみてください。
追記: Dockerの書籍『Docker実戦活用ガイド』を書きました。全体を通して、Docker for Macを利用できるようになっています(Docker for Macのインストール方法もあります)。よろしければ手に取ってみてください。
2016/6/21 更新: Docker for Macがプライベートベータからパブリックベータになりました。
関連記事:
- paizaの中の人による2016年のDocker本『Docker実戦活用ガイド』が本日発売! - paiza開発日誌
- ある社内プログラマが初めて技術書(『Docker実戦活用ガイド』)を出版するまで - paiza開発日誌
- 今からでも遅くない! Dockerをしっかり学ぶための書籍全10冊まとめ - paiza開発日誌
- Dockerは危険という誤解と、本当に注意すべき点 - paiza開発日誌
paizaは、技術を追い続けることが仕事につながり、スキルのある人がきちんと評価される場を作ることで、日本のITエンジニアの地位向上を目指したいと考えています。
自分のスキルを磨いていきたいと考えている方におすすめなのが「paizaラーニング」。オンラインでプログラミングしながらスキルアップできる入門学習コンテンツです。初心者でも楽しくプログラミングの基本を学ぶことができます。
そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。