実施したい事
git上の複数ブランチへのPushタイミングで都度クリーンな環境を作成しユニットテストを実施したい!
サーバスペックの不足もあり、現在開発中のアプリケーションのユニットテストが1時間弱掛かるようになってきた
及び現状では Develop ブランチにしか ユニットテストを通せていないので、改善する。
2CPU/16Thread / SSD RAID の強力スペックなサーバが転がっていたので再活用がてら
Dockerの力を借りて並列でユニットテストを実施出来る環境を作る方針としました。
ホストサーバと同じネットワークに個別のIPを持つコンテナを立てたかったのですが
標準ではIPアドレスが割り当てられないため使い勝手が悪いので色々と試してみた結果
自前でネットワーク設定をごりごりと行う方式で成功したので書き留めます。
(当初はpipeworkを利用してチャレンジしましたが失敗/断念)
前提条件
- Dockerは既にインストール済みとします
- ホストサーバには NICが一枚でeth0 にてネットワークに接続している状態とします
OS : CentOS 6.6
Docker : 1.5
を利用しました
作成する環境
ネットワーク
ネットワーク : 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の起動
1 2 3 4 5 6 7 8 9 10 |
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の起動
1 2 3 4 5 6 7 8 9 10 |
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 ...
参考にした記事
下記を参考に設定できました、ありがとうございました。
-
pipeworkを使わずにDockerコンテナに任意の固定IPアドレスを割り当てる
http://qiita.com/yunano/items/456361aefb7a9935875f -
Dockerコンテナをブリッジ接続で使う
http://www.agilegroup.co.jp/technote/docker-network-in-bridge.html