dockerコンテナに外部からアクセスできるIPアドレスを割り当てる

環境

ホストOS:Windows 10
VM:VirtualBox バージョン 5.0.8
VMのネットワーク:ブリッジアダプター
ゲストOS:CentOS release 6.7 (Final)
ゲストOSに入れたdocker:Docker version 1.7.1, build 786b29d/1.7.1

自宅LANのIPは、192.168.5.0/24
ゲストOSのIPアドレスは、192.168.5.200
ホストOSのIPアドレスは、特に関係ないけど、192.168.5.8

この環境で、192.168.5.0/24の他のPCからアクセス可能なdockerコンテナを作る。
IPアドレスを192.168.5.201にする、というか、iptablesのNAT機能で転送する。

docker imageの取得

ゲストOS(CentOS)で実行

docker pull centos:centos6

立ち上げ

docker run -d -it -p 50022:22 --hostname webapp1 --name webapp1 centos:centos6 /bin/bash
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
f69203eef2cf        centos:centos6      "/bin/bash"         58 seconds ago      Up 57 seconds       0.0.0.0:50022->22/tcp   webapp1

この時点のiptables -t nat -L コマンドの結果。

[root@localhost ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere            ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2          tcp dpt:ssh

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !loopback/8          ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere            tcp dpt:50022 to:172.17.0.2:22

2回目以降のコンテナの立ち上げ

docker ps -a
で停止中の一覧を取得して、
docker start webapp1
で起動。

コンテナ上のCentOSに最低限のソフトウェアをインストール

attachしてdockerコンテナのCentOSに入る

docker attach webapp1

コンテナ内のCentOSで実行

yum install wget

EPELリポジトリの設定

cd
mkdir rpm
cd rpm
wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm

serviceコマンドのインストール

yum install initscripts
yum install openssh-server

service sshd start

passwdコマンドとssh

yum install passwd
yum install openssh-clients

cd /etc/ssh/
cp sshd_config sshd_config.20151106

sshdの設定

vi sshd_config
# add
PermitRootLogin  yes
# change
UsePAM no
#UsePAM yes
service sshd start   

rootのパスワード設定。

passwd

VirtualBox上のCentOSからsshできるか確認。

ssh root@172.17.0.2

ネットワーク設定

VirtualBox上のCentOS(ゲストOS)上で、以下のコマンドを実行。

iptables -t nat -I PREROUTING -d 192.168.5.201 -i eth0 -j DNAT --to 172.17.0.1
ip addr add 192.168.5.201/24 brd 192.168.5.255 dev eth0

iptables -A DOCKER -d 172.17.0.1 -p tcp --dport 22 -j ACCEPT
iptables -A DOCKER -d 172.17.0.1 -p tcp --dport 80 -j ACCEPT

ip addr addコマンドでeth0に追加のIPアドレスを設定。
iptablesコマンドでNATのルーティング設定。
iptables -A DOCKERコマンドでTCPポートの許可設定。

接続を試す

確認用PCから、
http://192.168.5.201/ にアクセス。

課題・今後の修正

・コンテナを立ち上げただけだと、sshdが起動していない。
・コンテナを立ち上げ直すと172.17.0.1などのIPアドレスが変わる。
・dockerを動かしているOSからは192.168.5.201でアクセスできないようなので、iptablesの設定追加が必要。

・dockerコンテナでは、sshdを起動しない方がいいという記事があったので確認予定。
Dockerコンテナ内でsshdを実行してはいけない理由 | インフラ・ミドルウェア | POSTD


会社で試したら、CentOS 6ではdockerがうまく動かなかった。

CentOS7で試した結果。
dockerコンテナに外部からアクセスできるIPアドレスを割り当てる(CentOS 7) - kubotti’s memo