Dockerコンテナに固定IPを振る
お疲れ様です。伊藤です。
今回は前回お伝えしたようにDockerについて書こうかと思います。 以前、Dockerコンテナって何?というような記事(Dockerコンテナの概要 - ときどきAnsible日記)を書きましたが、今回は実際にコンテナを使用するのにあたり、コンテナに固定IPを振って仮想マシンのように使えるようになるまでの記事を書こうと思います。今回ちょっとした環境を作成する際にDockerを使用したのですが、意外と固定IPでコンテナを作成するという記事が少なかったので、書いてみようかと。
そもそもDockerを使ってコンテナを作成した場合は、Dockerのインストール時に自動で作成された内部ネットワークに紐づいたIPが振られます。デフォルトの場合はdocker0と表示されているブリッジに紐づいたネットワークのIPアドレスが自動付与されます。同じdocker0に接続されているコンテナ同士はコンテナに自動付与されたIPを使って通信ができます。
しかし、docker0のネットワークは外部のネットワークから独立したものであり、外部ネットワーク側からコンテナのIPに直接アクセスすることはできません。もちろんコンテナはポートで制御されているためポートフォワーディングしたり色々頑張ると接続することはできます。が、今回はそんなことはあまり考えずにコンテナに固定IPを振って外部ネットワークからアクセスできるようにしたい!というのがやりたいことになります。
で、先ほどあまりこの手の記事が無いと書きましたがこの環境を実現するためにこちらの記事を参考にさせて頂きました。
もうほぼほぼこちらの記事通りで出来てしまいますが、環境作成の上で行ったことなどを記載していきます。 下記が今回最終的に作成する環境です。ネットワーク体系はコンテナと外部ネットワークで同じものとして、ホストOSのNICとbr0のブリッジを接続します。
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
今回はここまでです。お疲れ様でした。