ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

Dockerコンテナに固定IPを振る

お疲れ様です。伊藤です。

今回は前回お伝えしたようにDockerについて書こうかと思います。 以前、Dockerコンテナって何?というような記事(Dockerコンテナの概要 - ときどきAnsible日記)を書きましたが、今回は実際にコンテナを使用するのにあたり、コンテナに固定IPを振って仮想マシンのように使えるようになるまでの記事を書こうと思います。今回ちょっとした環境を作成する際にDockerを使用したのですが、意外と固定IPでコンテナを作成するという記事が少なかったので、書いてみようかと。

そもそもDockerを使ってコンテナを作成した場合は、Dockerのインストール時に自動で作成された内部ネットワークに紐づいたIPが振られます。デフォルトの場合はdocker0と表示されているブリッジに紐づいたネットワークのIPアドレスが自動付与されます。同じdocker0に接続されているコンテナ同士はコンテナに自動付与されたIPを使って通信ができます。

しかし、docker0のネットワークは外部のネットワークから独立したものであり、外部ネットワーク側からコンテナのIPに直接アクセスすることはできません。もちろんコンテナはポートで制御されているためポートフォワーディングしたり色々頑張ると接続することはできます。が、今回はそんなことはあまり考えずにコンテナに固定IPを振って外部ネットワークからアクセスできるようにしたい!というのがやりたいことになります。

f:id:pj_doaa:20190904140329p:plain
今回やりたいこと

で、先ほどあまりこの手の記事が無いと書きましたがこの環境を実現するためにこちらの記事を参考にさせて頂きました。

ritei91.blog.fc2.com

もうほぼほぼこちらの記事通りで出来てしまいますが、環境作成の上で行ったことなどを記載していきます。 下記が今回最終的に作成する環境です。ネットワーク体系はコンテナと外部ネットワークで同じものとして、ホストOSのNICとbr0のブリッジを接続します。

f:id:pj_doaa:20190905100253p:plain
今回作成する環境

brctlインストール

ブリッジの操作を行うため事前にbrctlをインストールしておきます。

# yum install -y bridge-utils

ホストサーバのIPを削除

作業時点ではNICにIPが振られていますが、ブリッジにIPを振ってNICに接続するため、NICからIPを削除します。Teratermなんかで作業しているとIPを消した瞬間作業できなくなりますので、コンソールから作業してください。

サーバのIP確認
# ip addr show dev ens33
    inet 192.168.0.1
# ip route
default via 192.168.0.1 dev ens33
IP削除

ens33のIPと、それに関わるルーティングを消しておきます。

# ip route del default 
# ip addr del 192.168.0.1/24 dev ens33

bridge作成

Dokcerネットワークとbridge作成

dockerで、Dockerネットワークshared_nwとbridgeインターフェース br0 を作成します。bridgeのgwはホストOSのIPアドレスである192.168.0.1になります。

# docker network create \
    --driver bridge \
    --subnet=192.168.0.0/24 \
    --gateway=192.168.0.1 \
    --opt "com.docker.network.bridge.name"="br0" \
    shared_nw
bridge確認

ブリッジインターフェースbr0が作られているはず。

# ip addr show br0
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
~中略~
    inet 192.168.0.1/24 brd 192.168.0.255 scope global br0
bridge接続

ホストのNICとブリッジを接続します。これでTeratermなどで接続可能になります。

# brctl addif br0 ens33

接続後はこのような状態になります。IPはbr0に付与されていてens33はbr0に接続されている状態です。

# ip addr show
~中略~
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
~中略~
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
~中略~
    inet 192.168.0.1/24 brd 192.168.0.255 scope global noprefixroute br0
スタティックルート追加
# ip route add default via 192.168.0.1

下記コマンドで確認

# ip route
default via 192.168.0.1 dev br0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.1

IP指定コンテナ作成

あとは下記コマンドのようにIPとネットワークを指定してやれば固定IPのコンテナが作成できます。

# docker run -d --privileged \
       -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
       --name 【コンテナ名】 \
       --net shared_nw \
       --ip 192.168.0.101 \
       【イメージ名】 /sbin/init

今回はここまでです。お疲れ様でした。