VMware Photon Controllerでdocker 1.9/swarm 1.0クラスターを作成する


> [vExperts Advent Calendar 2015](http://www.adventar.org/calendars/980)の13日目の記事です。

#やったこと

DevBoxのPhoton Controller環境として構築できるswarmクラスターは、docker 1.8.1/swarm 0.4.0と少し古い。DevBoxのDeployerコンテナとswarm用ベースイメージを修正して、最新のdocker 1.9.1/swarm 1.0.0で、[マルチホストネットワーキングに対応するswarmクラスター](http://blog.docker.com/2015/11/docker-1-9-production-ready-swarm-multi-host-networking/)を構成できるようにしてみた。

「VMware Photon Controllerの使い方」は[ここ](http://qiita.com/masanara/items/69bd0d4aafd158889533)。




#クラスター作成時のdeployerの役割
「photon cluster create」で実行されるクラスターの作成は[Photon Controllerのdeployer](https://github.com/vmware/photon-controller/tree/master/java/deployer)が担当している。deployerはクラスタの作成要求に応じて、必要な仮想マシン(etcd,master,slave)を生成し、それぞれの役割に最適化する。

##cloud-initによるカスタマイズ
deployerはimagesとして登録したベースイメージを利用して仮想マシンをリンククローンとして作成し、起動時に[cloud-init](http://cloudinit.readthedocs.org/en/latest/topics/datasources.html#vsphere)を利用して仮想マシンのカスタマイズを実行している。cloud-initが参照するmeta-data、user-dataはISOイメージにより仮想マシンに対して提供されるため、クラスターを構成する仮想マシンにはISOイメージが接続されている。

```/vmfs/volumes/datastore1/vms/64/64f2b514-242f-4414-8ee0-726b74d67420/64f2b514-242f-4414-8ee0-726b74d67420.vmx
ide0:0.deviceType = "cdrom-image"
ide0:0.fileName = "esx-create-vm-iso-config-file-64f2b514-242f-4414-8ee0-726b74d67420.iso"
ide0:0.present = "TRUE"
```

##user-data テンプレートファイル
cloud-initで利用されるuser-detaは、deployerが以下のテンプレートを利用して各仮想マシン向けに動的に生成する。
作成された仮想マシンが参照したuser-dataは```/var/lib/cloud/instance/user-data.txt```に保存されている。

- [swarm-etcd-user-data.template](https://github.com/vmware/photon-controller/blob/d9f5804ce937908486d4e20e595e8ca762181c18/java/deployer/src/main/resources/scripts/swarm-etcd-user-data.template)
- [swarm-master-user-data.template](https://github.com/vmware/photon-controller/blob/d9f5804ce937908486d4e20e595e8ca762181c18/java/deployer/src/main/resources/scripts/swarm-master-user-data.template)
- [swarm-slave-user-data.template](https://github.com/vmware/photon-controller/blob/d9f5804ce937908486d4e20e595e8ca762181c18/java/deployer/src/main/resources/scripts/swarm-slave-user-data.template)


##swarmベースイメージ
配布されている[swarm用ベースイメージ](https://bintray.com/artifact/download/photon-controller/public/UserWorkflow/photon-swarm-vm-disk1.vmdk)はdocker 1.8.1がインストールしてあり、swarm 0.4.0のdockerイメージが格納されている。

```Shell
root@master-c7b0d516-06f1-4b97-8eed-e4bc30543dad [ ~ ]# export DOCKER_HOST="tcp://192.168.209.135:2375"

root@master-c7b0d516-06f1-4b97-8eed-e4bc30543dad [ ~ ]# docker version
Client:
Version: 1.8.1
API version: 1.20
Go version: go1.4.2
Git commit: d12ea79
Built: Thu Aug 13 02:49:29 UTC 2015
OS/Arch: linux/amd64

Server:
Version: 1.8.1
API version: 1.20
Go version: go1.4.2
Git commit: d12ea79
Built: Thu Aug 13 02:49:29 UTC 2015
OS/Arch: linux/amd64

root@master-c7b0d516-06f1-4b97-8eed-e4bc30543dad [ ~ ]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
swarm                 0.4.0               207e8b983242        3 months ago        10.2 MB
quay.io/coreos/etcd   v2.0.8              3b3ecf8306ba        8 months ago        12.79 MB

```

#docker 1.9.1/swarm 1.0.0への対応方法

2つの対応が必要。

1. ベースイメージを更新してクラスターを構成するVMのdockerのバージョンを1.9.1に変更する。
2. deployerが持つuser-data.templateファイルを修正し、swarm 1.0.0とマルチホストネットワーキングに対応するためにdockerの起動オプションを追加する。

##ベースイメージの更新

###ベースイメージのdockerバイナリの変更
[swarm用ベースイメージ](https://bintray.com/artifact/download/photon-controller/public/UserWorkflow/photon-swarm-vm-disk1.vmdk)をダウンロードして、仮想マシンとして起動する。起動した仮想マシンにログイン(ユーザー名 : root/パスワード : vmware)してIPアドレスを設定し、docker-1.9.1をダウンロードしてプリインストールされているdockerと差し替える。

```Shell
# ip link set en16780032 up
# ip address add 192.168.209.41/24 dev eno16780032
# ip route add default via 192.168.209.2
# curl -o /usr/bin/docker-1.9.1 https://get.docker.com/builds/Linux/x86_64/docker-1.9.1
# chmod 755 /usr/bin/docker-1.9.1
# rm /usr/bin/docker
# ln -s /usr/bin/docker-1.9.1 /usr/bin/docker

# ls -l /usr/bin/docker*
lrwxrwxrwx 1 root root       21 Dec  1 02:37 /usr/bin/docker -> /usr/bin/docker-1.9.1
-rwxr-xr-x 1 root root 19582488 Aug 20 19:00 /usr/bin/docker-1.8.1
-rwxr-xr-x 1 root root 30222575 Dec  1 02:36 /usr/bin/docker-1.9.1

# shutdown -h now
```

###ベースイメージのエクスポート
vSphere Clientで仮想マシンをエクスポートして、vmdkファイルを取り出す。

###既存ベースイメージの削除
Photon Controllerにswarm用のベースイメージが登録されている場合は、ベースイメージを一度削除する。

```PowerShell
PS C:\> photon image list
Using target 'https://192.168.209.29:443'
PS C:\> photon image list
Using target 'https://192.168.209.29:443'
ID                                    Name                  State  Size(Byte)   Replication_type
6c78c7df-994d-45d7-9a50-d5f5720868eb  photon-swarm-vm.vmdk  READY  85899345968  EAGER

Total: 1

PS C:\> photon image delete 6c78c7df-994d-45d7-9a50-d5f5720868eb
Are you sure [y/n]? y
Using target 'https://192.168.209.29:443'
Deleted image 6c78c7df-994d-45d7-9a50-d5f5720868eb
```

###新規ベースイメージの登録
エクスポートした仮想マシンのvmdkファイルをベースイメージとしてアップロードする。

```PowerShell
PS C:\> photon image create C:\Users\Administrator\Desktop\newvm\newvm-disk1.vmdk -n photon-swarm-vm.vmdk -i EAGER
Using target 'https://192.168.209.29:443'
Created image 'photon-swarm-vm.vmdk' ID: 8e463b88-bb21-4f84-a13d-2bf7c3ee97ed
```

#swarm 1.0.0への対応とdocker起動オプションの修正

deployerコンテナ内のuser-data.templateファイルを修正する。ファイルの修正だけなので、修正したファイルを用意して、docker buildを使って既存のdeployerコンテナイメージのテンプレートファイルだけを差し替える。

##deployerコンテナイメージの更新

deployerコンテナ内のcloud-initのテンプレートファイルを修正する。

- ```swarmImage=swarm:0.4.0```を```swarmImage=swarm:1.0.0```に変更し、swarmのバージョンを1.0.0に変更する。
- マルチホストネットワーキングに対応するためにdockerの起動オプションを変更する。

    cloud-initはswarmクラスターのmaster/slave VMに```/tmp/start-swarm-master.sh```、```/tmp/start-swarm-slave.sh```を作成して実行する。
    このスクリプトは```/etc/systemd/system/multi-user.target.wants/docker.services```を書き換えて、systemdで起動されるdockerの起動オプションを修正している。「ExecStart」行に対する変更内容にマルチホストネットワーキング構成時に必要なetcdの指定(--cluster-store=etcd://xxx.xxx.xxx.xxx:2379)と、swarmクラスター参加時にアドバタイズする自身のIP(--cluster-advertise)を追加する。
    deployerは$ETCD_QUORUMとして、etcdのアドレスを持っているがポート番号が付加されているため、```ETCD_IP=`echo $ETCD_QUORUM | sed 's/\:2379//g'```としてアドレスだけを取り出している。(sedの正規表現として渡すため「:」にエスケープを付与する必要があり、$ETCD_QUORUMをそのまま利用することができない)

####swarm-master-user-data.template

```Diff
--- swarm-master-user-data.template      2015-12-01 21:53:15.037778099 +0900
+++ swarm-master-user-data.template.new  2015-12-01 18:34:48.000000000 +0900
@@ -32,13 +32,14 @@
   - content: |
         eno_name=$(ip addr | grep eno | sed 's/.*\(eno.*\):.*/\1/' | head -n 1)
         ipAddress=`ifconfig ${eno_name} | sed -n '/dr:/{;s/.*dr://;s/ .*//;p;}'`
-        swarmImage=swarm:0.4.0
+        swarmImage=swarm:1.0.0

         echo "Configuring docker daemon"
         systemctl stop docker
         rm /etc/docker/key.json
         unitFile=`systemctl cat docker | grep "#" | cut -d" " -f2`
-        sed -i "s:^ExecStart.*:ExecStart=/bin/docker -d -H tcp\://0.0.0.0\:2375:g" ${unitFile}
+        ETCD_IP=`echo $ETCD_QUORUM | sed 's/\:2379//g'`
+        sed -i "s:^ExecStart.*:ExecStart=/bin/docker -d -H tcp\://0.0.0.0\:2375 --cluster-store=etcd\://${ETCD_IP}\:2379 --cluster-advertise=$ipAddress\:2375:g" ${unitFile}
         systemctl daemon-reload
         systemctl start docker
         sleep 5
```

####swarm-slave-user-data.template

```Diff
--- swarm-slave-user-data.template      2015-12-01 21:53:42.333777123 +0900
+++ swarm-slave-user-data.template.new  2015-12-01 18:49:27.526172473 +0900
@@ -32,13 +32,14 @@
   - content: |
         eno_name=$(ip addr | grep eno | sed 's/.*\(eno.*\):.*/\1/' | head -n 1)
         ipAddress=`ifconfig ${eno_name} | sed -n '/dr:/{;s/.*dr://;s/ .*//;p;}'`
-        swarmImage=swarm:0.4.0
+        swarmImage=swarm:1.0.0

         echo "Configuring docker daemon"
         systemctl stop docker
         rm /etc/docker/key.json
         unitFile=`systemctl cat docker | grep "#" | cut -d" " -f2`
-        sed -i "s:^ExecStart.*:ExecStart=/bin/docker -d -H tcp\://0.0.0.0\:2375:g" ${unitFile}
+        ETCD_IP=`echo $ETCD_QUORUM | sed 's/\:2379//g'`
+        sed -i "s:^ExecStart.*:ExecStart=/bin/docker -d -H tcp\://0.0.0.0\:2375 --cluster-store=etcd\://${ETCD_IP}\:2379 --cluster-advertise=$ipAddress\:2375:g" ${unitFile}
         systemctl daemon-reload
         systemctl start docker
         sleep 5
```

##deployer Dockerイメージの作成
devbox内で起動しているコンテナイメージのdevbox/deployerをベースにして、```swarm-master-user-data.template```と```swarm-slave-user-data.template```ファイル上書きして、新しいdeployerイメージを作成する。

###Dockerfileの作成

deployerイメージを作成するためのDockerfileを作成する。

```Dockerfile:Dockerfile
FROM devbox/deployer
COPY swarm-master-user-data.template /usr/lib/esxcloud/deployer/scripts/swarm-master-user-data.template.new
COPY swarm-slave-user-data.template /usr/lib/esxcloud/deployer/scripts/swarm-slave-user-data.template.new
```

###docker build
Dockerfileを新しいuser-data.templateと同じフォルダに置いて、docker buildコマンドでdeployerイメージを作成する。

```Shell
root@devbox-discus [ ~/deployer ]# ls -l
total 12
-rw-r--r-- 1 root root  236 Dec  1 13:10 Dockerfile
-rw-r--r-- 1 root root 2096 Dec  1 09:34 swarm-master-user-data.template.new
-rw-r--r-- 1 root root 1964 Dec  1 09:49 swarm-slave-user-data.template.new

root@devbox-discus [ ~/deployer ]# docker build -t deployer .
Sending build context to Docker daemon  7.68 kB
Step 0 : FROM devbox/deployer
 ---> e92d8e6b330f
Step 1 : COPY swarm-master-user-data.template.new /usr/lib/esxcloud/deployer/scripts/swarm-master-user-data.template
 ---> 941953dc13ab
Removing intermediate container b2f42e29b77d
Step 2 : COPY swarm-slave-user-data.template.new /usr/lib/esxcloud/deployer/scripts/swarm-slave-user-data.template
 ---> cfaf70b953f1
Removing intermediate container ced78dd20121
Successfully built cfaf70b953f1

root@devbox-discus [ ~/deployer ]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
deployer                 latest              cfaf70b953f1        43 seconds ago      475.2 MB
devbox/cloud_store       latest              f62bb249a94c        2 weeks ago         440.1 MB
devbox/deployer          latest              e92d8e6b330f        2 weeks ago         475.2 MB
devbox/housekeeper       latest              93fb83074572        2 weeks ago         448.3 MB
devbox/root_scheduler    latest              6f6c7fe46286        2 weeks ago         426.9 MB
devbox/chairman          latest              4910ed61a142        2 weeks ago         447.6 MB
devbox/management_api    latest              35e3d8afe046        2 weeks ago         501.9 MB
devbox/agent             latest              08bf3267b8b1        2 weeks ago         1.919 GB
devbox/compileservices   latest              ac8c364a94d5        4 weeks ago         1.911 GB
devbox/servicebase       latest              4d1ce055e2d7        4 weeks ago         386.3 MB
devbox/haproxy           latest              5ee94d2f1f42        4 weeks ago         318.9 MB
devbox/zookeeper         latest              0b933cc83feb        4 weeks ago         407 MB
centos                   6.7                 3fba1048142f        6 weeks ago         190.6 MB
```

###既存deployerコンテナの停止
新しいdeployerを起動するため、DevBoxで起動しているdevbox/deployerコンテナを停止する。

```Shell
root@devbox-discus [ ~/deployer ]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
0b02ef6ad4d1        devbox/cloud_store      "/bin/bash /etc/esxcl"   2 weeks ago         Up About an hour                        devbox_cloud_store_container
2bf7660ffc5e        devbox/deployer         "/bin/bash /etc/esxcl"   2 weeks ago         Up About an hour                        devbox_deployer_container
6658d8091455        devbox/housekeeper      "/bin/bash /etc/esxcl"   2 weeks ago         Up About an hour                        devbox_housekeeper_container
ebb816a04449        devbox/root_scheduler   "/bin/bash /etc/esxcl"   2 weeks ago         Up About an hour                        devbox_root_scheduler_container
c729a6596f24        devbox/chairman         "/bin/bash /etc/esxcl"   2 weeks ago         Up About an hour                        devbox_chairman_container
88a664a7851e        devbox/management_api   "/bin/bash /etc/esxcl"   2 weeks ago         Up About an hour                        devbox_management_api_container
56f5000b3f7a        devbox/haproxy          "/bin/bash /etc/hapro"   2 weeks ago         Up About an hour                        devbox_haproxy_container
de24c74c9ca6        devbox/zookeeper        "/bin/bash /usr/lib/z"   2 weeks ago         Up About an hour                        devbox_zookeeper_container

root@devbox-discus [ ~/deployer ]# docker stop devbox_deployer_container
devbox_deployer_container
```

###新しいdeployerコンテナの起動

deployerコンテナは以下のオプションで実行する。オプションは```dokcer inspect devbox_deployer_container```で確認した。

- ホストネットワーキングを利用 (--net=host)
- DevBoxの再起動後も自動的にコンテナが起動するようにする (--restart=always)
- 必要なボリュームのマウント
	- /var/esxcloud:/var/esxcloud
	- /devbox_data/tmp:/devbox_data/tmp
	- /esxcloud/java/distributions/configurations/configuration-deployer:/etc/esxcloud
	- /vagrant/log/deployer:/vagrant/log
	- /vagrant/log/deployer/script_logs:/vagrant/log/script_logs
	- /tmp/devbox_datastore:/tmp 
- エントリーポイントとして「/etc/esxcloud/run.sh」を実行



```Shell
root@devbox-discus [ ~/deployer ]# docker run -d -v /var/esxcloud:/var/esxcloud -v /devbox_data/tmp:/devbox_data/tmp -v /esxcloud/java/distributions/configurations/configuration
-deployer:/etc/esxcloud -v /vagrant/log/deployer:/vagrant/log -v /vagrant/log/deployer/script_logs:/vagrant/log/script_logs -v /tmp/devbox_datastore:/tmp --restart=always --name deployer --net=host deployer /etc/esxcloud/run.sh
143e6fb3e323ca9c881c5a45479a471b829b688e79265373f68a7350d8614595

root@devbox-discus [ ~/deployer ]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
143e6fb3e323        deployer                "/bin/bash /etc/esxcl"   3 seconds ago       Up 3 seconds                            deployer
0b02ef6ad4d1        devbox/cloud_store      "/bin/bash /etc/esxcl"   2 weeks ago         Up 2 hours                              devbox_cloud_store_container
6658d8091455        devbox/housekeeper      "/bin/bash /etc/esxcl"   2 weeks ago         Up 2 hours                              devbox_housekeeper_container
ebb816a04449        devbox/root_scheduler   "/bin/bash /etc/esxcl"   2 weeks ago         Up 2 hours                              devbox_root_scheduler_container
c729a6596f24        devbox/chairman         "/bin/bash /etc/esxcl"   2 weeks ago         Up 2 hours                              devbox_chairman_container
88a664a7851e        devbox/management_api   "/bin/bash /etc/esxcl"   2 weeks ago         Up 2 hours                              devbox_management_api_container
56f5000b3f7a        devbox/haproxy          "/bin/bash /etc/hapro"   2 weeks ago         Up 2 hours                              devbox_haproxy_container
de24c74c9ca6        devbox/zookeeper        "/bin/bash /usr/lib/z"   2 weeks ago         Up 2 hours                              devbox_zookeeper_container
```

#新しいswarmクラスターの作成
新しいベースイメージとdeployerを使ってswarmクラスターを作成する。

```PowerShell
PS C:\> photon cluster  create -n MySwarm1 -k SWARM -s 2 --dns 192.168.209.2 --gateway 192.168.209.2 --netmask 255.255.
55.0 --etcd1 192.168.209.50
Using target 'https://192.168.209.29:443'
etcd server 2 static IP address (leave blank for none):

Creating cluster: MySwarm1 (SWARM)
  Slave count: 2

Are you sure [y/n]? y
Cluster created: ID = 132499cf-c440-43ef-acad-35556ea24a95
Note: the cluster has been created with minimal resources. You can use the cluster now.
A background task is running to gradually expand the cluster to its target capacity.
You can run 'cluster show 132499cf-c440-43ef-acad-35556ea24a95' to see the state of the cluster.
```

クラスター作成の確認

```PowerShell
PS C:\> photon cluster list
Using target 'https://192.168.209.29:443'
ID                                    Name      Type   State  Slave Count
132499cf-c440-43ef-acad-35556ea24a95  MySwarm1  SWARM  READY  2

Total: 1
READY: 1
```

swarmクラスターのmaster VMのIPアドレスの確認

```PowerShell
PS C:\> photon cluster show 132499cf-c440-43ef-acad-35556ea24a95
Using target 'https://192.168.209.29:443'
Cluster ID:     132499cf-c440-43ef-acad-35556ea24a95
  Name:         MySwarm1
  State:        READY
  Type:         SWARM
  Slave count:  2

VM ID                                 VM Name                                      VM IP
6722791e-46e4-455e-a440-d36867315f26  master-90751931-b8ce-4329-9c28-210bcdb1f4d1  192.168.209.139
2fd8e15d-dbb9-4c9b-9767-27f5d42ca3b9  etcd-3f8bd757-bfdc-45a9-8b23-4e2f4e5d44e1    192.168.209.50
```

#Docker/Swarmの動作確認
##コンテナ向けオーバーレイネットワークの作成
DOCKER_HOSTとしてmasterのIPアドレスを指定して、オーバーレイネットワークを作成してみる。

```PowerShell
PS C:\> $env:DOCKER_HOST="tcp://192.168.209.139:8333"

PS C:\> docker network ls
NETWORK ID          NAME                                                 DRIVER
cabba076a0b6        master-90751931-b8ce-4329-9c28-210bcdb1f4d1/host     host
85d6584a36c7        slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/none      null
458578c641a1        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/bridge    bridge
e3fd749cf50a        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/none      null
012a4899d4da        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/host      host
e35227f783b3        master-90751931-b8ce-4329-9c28-210bcdb1f4d1/none     null
71ed853880d1        slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/host      host
cdc524e05788        slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/bridge    bridge
af76d311d84d        master-90751931-b8ce-4329-9c28-210bcdb1f4d1/bridge   bridge

PS C:\> docker network create mynet
d9e89601445d0cb94dd9c153e5792a48b0b1ae343036fd089542a1fa6a832432

PS C:\> docker network ls
NETWORK ID          NAME                                                 DRIVER
af76d311d84d        master-90751931-b8ce-4329-9c28-210bcdb1f4d1/bridge   bridge
85d6584a36c7        slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/none      null
458578c641a1        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/bridge    bridge
012a4899d4da        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/host      host
71ed853880d1        slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/host      host
e3fd749cf50a        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/none      null
d9e89601445d        mynet                                                overlay
e35227f783b3        master-90751931-b8ce-4329-9c28-210bcdb1f4d1/none     null
cabba076a0b6        master-90751931-b8ce-4329-9c28-210bcdb1f4d1/host     host
cdc524e05788        slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/bridge    bridge
```

##オーバーレイネットワークを利用してコンテナを起動してみる

nginxとubuntuコンテナを作成したmynetに接続して起動する。

```PowerShell
PS C:\> docker run -d --name web --net mynet nginx
a2816954e7638f5bf7f6299d30f3214f34e3fd9eccbe3f1975196b666629386f

PS C:\> docker run -itd --name ubuntu --net mynet ubuntu bash
e5da53a681487a167f96d31c58f4695b229aca08d5f38d6328d9b4608f84307c
```

web(nginx)は```slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/web```、ubuntuは```slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/ubuntu```で起動している。(異なるdockerホストで起動している)

```PowerShell
PS C:\> docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
e5da53a68148        ubuntu              "bash"                   46 seconds ago      Up 20 seconds                                        slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/ubuntu
a2816954e763        nginx               "nginx -g 'daemon off"   2 minutes ago       Up About a minute   80/tcp, 443/tcp                  slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/web
7542cbcd4884        swarm:1.0.0         "/swarm join --addr=1"   30 minutes ago      Up 30 minutes       2375/tcp                         slave-5d5770f5-d5cf-4c7f-a485-660a6ff76159/fervent_blackwell
87ad8a6a45bb        swarm:1.0.0         "/swarm join --addr=1"   31 minutes ago      Up 31 minutes       2375/tcp                         slave-a73d4f62-787e-4a68-9c1f-67b2d79f3a0f/focused_brahmagupta
32c11d4d942e        swarm:1.0.0         "/swarm manage etcd:/"   32 minutes ago      Up 32 minutes       192.168.209.139:8333->2375/tcp   master-90751931-b8ce-4329-9c28-210bcdb1f4d1/romantic_engelbart
2db4e7250801        swarm:1.0.0         "/swarm join --addr=1"   32 minutes ago      Up 32 minutes       2375/tcp                         master-90751931-b8ce-4329-9c28-210bcdb1f4d1/condescending_blackwell
```

ubuntuコンテナにアタッチして、curlをインストールしてwebコンテナに接続を確認。
コンテナ名を利用して、ホスト間のコンテナ同士がオーバーレイネットワークにより通信できている。

```PowerShell
PS C:\> docker attach ubuntu
root@e5da53a68148:/#
root@e5da53a68148:/# apt-get -y install curl
root@e5da53a68148:/# curl web.mynet
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

ubuntuのhostsファイルには、同じネットワークに接続されているwebコンテナのエントリが追加されている。

```Shell
root@e5da53a68148:/# cat /etc/hosts
127.0.0.localhost ip6-localhost ip6-loopback
fe00::0 ip6-mcastprefix
ff02::1 ip6-allrouters
10.0.0.2        web.mynet
```


###既存deployerコンテナの削除

既存のdeployerコンテナを削除して、DevBox再起動時にdevbox/deployerが起動しないようにする。

```Shell
root@devbox-discus [ ~/deployer ]# docker rm -f devbox_deployer_container
devbox_deployer_container
```

#その他
deployer作成のために利用した```Dockerfile```、```swarm-master-user-data.template.new```、```swarm-slave-user-data.template.new```は[ここ](https://github.com/masanara/custom-deployer)に置いた。