Dockerコンテナ間の通信(Link Container)をboot2dockerで試す
※ internal container connectionは標準でONでした。誤り修正
業務には利用してませんがDocker楽しいです。 AIX6.1Lで導入されたWPARに触れた時のような楽しさを感じています。
さてDockerで起動したコンテナ同士で通信したいケースがあると思います。
Link Containerという機能らしいです。
OS Xで稼働するboot2dockerで試してみました。
- boot2docker内のDockerデーモン設定
Docker起動時にInter-container communicationフラグ(-icc=false)をOFFにすると
Linkオプションで指定したコンテナ同士だけで通信できるようになるみたいです。
英語がさっぱりわからん!
orenomac$ boot2docker start [2014-03-08 02:28:41] Starting boot2docker-vm... orenomac$ boot2docker ssh docker@localhost's password: ## . ## ## ## == ## ## ## ## === /""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| boot2docker: 0.6.0 docker@boot2docker:~$ sudo vi /usr/local/etc/docker-daemon #!/bin/sh #/usr/local/bin/docker -d -D > /var/lib/boot2docker/docker.log 2>&1 & /usr/local/bin/docker -d -D -icc=false -g /mnt/sda1/var/lib/docker \ -H unix:// -H tcp://0.0.0.0:4243 > /var/lib/boot2docker/docker.log 2>&1 & docker@boot2docker:~$ sudo /usr/local/etc/docker-daemon [2014-03-08 02:31:43] Suspending boot2docker-vm... 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% orenomac$ boot2docker restart [2014-03-08 02:31:53] Starting boot2docker-vm... orenomac$ docker info Containers: 56 Images: 33 Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs Dirs: 145 Debug mode (server): true Debug mode (client): false Fds: 11 Goroutines: 13 Execution Driver: lxc-0.8.0 EventsListeners: 0 Kernel Version: 3.13.3-tinycore64 Init Path: /usr/local/bin/docker orenomac$ boot2docker ssh ps|grep docker docker@localhost's password: 537 docker -sh 934 root /usr/local/bin/docker -d -D -icc=false -g /mnt/sda1/var/lib/docker -H unix:// -H tcp://0.0.0.0:4243
- sshサーバの準備
名前付きコンテナとして起動します。
今回利用したイメージ(centos:6.4)には既にopenssh-serverとopenssh-clientがインストールされており、rootユーザがパスワード認証でログインできるように設定してあります。
orenomac$ docker run -d -t -p 49222:22 -name sshserver centos:6.4 /usr/sbin/sshd -D a8ebc367d5c4ee2fc933eab5c9f6cce2c1b48e179b21ca9204feada618938430 orenomac$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a8ebc367d5c4 centos:6.4 /usr/sbin/sshd -D 40 seconds ago Up 3 seconds 0.0.0.0:49222->22/tcp sshserver1
- sshクライアント用コンテナの準備
sshクライアント用コンテナを起動します。
Linkオプションを指定して、通信を許可するコンテナ名を指定します(コンテナ名:任意のタグ名)
コンテナ内でenvを実行すると通信可能なコンテナのIPとポート,プロトコルが環境変数で設定されています。
orenomac$ docker run -t -i --link sshserver:sshtarget -name sshclient centos:6.4 /bin/bash bash-4.1# env HOSTNAME=0f6aa7cf1a1d TERM=xterm SSHTARGET_PORT_22_TCP=tcp://172.17.0.2:22 SSHTARGET_PORT=tcp://172.17.0.2:22 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ SSHTARGET_NAME=/sshclient/sshtarget SSHTARGET_PORT_22_TCP_ADDR=172.17.0.2 SHLVL=1 HOME=/ SSHTARGET_PORT_22_TCP_PORT=22 container=lxc SSHTARGET_PORT_22_TCP_PROTO=tcp _=/usr/bin/env
Dockerコンテナプロセスはこのようになっています。
orenomac$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f6aa7cf1a1d centos:6.4 /bin/bash 5 minutes ago Up 4 minutes sshclient 59a359f77bca centos:6.4 /usr/sbin/sshd -D 5 minutes ago Up 5 minutes 0.0.0.0:49222->22/tcp sshclient/sshtarget,sshserver
- 実験
sshクライアント用コンテナよりsshサーバ(SSHTARGET_PORT=tcp://172.17.0.2:22)へ接続を試みます
bash-4.1# hostname 0f6aa7cf1a1d←sshクライアント用コンテナのホスト名 bash-4.1# ssh 172.17.0.2 The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established. DSA key fingerprint is 4a:4f:17:ff:24:9f:65:b8:fc:a3:5a:b7:56:9d:d5:ca. Are you sure you want to continue connecting (yes/no)? yes -bash-4.1# hostname 59a359f77bca←sshサーバ用コンテナのホスト名 -bash-4.1# env|grep SSH ※コネクションが張られてる SSH_CLIENT=172.17.0.3 50470 22 SSH_TTY=/dev/pts/0 SSH_CONNECTION=172.17.0.3 50470 172.17.0.2 22
sshクライアント用コンテナからファイルをコピーしてみます。
bash-4.1# dd if=/dev/zero of=/tmp/zero.file bs=1024k count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 0.52691 s, 199 MB/s bash-4.1# scp -P22 /tmp/zero.file 172.17.0.2:/tmp/zero.file.`hostname` root@172.17.0.2's password: zero.file 100% 100MB 50.0MB/s 00:02 bash-4.1# ssh 172.17.0.2 ls -l /tmp root@172.17.0.2's password: total 102400 -rw-r--r-- 1 root root 104857600 Mar 7 13:10 zero.file.0f6aa7cf1a1d←コピーできた bash-4.1# scp 172.17.0.2:/tmp/zero.file.0f6aa7cf1a1d . root@172.17.0.2's password: zero.file.0f6aa7cf1a1d 100% 100MB 33.3MB/s 00:03 ←もちろん逆も可能
中々便利な機能だと思います。