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