Docker を使って何らかのサービスを提供するには当然ながら外部からアクセスする必要がある。
今回は Docker 組み込みの機能を使ってコンテナに外部からアクセスする方法を試してみる。
今回使った環境は以下の通り。
$ cat /etc/redhat-release CentOS release 6.5 (Final) $ uname -r 2.6.32-431.11.2.el6.x86_64
$ 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
$ sudo docker run -i -p 8080:80 -t centos /bin/bash
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
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
$ 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)
$ brctl show bridge name bridge id STP enabled interfaces docker0 8000.fecd1ef7368a no vethoBfYg0
$ wget -q -O - http://172.17.0.2/ Hello, World!!上手くいった。 とはいえ、この IP アドレスはあくまでコンテナを起動しているホスト内に閉じたものだ。 外部からここに直接アクセスすることはできない。
$ 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やっぱりね。
$ wget -q -O - http://localhost:8080/ Hello, World!!ばっちり。 あとはコンテナを起動するホストに外部からアクセスを受け付けることのできる IP アドレスを振れば OK ということか。