Docker Machine + Vagrantで任意のLinuxディストリビューションでDockerホストを構築する
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
できた。