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そもそもこのコンテナイメージはどこに配置されてる?と思ってdocker infoしてみる
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest e54ca5efa2e9 17 hours ago 276.5 MB
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
...
よーし、じゃあ後はただひたすら「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 -l250個くらい.この時のfreeの結果.
252
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」してるだけなんだけど...。
立ち上げたコンテナを一括で停止するコマンド.
これでおっけい. ちなみに開始するのは早いけど止まるのは遅いorzimac:~yukaary$docker stop $(docker ps -a -q)
- 今度はapache, sshd, mysqldなどを動かした環境で同じ実験をしてみる.
- 仮想マシンboot2dockerのメモリは2Gまで増やす.
- file exists, too many open filesエラーの原因を調べる.
>too many open files
ReplyDelete解決方法らしきものを発見: https://groups.google.com/forum/#!topic/docker-user/k5hqpNg8gwQ