paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

Docker for Mac プライベートベータを早速使ってみた!

f:id:paiza:20160406132325p:plain

f:id:paiza:20151217152725j:plainこんにちは、吉岡(@)です。

DockerはLinux上の軽量コンテナ環境として、飛ぶ鳥を落とす勢いで成長しており、paizaでもジャッジシステムで利用しています。 そのDockerのMac OS XWindows用クライアントの新製品が、"Docker for Mac"、"Docker for Windows" として先日3月24日に案内されています。

blog.docker.com

従来、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 XDNSと統合されており、非常に簡単にDockerが利用できます。

現時点では、プライベートベータとして登録して承認された人のみ利用できるようになっています。私は本日承認されてキーコードが送られましたので早速使ってみました。
2016/6/21現在、パブリックベータとして誰でも利用できるようになっています。

インストール

Docker for Macインストーラは以下のURLからdmgパッケージでダウンロードできます。

https://docs.docker.com/docker-for-mac/

インストーラを実行すると、Mac OS Xのアプリケーション"Docker.app"をインストールするように促されますので、 ドラッグ&ドロップでインストールします。

f:id:paiza:20160406131937p:plain

Docker Toolboxをインストールしている場合、コンテナの移行もできます。

f:id:paiza:20160406132010p:plain

インストールができたら、Dockerアイコンがメニューバーに登録されました。Virtual Box等のインストールは必要ありません。

f:id:paiza:20160406132023p:plain

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"で接続するように変更になりました。)

f:id:paiza:20160406132140p:plain

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)で終了できます。

https://beta.docker.com/docs/

まとめ

Docker for Macを使うことでMac上でのDockerの利用が非常に簡単になっており、より手軽に利用することができるようになっています。現在プライベートベータ版ですが利用できるようになりましたら是非使ってみてください。


追記: Dockerの書籍『Docker実戦活用ガイド』を書きました。全体を通して、Docker for Macを利用できるようになっています(Docker for Macのインストール方法もあります)。よろしければ手に取ってみてください。

paiza.hatenablog.com


2016/6/21 更新: Docker for Macがプライベートベータからパブリックベータになりました。


関連記事:


paizaではITエンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供(こちらは21言語に対応)しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp