2021年3月12日金曜日

Vagrant上のDockerコンテナをホストオンリーネットワークに接続してみる


環境


  • Windows10
  • WSL2(ubuntu20.04)
  • Windows版VirtualBox6.1.18
  • Windows版vagrant2.2.14

Vagrant 起動


ubuntu20.04をvagrantで起動します。
Vagrantfile は下記のとおり。
VirtualBoxのホストオンリーネットワークが、192.168.56.0/24 であることが前提です。
仮想マシンには 192.168.56.10の固定IPアドレスを割り当てます。

Vagrant.configure("2") do |config|

  config.vm.box = "bento/ubuntu-20.04"
  config.vm.network "private_network", ip: "192.168.56.10", auto_config: false

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.name = 'ubuntu20'
    vb.cpus = 2
    vb.customize ['modifyvm', :id, '--nicpromisc2', 'allow-all']
  end

  # https://www.vagrantup.com/docs/synced-folders/nfs
  #config.vm.synced_folder ".", "/vagrant", type: "nfs"

  config.vm.provision "shell", inline: <<-SHELL
    apt update

    # japanese
    apt install language-pack-ja-base language-pack-ja -y
    localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
    timedatectl set-timezone Asia/Tokyo

    # docker
    apt install apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
    apt update
    apt install docker-ce -y
    usermod -aG docker vagrant
    curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

    # https://qiita.com/sadapon2008/items/b5c83fedcb07de45f74e
    apt install bridge-utils
    ip addr flush dev eth1
    docker network create --driver bridge --subnet=192.168.56.0/24 --gateway=192.168.56.10 --opt "com.docker.network.bridge.name"="docker1" my_bridge
    mkdir -p /etc/systemd/system/docker.service.d
    echo '[Service]' > /etc/systemd/system/docker.service.d/override2.conf
    echo 'ExecStartPost=/bin/sh -c "/usr/bin/sleep 1s; /usr/sbin/ip addr flush dev eth1; /usr/sbin/brctl addif docker1 eth1; ip link set eth1 up"' >> /etc/systemd/system/docker.service.d/override2.conf
    echo 'ExecStopPost=/bin/sh -c "/usr/sbin/brctl delif docker1 eth1"' >> /etc/systemd/system/docker.service.d/override2.conf
    systemctl daemon-reload
    systemctl restart docker
    brctl show
    ip a | grep eth1 -A 5
 SHELL
end

"vagrant up"コマンドで起動します。
初回起動中にdocker をインストールしてネットワーク関連の設定を行います。
起動に成功すると、ネットワーク関連の情報が、下記のように表示されます。

    default: bridge name        bridge id               STP enabled     interfaces
    default: docker0            8000.024207e2ad64       no
    default: docker1            8000.024282583d53       no              eth1
    default: 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master docker1 state UP group default qlen 1000
    default:     link/ether 08:00:27:cd:6b:9f brd ff:ff:ff:ff:ff:ff
    default:     inet6 fe80::a00:27ff:fecd:6b9f/64 scope link tentative
    default:        valid_lft forever preferred_lft forever
    default: 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    default:     link/ether 02:42:07:e2:ad:64 brd ff:ff:ff:ff:ff:ff

動作確認


"vagrant ssh"コマンドで仮想マシンに入ります。
下記の内容で、docker-compose.yml を作成します。
コンテナには、ホストオンリーネットワークの固定IPドレスを割り当てます。
ついでに、各コンテナの/etc/hosts にFQDNも設定します。

version: '3'
services:

  nginx00:
    image: nginx
    container_name: nginx00
    hostname: nginx00
    networks:
      default:
        ipv4_address: 192.168.56.11
    extra_hosts:
      - nginx00.local:192.168.56.11
      - nginx01.local:192.168.56.12

  nginx01:
    image: nginx
    container_name: nginx01
    hostname: nginx01
    networks:
      default:
        ipv4_address: 192.168.56.12
    extra_hosts:
      - nginx00.local:192.168.56.11
      - nginx01.local:192.168.56.12

networks:
  default:
    external:
      name: my_bridge

"docker-compose up -d"コマンドで起動します。
仮想マシン内でnginx00コンテナに固定IPでアクセスできるか確認してみます。
下図のように表示されたら成功です。


nginx01コンテナ内からnginx00コンテナにアクセスできるか確認してみます。
nginx00にアクセスするときは、docker-compose.ymlで定義したFQDN(nginx00.local)でアクセスできるか確認します。
下図のように表示されたら成功です。


最後にWSL2のターミナル内から仮想マシン上のDockerコンテナに固定IPでアクセスできるか確認します。
下図のように表示されたら成功です。


ちなみに、
Windowsのブラウザでも仮想マシン上のコンテナに固定IPでアクセスできます。



WSL2の /etc/hosts に nginx00.local, nginx01.local を設定すれば、WSL2からFQDNでアクセスできるようになります。