CUBE SUGAR STORAGE

技術系のことかきます。
Recent Tweets @

Docker を使って何らかのサービスを提供するには当然ながら外部からアクセスする必要がある。 今回は Docker 組み込みの機能を使ってコンテナに外部からアクセスする方法を試してみる。

今回使った環境は以下の通り。

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
$ uname -r
2.6.32-431.11.2.el6.x86_64

EPEL から Docker をインストールする。
$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum -y install docker-io
$ sudo service docker start
$ sudo chkconfig docker on
$ docker --version
Docker version 0.9.0, build 2b3fdf2/0.9.0

早速コンテナを起動する。 このとき -p オプションを指定することでコンテナにポートフォワーディングでアクセスできるようになる。 この例ではコンテナを起動するホストの 8080 ポートとコンテナの 80 ポートを対応付けている。
$ sudo docker run -i -p 8080:80 -t centos /bin/bash

コンテナ内に Apache httpd をインストールしてダミーのファイルを設置する。
bash-4.1# yum -y install httpd
bash-4.1# service httpd start
bash-4.1# cat << EOF > /var/www/html/index.html 
Hello, World!!
EOF

ついでに、コンテナに付与されている IP アドレスを確認しておく。
bash-4.1# ip addr show | grep inet
    inet 172.17.0.2/16 scope global eth0
    inet6 fe80::2437:97ff:fe77:dd3f/64 scope link 
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 

少し蛇足になるけどホスト側に戻ってネットワーク構成を確認してみる。 docker0 という Linux ブリッジがコンテナの持つ IP アドレスと同じプレフィックスが付与されて存在している。 これが怪しい。
$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr FE:CD:1E:F7:36:8A  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::60a7:64ff:fe31:4928/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16499 errors:0 dropped:0 overruns:0 frame:0
          TX packets:39474 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:706983 (690.4 KiB)  TX bytes:56197495 (53.5 MiB)

接続状況を見ると、どうやら Virtual Ethernet Device が刺さっている。 この片割れがコンテナの中にあるインターフェースということか。
$ brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.fecd1ef7368a	no		vethoBfYg0

ひとまずコンテナの持つ IP アドレスも確認できたので wget を使ってアクセスしてみる。
$ wget -q -O - http://172.17.0.2/
Hello, World!!
上手くいった。 とはいえ、この IP アドレスはあくまでコンテナを起動しているホスト内に閉じたものだ。 外部からここに直接アクセスすることはできない。

ここで以前のオペレーションを思い出すと、そういえばポートフォワーディングでホストとコンテナのポートを対応付けていた。 どうせ Linux だから iptables の NAT だろ、と当たりを付けて調べてみる。
$ sudo iptables -t nat -L -n | grep 80
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 to:172.17.0.2:80 
やっぱりね。

自身の 8080 ポート宛にアクセスしてみる。
$ wget -q -O - http://localhost:8080/
Hello, World!!
ばっちり。 あとはコンテナを起動するホストに外部からアクセスを受け付けることのできる IP アドレスを振れば OK ということか。

んー、このままだと UDP とか ICMP がコンテナ内に届かないのでは?というのは気になるけど、ひとまずこんなところで。
  1. sibukixxx reblogged this from momijiame
  2. askmt reblogged this from momijiame
  3. momijiame posted this