Docker
centos7

コンテナに固定IPを割り振って外部からアクセスする

More than 3 years have passed since last update.

dockerのネットワークはそのままでは固定IPを使う事が出来ない。

それじゃ我慢ならないからコンテナに固定IPを割り振って

外部からアクセスするまでをまとめている。

ホストがCentOS7のお話。


現在のイメージ

当たっているか自信ないけどdockerをインストールした後の

ネットワークをイメージ化するとこんな感じになっているんじゃないかと思う。

nw2.png


完成予想図

仮想ブリッジを立てて、その配下にコンテナがぶら下がるイメージ。

元々あった物理NICのeno1は自分以外のフレームも全て取り込む、

とにかく届いたフレームを全て仮想ブリッジであるbr0に送り届けるだけの人になってもらう。

(完成イメージ)

nw.png


仮想ブリッジ作成

仮想ブリッジbr0を作成します。

nmcli con add type bridge ifname br0            # 仮想ブリッジbr0を作成する

nmcli con modify bridge-br0 bridge.stp no # STPはじゃべるな
nmcli con modify bridge-br0 ipv4.method manual ipv4.address "192.168.1.0/24 192.168.1.1" ipv4.dns 192.168.1.254 # IPの設定


物理NICの接続

仮想ブリッジbr0に物理NICのeno1を接続する。

以下をやれば接続されるらしい。俺の環境では接続されなかったぽいけど。

nmcli con add type bridge-slave ifname eno1 master bridge-br0

eno1の設定は消させてもらう。

何しろ受信したフレームを何も考えずにbr0に届けさえすれば良いんだから。

nmcli con modify eno1 ipv4.dns "" ipv4.addresses "" ipv4.method disable

NetworkManagerを再起動して設定反映する。

本当なら以下で反映されるっぽい。俺の環境では反映されなかったけど。

マシン自体を再起動したら仮想ブリッジの設定は反映された。

systemctl restart NetworkManager

仮想ブリッジbr0に物理NICのeno1を接続する。

マシンを再起動してもeno1とbr0は接続されなかったみたいだからbrctlで接続を試みる。

yum install bridge-utils

brctl addif br0 eno1
brctl show


コンテナのNICと仮想ブリッジを接続

pipeworkってのがあるらしいよ。何やってるかはココが解かりやすかったです。

pipeworkの導入

cd /usr/local/src

git clone https://github.com/jpetazzo/pipework.git
ln -sv /usr/local/src/pipework/pipework /usr/local/bin/

コンテナにeth1を追加してbr0に接続させる。

pipework br0 コンテナID 192.168.1.2/24


コンテナ側の設定

固定IPは割り振られた。だけどもまだ外から接続出来ないと思う。

コンテナに入ってちょいちょいと設定を行う。

nsenter -t $(sudo docker inspect --format '{{.State.Pid}}' コンテナ名) -m -u -i -n -p /bin/sh  # 起動しているコンテナに入る

ifdown eth0 # docker0との関係は断ち切ってしまおう。
route add default gw 192.168.1.254 # デフォルトゲートウェイの設定。ホストと同じで。

あとはコンテナでsshdとか起動すれば外部から192.168.1.2にsshでアクセスできるはず。