CentOS6.6でDockerコンテナに固定IPアドレスを付けホストと同じネットワークで使う

実施したい事

git上の複数ブランチへのPushタイミングで都度クリーンな環境を作成しユニットテストを実施したい!

サーバスペックの不足もあり、現在開発中のアプリケーションのユニットテストが1時間弱掛かるようになってきた
及び現状では Develop ブランチにしか ユニットテストを通せていないので、改善する。
 
2CPU/16Thread / SSD RAID の強力スペックなサーバが転がっていたので再活用がてら
Dockerの力を借りて並列でユニットテストを実施出来る環境を作る方針としました。
 
ホストサーバと同じネットワークに個別のIPを持つコンテナを立てたかったのですが
標準ではIPアドレスが割り当てられないため使い勝手が悪いので色々と試してみた結果
自前でネットワーク設定をごりごりと行う方式で成功したので書き留めます。
(当初はpipeworkを利用してチャレンジしましたが失敗/断念)
 

前提条件

  • Dockerは既にインストール済みとします
  • ホストサーバには NICが一枚でeth0 にてネットワークに接続している状態とします
     
    OS : CentOS 6.6
    Docker : 1.5
    を利用しました
     

作成する環境

Docker_network

ネットワーク

ネットワーク : 172.16.0.0/16
ゲートウェイ : 172.16.255.254
ブロードキャスト : 172.16.255.255

ホストサーバのIP

ホストサーバ : 172.16.21.110

コンテナサーバのIP

コンテナサーバ1 : 172.16.21.111
コンテナサーバ2 : 172.16.21.112

 

作業手順

Dockerのオプション設定を追加 & リスタート

Dockerサービス起動時のオプションにてコンテナエンジンをLXCにする
また追加でブリッジを作成しないようにする。

/etc/sysconfig/docker の other_args指定に “-e lxc -b none” を追加

other_args="-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -e lxc -b none"

docker サービスのリスタート

# /etc/init.d/docker restart

 

ネットワーク設定を変更

br0の設定 (新規作成)

下記パスでファイルを作成
/etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=static
IPADDR=172.16.21.110
GATEWAY=172.16.255.254
BROADCAST=172.16.255.255
NETMASK=255.255.0.0
DNS1=8.8.8.8

eth0の設定

下記パスのファイルを編集
/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
BRIDGE=br0

ネットワーク再起動&確認

br0 が作成され eth0 と紐付いている事を確認

# /etc/init.d/network restart

# ifconfig
br0       Link encap:Ethernet  HWaddr ...
          inet addr:172.16.21.110  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::221:9bff:fea5:a297/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:379681 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4779 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:32676144 (31.1 MiB)  TX bytes:1730384 (1.6 MiB)

eth0      Link encap:Ethernet  HWaddr ...
          inet6 addr: fe80::221:9bff:fea5:a297/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:419019 errors:0 dropped:0 overruns:0 frame:0
          TX packets:31747 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:91575640 (87.3 MiB)  TX bytes:3767051 (3.5 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2026 (1.9 KiB)  TX bytes:2026 (1.9 KiB)

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.00219ba5a297       no              eth0

 

確認項目

フォワーディング設定の確認

# cat /proc/sys/net/ipv4/ip_forward
1

1でなければ /etc/sysctl.conf の net.ipv4.ip_forward = 1 として保存 & 再起動

iptablesサービスの動作状態確認

iptablesサービスの自動起動が無効である事を確認
及び下記項目が 0である事を確認
※起動していたら落とす

# chkconfig --list | grep tables
ip6tables       0:off   1:off   2:off   3:off   4:off   5:off   6:off
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off

# sysctl -p /etc/sysctl.conf | grep tables
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
...

 

Dockerコンテナの起動

コンテナサーバ1の起動

docker run -i -t \
  \
  --net=none \
  --lxc-conf='lxc.network.type=veth' \
  --lxc-conf='lxc.network.ipv4=172.16.21.111/16' \
  --lxc-conf='lxc.network.ipv4.gateway=172.16.255.254' \
  --lxc-conf="lxc.network.link=br0" \
  --lxc-conf='lxc.network.name=eth0' \
  --lxc-conf='lxc.network.flags=up' \
  [起動したいイメージ名] /bin/bash

コンテナサーバ2の起動

docker run -i -t \
  \
  --net=none \
  --lxc-conf='lxc.network.type=veth' \
  --lxc-conf='lxc.network.ipv4=172.16.21.112/16' \
  --lxc-conf='lxc.network.ipv4.gateway=172.16.255.254' \
  --lxc-conf="lxc.network.link=br0" \
  --lxc-conf='lxc.network.name=eth0' \
  --lxc-conf='lxc.network.flags=up' \
  [起動したいイメージ名] /bin/bash

コンテナ動作状態確認

docker run 実行時に指定した IPアドレスが付いている事を確認できます。

# docker attach [CONTAINER ID]

# ps axufww
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  14728  1900 ?        S    02:17   0:00 /bin/bash
root        83  0.0  0.0 177340  3860 ?        Ss   02:20   0:00 /usr/sbin/httpd
apache      85  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      86  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      87  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      88  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      89  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      90  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      91  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
apache      92  0.0  0.0 177340  2472 ?        S    02:20   0:00  _ /usr/sbin/httpd
root        93  0.0  0.0  16624  1068 ?        R+   02:20   0:00 ps axufww

# ifconfig
eth0      Link encap:Ethernet  HWaddr ...
          inet addr:172.16.21.112  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::a46d:79ff:fe20:ea7e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1668 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:222716 (217.4 KiB)  TX bytes:468 (468.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

ホスト動作状態確認

docker ps

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7baceac4e139        kouzu/centos6:latest    "/bin/bash"         25 seconds ago      Up 25 seconds                           sharp_einstein
8a6311dbdbb0        kouzu/centos6:latest    "/bin/bash"         About an hour ago   Up About an hour                        determined_heisenberg

ifconfig

Dockerコンテナを新しくupする度に、コンテナ内のeth0と紐付いているvethが増えていきます

# ifconfig
br0       Link encap:Ethernet  HWaddr ...
          inet addr:172.16.21.110  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::221:9bff:fea5:a297/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:438360 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5828 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:38694111 (36.9 MiB)  TX bytes:1897818 (1.8 MiB)

eth0      Link encap:Ethernet  HWaddr ...
          inet6 addr: fe80::221:9bff:fea5:a297/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:477782 errors:0 dropped:0 overruns:0 frame:0
          TX packets:32808 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:98662682 (94.0 MiB)  TX bytes:3942965 (3.7 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2026 (1.9 KiB)  TX bytes:2026 (1.9 KiB)

vethI9CBVQ Link encap:Ethernet  HWaddr ...
          inet6 addr: fe80::fcc7:94ff:feb9:ee9f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:45980 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:468 (468.0 b)  TX bytes:5306478 (5.0 MiB)

vethS26JTK Link encap:Ethernet  HWaddr ...
          inet6 addr: fe80::fc57:a1ff:fee8:4ba/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:860 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:468 (468.0 b)  TX bytes:92100 (89.9 KiB)

ホストプロセスから見たコンテナの動作状況

上記を行う事でホストマシンからコンテナ、コンテナからホストマシン、コンテナから外部、外部からコンテナ
全てのネットワーク疎通を行う事が出来ました。

参考までにそれぞれのコンテナ内に httpdをインストールし起動すると下記のようになりました。

...
1906  0.0  0.1 978756 23736 ?        Sl   19:11   0:02 /usr/bin/docker -d -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -e lxc -b none
2681  0.0  0.0  23324  1284 pts/1    Ss   19:50   0:00  _ lxc-start -n 67ea4518852b068ee3db87285b582396e51f28a111f806009895b51c2c0f33ec -f /var/lib/docker/containers/67ea4518852b068ee3db87285b582396e51f28a111f806009895b51c2c0f33ec/config.lxc -- /.dockerinit -mtu 1500 -- /bin/bash
2689  0.0  0.0  14728  1908 pts/1    S+   19:50   0:00  |   _ /bin/bash
2821  0.0  0.0 177340  3860 ?        Ss   19:51   0:00  |       _ /usr/sbin/httpd
2823  0.0  0.0 177476  3068 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2824  0.0  0.0 177476  3068 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2825  0.0  0.0 177476  3068 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2826  0.0  0.0 177476  3068 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2827  0.0  0.0 177476  3068 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2828  0.0  0.0 177340  2472 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2829  0.0  0.0 177340  2472 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2830  0.0  0.0 177340  2472 ?        S    19:51   0:00  |           _ /usr/sbin/httpd
2874  0.0  0.0  23324  1284 pts/3    Ss   19:51   0:00  _ lxc-start -n f70b347e58489b5239f6fc6bd49e32189ecdf2bc81385bfdbb1bc6e933f16ca4 -f /var/lib/docker/containers/f70b347e58489b5239f6fc6bd49e32189ecdf2bc81385bfdbb1bc6e933f16ca4/config.lxc -- /.dockerinit -mtu 1500 -- /bin/bash
2882  0.0  0.0  14728  1904 pts/3    S+   19:51   0:00      _ /bin/bash
3057  0.0  0.0 177340  3856 ?        Ss   19:54   0:00          _ /usr/sbin/httpd
3059  0.0  0.0 177476  3064 ?        S    19:54   0:00              _ /usr/sbin/httpd
3060  0.0  0.0 177476  3064 ?        S    19:54   0:00              _ /usr/sbin/httpd
3061  0.0  0.0 177476  3064 ?        S    19:54   0:00              _ /usr/sbin/httpd
3062  0.0  0.0 177476  3064 ?        S    19:54   0:00              _ /usr/sbin/httpd
3063  0.0  0.0 177340  2468 ?        S    19:54   0:00              _ /usr/sbin/httpd
3064  0.0  0.0 177340  2468 ?        S    19:54   0:00              _ /usr/sbin/httpd
3065  0.0  0.0 177340  2468 ?        S    19:54   0:00              _ /usr/sbin/httpd
3066  0.0  0.0 177340  2468 ?        S    19:54   0:00              _ /usr/sbin/httpd
...

 

参考にした記事

下記を参考に設定できました、ありがとうございました。

  1. pipeworkを使わずにDockerコンテナに任意の固定IPアドレスを割り当てる
    http://qiita.com/yunano/items/456361aefb7a9935875f

  2. Dockerコンテナをブリッジ接続で使う
    http://www.agilegroup.co.jp/technote/docker-network-in-bridge.html

投稿者プロフィール

takashi
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。
個人ブログではRaspberryPiを利用したシステムやロボット作成も
実施しております。

スカイアーチネットワークスで一緒に働きましょう!

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。 個人ブログではRaspberryPiを利用したシステムやロボット作成も 実施しております。 スカイアーチネットワークスで一緒に働きましょう!