docker_machine_with_vagrant

Docker Machineを使ってVirtualbox, AWS, ESXiにDockerホストを構築するでは、Docker Machineで使い慣れた環境上にDockerホストを構築した。しかし、VirtualBoxやESXiなどを使う場合、選択出来るLinuxディストリビューションが少ない(Boot2DockerとRancherOSくらい)という問題があった。本記事ではVagrantと組み合わせることで、任意のLinuxディストリビューションから生成したVMをdocker-machineで管理できるようにする。

Generic driverについて

Docker Machine 0.3.0 Deep Dive | Docker Blogという記事を読んでいるとGeneric driverなるものがあり、sshでアクセスできるVMなら以下のようにオプションを変更するだけでDockerホストに出来るようだ。

$ docker-machine create -d generic \
--generic-ssh-user USER_NAME \
--generic-ssh-key /path_to/ssh_private_key \
--generic-ip-address VM_IP_ADDRESS \
DOCER_HOST_NAME

これを使ってVirtualBox上にUbuntu14.04のDockerホストを構築する。

実行環境

➤  system_profiler SPSoftwareDataType
Software:

    System Software Overview:

      System Version: OS X 10.10.5 (14F27)
      Kernel Version: Darwin 14.5.0

➤  docker-machine -v
docker-machine version 0.5.1 (7e8e38e)

➤  vagrant -v
Vagrant 1.7.4

➤  vagrant plugin list
vagrant-ohai (0.1.12)
vagrant-omnibus (1.4.1)
vagrant-share (1.1.4, system)
vagrant-triggers (0.5.0) # vagrant-triggersが必要

vagrant up実行と共にDockerホストを作成する

Vagrant boxを確認して、Ubuntu14.04の物を選択する。

➤  vagrant box list
kali                  (virtualbox, 0)
ubuntu14_04           (virtualbox, 0)
ubuntu14_04_32bit     (virtualbox, 0)

➤  vagrant init ubuntu14_04

Vagrantfileを以下のように編集する。中身はこちらとほぼ同じ。

Vagrant.configure(2) do |config|
  config.vm.provision "trigger" do |trigger|
    trigger.fire do
      `docker-machine status #{@machine.name}`
      if $?.exitstatus != 0
        if @machine.provider_name == :virtualbox
          ip = `vagrant ssh #{@machine.name} -c "ip addr show dev eth1 | grep -w inet"`
               .match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)[0]
          port = 22
        else
          ip = @machine.ssh_info[:host]
          port = @machine.ssh_info[:port]
        end

        run "docker-machine -D create -d generic \
            --generic-ip-address #{ip} \
            --generic-ssh-key #{@machine.ssh_info[:private_key_path][0]} \
            --generic-ssh-port #{port} \
            --generic-ssh-user #{@machine.ssh_info[:username]} \
            #{"--swarm" unless ENV["SWARM_DISCOVERY_TOKEN"].nil?} \
            #{"--swarm-master" if !ENV["SWARM_DISCOVERY_TOKEN"].nil? && @machine.name.to_s.include?("master")} \
            #{"--swarm-discovery token://#{ENV["SWARM_DISCOVERY_TOKEN"]}" unless ENV["SWARM_DISCOVERY_TOKEN"].nil?} \
            #{@machine.name}"
      end
    end
  end

  config.trigger.before :destroy do
    `docker-machine status #{@machine.name}`
    if $?.exitstatus == 0
      run "docker-machine rm #{@machine.name}"
    end
  end

  config.vm.provider :virtualbox do |virtualbox, override|
    override.vm.box = "ubuntu14_04"
    override.vm.network "private_network", type: "dhcp"
  end

  config.vm.define "docker-host-with-vagrant" do |d|
  end
end

VMを起動して5分程度待つ。

➤  vagrant up

作成したVMがDocker Machineの管理下になっているか確認する。

➤  docker-machine ls
NAME                       ACTIVE   DRIVER       STATE     URL                         SWARM
docker-host-with-vagrant   -        generic      Running   tcp://172.28.128.4:2376

➤  docker-machine ssh docker-host-with-vagrant
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-43-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Thu Nov 26 14:08:08 UTC 2015

  System load:  0.04              Users logged in:        0
  Usage of /:   4.5% of 39.34GB   IP address for eth0:    10.0.2.15
  Memory usage: 32%               IP address for eth1:    172.28.128.4
  Swap usage:   0%                IP address for docker0: 172.17.0.1
  Processes:    83

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud


*** System restart required ***
Last login: Thu Nov 26 14:08:09 2015 from 172.28.128.1

できた。

参考