orenoblog

エンジニアになりたいExcel方眼紙erの物語

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 ←もちろん逆も可能

中々便利な機能だと思います。