Edited at

Dockerのネットワークをbridgeで外と繋げる

More than 3 years have passed since last update.

Dockerの1.10ではネットワークの機能にも大きな改善があったようで、Dockerコンテナのネットワークをbridgeで外と繋げることが簡単にできるようになっています。

参考に、下記のような構成を例にしてやり方を説明します。

Host
IP Address

MacBook
192.168.33.1

host1(VirtualBox)
192.168.33.10

container1
192.168.33.11

container2
192.168.33.12

container3
192.168.33.13


Vagrantfileを準備する

VirtualBox上にテスト用のVM(host1)を作ろうと思うのですが、bridgeが使えるようにするにはネットワークアダプターの選択肢をデフォルトから変更する必要があります。

Vagrantfileは下記のようになります。


Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.hostname = "host1"
config.vm.network "private_network", ip: "192.168.33.10"

config.vm.provider "virtualbox" do |v|
v.memory = "2048"
# ネットワークアダプタに変更を加える
v.customize ['modifyvm', :id, '--nictype1', 'Am79C973']
v.customize ['modifyvm', :id, '--nicpromisc1', 'allow-all']
v.customize ['modifyvm', :id, '--nictype2', 'Am79C973']
v.customize ['modifyvm', :id, '--nicpromisc2', 'allow-all']
end

# bridge-utilsをインストールする
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get -y install bridge-utils
SHELL
end


Dockerマシンを作る

# VMを立ち上げます

$ vagrant up

# VMをDockerマシンにします
$ docker-machine create \
--driver "generic" \
--generic-ip-address 192.168.33.10 \
--generic-ssh-user vagrant \
--generic-ssh-key .vagrant/machines/default/virtualbox/private_key \
--generic-ssh-port 22 \
host1


ブリッジdocker1とネットワークshared_nwを作る

# VMにログインします

$ vagrant ssh

# eth1のIPアドレスを削除します
$ sudo ip addr del 192.168.33.10/24 dev eth1

# "shared_nw"と"docker1"を作ってサブネットとゲートウェイを
# 設定します
$ sudo docker network create \
--driver bridge \
--subnet=192.168.33.0/24 \
--gateway=192.168.33.10 \
--opt "com.docker.network.bridge.name"="docker1" \
shared_nw

# docker1をeth1に接続します
$ sudo brctl addif docker1 eth1


Note: 本当はhost1にログインする際にdocker-machine ssh host1を使いたいところですが、eth1から192.168.33.10を一旦削除するので、接続が切れてしまわないようにeth0経由でログインするvagrant sshを使っています。



コンテナを作る

VMからログアウトしてMacBookに戻ります。それからDockerマシンの環境を設定して、shared_nw上に固定IPでコンテナを作ります。

$ eval $(docker-machine env host1) 

$ docker run --name container1 --net shared_nw --ip 192.168.33.11 -dt ubuntu
$ docker run --name container2 --net shared_nw --ip 192.168.33.12 -dt ubuntu
$ docker run --name container3 --net shared_nw --ip 192.168.33.13 -dt ubuntu

設定がうまく行っていれば、MacBookからコンテナへ直接pingが通ります。

$ ping -c 3 192.168.33.11

$ ping -c 3 192.168.33.12
$ ping -c 3 192.168.33.13

固定IPが設定できるという点も嬉しいですね。


後片付け

テストが終わって要らなくなったDockerマシンは下記の手順で削除することができます。

$ docker rm -f $(docker ps -aq) 

$ docker-machine rm host1
$ vagrant destroy


参考になったリンク