Thursday, June 19, 2014

docker 1.0, OSX mavericks

docker 1.0, OSX mavericks


今更だけどdockerという面白そうなLinux OSコンテナがある。最近1.0が出たので色々と試してみる。どこぞの外人さんが「dockerの利点としてカーネルの名前空間を区切る事で隔離された環境を形成、full VMと違ってメモリを大量確保しないから、極端な話、1000VM同時に立ち上げることができるよ」(stackoverflow)って書いてたけど、本当にそんなこと出来るのか...

dockerインストール

まずは本家サイトを見ながらインストールを試してみる.

  • OSX installerをダウンロード
  • インストール時の選択肢は全部デフォルト
  • 続いてLaunchpadからboot2dockerを実行
    • 自動で仮想ネットワークでバイスと仮想マシンのイメージを作り始めた.※1
  • 続いてコンテナ上でhello worldを実行させる
    • イメージダウンロードしてないんだけど動くの?と思っていたらコマンド打った瞬間にダウンロードを始めるdockerさん. ありがたいような、ありがたくないような.※2


※1
インストール時のメッセージ.

2014/06/20 00:21:35 To connect the Docker client to the Docker daemon, please set:
2014/06/20 00:21:35     export DOCKER_HOST=tcp://:2375

上の気になったのでインストール後のDOCKER_HOSTの値を見てみる.

imac:~ yukaary$ echo $DOCKER_HOST
tcp://192.168.59.103:2375

ポート番号は合ってる,

※2
最初のdockerコマンド実行時の出力.

imac:~ yukaary$ docker run ubuntu echo hello world
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
e54ca5efa2e9: Download complete
511136ea3c5a: Download complete
d7ac5e4f1812: Download complete
2f4b4d6a4a06: Download complete
83ff768040a0: Download complete
6c37f792ddac: Download complete
hello world


インストール後の確認

ubuntuのバージョン

インタラクティブモードでコンテナの中に入ってダウンロードされたコンテナイメージのubuntuバージョンを確認.

imac:~ yukaary$ docker run -t -i ubuntu /bin/bash
root@99f23ba9e0eb:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

14.04!一番新しいバージョンじゃまいか.
ホスト側から現存するイメージをリストアップさせる. 先ほどダウンロードしたubuntuが1つ.
imac:~ yukaary$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              e54ca5efa2e9        17 hours ago        276.5 MB
 そもそもこのコンテナイメージはどこに配置されてる?と思ってdocker infoしてみる
imac:~ yukaary$ docker info
Containers: 2
Images: 6
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Dirs: 10
Execution Driver: native-0.2
Kernel Version: 3.14.1-tinycore64
Debug mode (server): true
Debug mode (client): false
Fds: 10
Goroutines: 11
EventsListeners: 0
Init Path: /usr/local/bin/docker

Root Dir: /mnt/sda1/var/lib/docker/aufsとかないんだけど...と色々調べた結果、docker本体はVirtualBoxが実行しているboot2docker-vmという名前の仮想マシンの中にいることが分かる 「dockerインストール」のところでboot2dockerをインストールしていたときに自動で生成された模様...

  • Vagrant用にVirtualBoxをインストールしていたためか、エラーも無くいつの間にか 作られていたorz


boot2docker sshでboot2docker-vmの中に入りRootDirが存在することを確認.

imac:~ yukaary$ boot2docker ssh
Warning: Permanently added '[localhost]:2022' (RSA) to the list of known hosts.
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 1.0.0
master : 16013ee - Mon Jun 9 16:33:25 UTC 2014
docker@boot2docker:~$ ls /mnt/sda1/var/lib/docker/aufs/
diff/ layers/ mnt/
docker@boot2docker:~$ ifconfig
...
eth1      Link encap:Ethernet  HWaddr 08:00:27:1C:12:2F
          inet addr:192.168.59.103  Bcast:192.168.59.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe1c:122f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:515 errors:0 dropped:0 overruns:0 frame:0
          TX packets:441 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:41764 (40.7 KiB)  TX bytes:96333 (94.0 KiB)



boot2docker-vm上でifconfigした時のeth1のIPアドレスがホストマシンで「echo $DOCKER_HOST」したときのIPアドレスと一致しているから、そういうことなのね...


この場合、dockerをデーモンモードで起動したときのプロセスはホストマシン、boot2docker-vmのどちらに作られる?

ホストマシンで探してみる(いい加減)
imac:~yukaary$ ps aux | grep docker
youichir         1564   0.3  0.0  2442000    624 s003  S+    1:08AM   0:00.01 grep dodcker.
うーん、いない。boot2docker-vmは?

docker@boot2docker:~$ ps aux | grep docker
  913 root     /usr/local/bin/docker -d -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2375
...
やっぱりこっちか. 前に試した時はホストマシンで直接dockerが動いていた気がするんだけどなぁ.  VM on VMじゃないからまあいいか...性能を気にする場合はKVM上でdockerを動かせたほうがいいかも.

よーし、じゃあ後はただひたすら「hello world」を出力し続けるだけのコンテナを1000個立てちゃうぞー.

すくりぷと.
#bin/bash
for i in `seq 1 1000`
do
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
done

実行前のメモリ使用率.

docker@boot2docker:~$ free
             total         used         free       shared      buffers
Mem:       1024976       631448       393528            0        15436
-/+ buffers:             616012       408964
Swap:       194000            0       194000


実行時、凄い勢いでコンテナが立ち上がっていくが、コンテナ数が100いかないうちにだんだん遅くなってくる.

ちなみになんかこんなエラーが複数回出てたり.

  •  IDだか名前(明示的に指定しない場合はランダムに設定されてる)だかが被ったかな? 
2014/06/20 01:31:30 Error: Cannot start container ebeaba1c9464ffd101a78e80b609bf04c743ade4255277d38b51282581402352: file exists

そのうち全部エラーになった. しかも止まらん...。ファイルを開き過ぎって言われてるからなんかのパラメータいじれば直るかなぁ.

2014/06/20 01:36:40 Error: open /mnt/sda1/var/lib/docker/aufs/layers/e54ca5efa2e962582a223ca9810f7f1b62ea9b5c3975d14a5da79d3bf6020f37: too many open files
2014/06/20 01:36:40 Error: open /mnt/sda1/var/lib/docker/aufs/layers/e54ca5efa2e962582a223ca9810f7f1b62ea9b5c3975d14a5da79d3bf6020f37: too many open files
2014/06/20 01:36:41 Error: open /mnt/sda1/var/lib/docker/aufs/layers/e54ca5efa2e962582a223ca9810f7f1b62ea9b5c3975d14a5da79d3bf6020f37: too many open files
2014/06/20 01:36:41 Error: open /mnt/sda1/var/lib/docker/aufs/layers/e54ca5efa2e962582a223ca9810f7f1b62ea9b5c3975d14a5da79d3bf6020f37: too many open files

この時のコンテナ数をboot2docker側でカウント.
docker@boot2docker:~$ docker ps | wc -l
252
250個くらい.この時のfreeの結果.
docker@boot2docker:~$ free
             total         used         free       shared      buffers
Mem:       1024976       942604        82372            0        88060
-/+ buffers:             854544       170432
Swap:       194000         2448       191552


実行前とメモリ量の差分が300MBくらいだから大雑把にコンテナ1つあたりのメモリ使用量は1.2MBくらいだろうか? 単に「hello world」してるだけなんだけど...。

立ち上げたコンテナを一括で停止するコマンド.

これでおっけい. ちなみに開始するのは早いけど止まるのは遅いorz
imac:~yukaary$docker stop $(docker ps -a -q)


  • 今度はapache, sshd, mysqldなどを動かした環境で同じ実験をしてみる.
  • 仮想マシンboot2dockerのメモリは2Gまで増やす.
  • file exists, too many open filesエラーの原因を調べる.

1 comment:

  1. >too many open files
    解決方法らしきものを発見: https://groups.google.com/forum/#!topic/docker-user/k5hqpNg8gwQ

    ReplyDelete