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

dockerコンテナに外部からアクセスできるIPアドレスを割り当てる - kubotti’s memo
でCentOS6でやったことをCentOS7でもやってみる。

環境

ホストOS:Ubuntu 10.04.4 LTS
VM:KVM

$ virsh version
Compiled against library: libvir 0.7.5
Using library: libvir 0.7.5
Using API: QEMU 0.7.5
Running hypervisor: QEMU 0.12.3

VMのネットワーク接続方法:後で調べる。たぶん仮想ブリッジ。
ゲストOS:CentOS Linux release 7.1.1503 (Core)
ゲストOSに入れたdocker:Docker version 1.8.2, build bb472f0/1.8.2

ゲストOSのIPアドレスは、192.168.3.57
ホストOSのIPアドレスは、特に関係ないけど、192.168.2.40

この環境で、192.168.2.0/23の他のPCからアクセス可能なdockerコンテナを作る。
サブネットマスクが23なので、255.255.254.0のネットワーク。(192.168.2.0 - 192.168.3.255まで)
IPアドレスを192.168.3.58にする、というか、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

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

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

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

docker attach webapp1

コンテナ内のCentOSで実行

yum install wget
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
yum install initscripts
yum install openssh-server

service sshd start
yum install passwd
yum install openssh-clients

cd /etc/ssh/
cp sshd_config sshd_config.20151106
vi sshd_config
# add
PermitRootLogin  yes
# change
UsePAM no
#UsePAM yes
service sshd start   

rootのパスワード設定。

passwd

dockerのホストからsshできるか確認。

ssh root@172.17.0.1

デタッチ

How do you attach and detach from Docker's process? - Stack Overflow
Ctrl + p
Ctrl + q
でdockerコンテナを終了させずにデタッチ。

ネットワーク設定

KVM上のCentOS7(dockerホスト)上で、以下のコマンドを実行。

firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING_direct 0 -d 192.168.3.58 -j DNAT --to 172.17.0.1  
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER 0 -d 172.17.0.1 -p 80 -j ACCEPT
ip addr add 192.168.3.58/23 brd 192.168.3.255 dev eth0  

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

systemctl restart firewalld

firewall-cmdコマンドに --permanent を付けると、どこかに保存される。

CentOS7 第4回 はじめての firewalld で作る Linuxルータ – CLARA ONLINE techblog

ウェブサーバーの設定

dockerのゲスト(コンテナ)で実行。

yum install httpd
service httpd start
vi /var/www/html/index.html

vi でindex.htmlを作って何か書く。

接続を試す

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

メモ

dockerコンテナ一覧

起動中のみ

docker ps

すべて表示

docker ps -a
dockerイメージ作成
docker commit -m "something comment" <CONTAINER ID> <イメージの名前>:<タグ>
docker commit -m "something comment" <CONTAINER ID> <イメージの名前>
dockerイメージ一覧
docker images
dockerイメージの削除
docker rmi <イメージ名>
iptablesルール削除
firewall-cmd --permanent --direct --remove-rule ipv4 nat PREROUTING_direct 0 -d 192.168.3.58 -j DNAT --to 172.17.0.3  

RHEL7: How to get started with Firewalld. - CertDepot

↓は、sytemctl restart firewalld で元に戻ってしまう。

iptables -t nat -D PREROUTING_direct 1
dockerのローカルipを固定する

docker固定IP - Qiita