Think Twice

Memorandum

docker swarm を(今さら)試す

docker swarm

docs.docker.com

  • cruster-id 作成
$ docker run --rm swarm create
9b9bc80f30bfbf9d16142fcc031ad7a7
  • master (swarm-master) 作成
$ docker-machine create \
--driver google \
--google-project myproject-1198 \
--google-zone asia-east1-a \
--google-machine-type f1-micro \
--swarm \
--swarm-master \ 
--swarm-discovery token://9b9bc80f30bfbf9d16142fcc031ad7a7 \
swarm-master
  • node (swarm-agent) 作成
$ docker-machine create \
--driver google \
--google-project myproject-1198 \
--google-zone asia-east1-a \
--google-machine-type f1-micro \
--swarm \
--swarm-discovery token://9b9bc80f30bfbf9d16142fcc031ad7a7 \
swarm-agent
  • firewall-rule作成 docker-machine createでinstanceを作成するとdocker-machine tag が付与されるので、http通信できるようにfirewall-ruleを作成する。
$ gcloud compute firewall-rules create docker-http \
       --source-ranges 0.0.0.0/0 \
       --target-tags docker-machine \
       --allow tcp:80
$ docker-machine ls
NAME           ACTIVE   DRIVER       STATE     URL                          SWARM
swarm-agent    -        google       Running   tcp://104.155.224.60:2376    swarm-master
swarm-master   *        google       Running   tcp://104.155.223.102:2376   swarm-master (master)
$ docker-machine env --swarm swarm-master
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://104.155.223.102:3376"
export DOCKER_CERT_PATH="/Users/setoguchi/.docker/machine/machines/swarm-master"
export DOCKER_MACHINE_NAME="swarm-master"
# Run this command to configure your shell:
# eval "$(docker-machine env --swarm swarm-master)"
$ eval "$(docker-machine env --swarm swarm-master)"
  • docker info でclusterの状態を確認できる
$ docker info
Containers: 6
Images: 7
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
 swarm-agent: 104.155.224.60:2376
  └ Status: Healthy
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 618.7 MiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.19.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, provider=google, storagedriver=aufs
 swarm-master: 104.155.223.102:2376
  └ Status: Healthy
  └ Containers: 4
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 618.7 MiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.19.0-28-generic, operatingsystem=Ubuntu 14.04.3 LTS, provider=google, storagedriver=aufs
CPUs: 2
Total Memory: 1.208 GiB
Name: 16a45c9e82db
  • databaseを作成
$ docker build -t postgres ./postgres
  • databaseを起動
$ docker run --rm --name mydb postgres
  • web app 作成
$ docker build -t web ./web
  • web app 起動(コンテナリンクを使う)
$ docker run --rm -p 80:8080 --name myapp --link mydb:db web
$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
0c6fd7fe6288        web                 "java -jar /admission"   13 minutes ago      Up 13 minutes       104.155.223.102:80->8080/tcp   swarm-master/myapp
364cca700777        postgres            "/usr/lib/postgresql/"   15 minutes ago      Up 15 minutes       5432/tcp                       swarm-master/myapp/db,swarm-master/mydb

同じノードで動いてる。 コンテナリンクを使うとclusterを組んでいても同じノードで実行される。

linkをやめて再度トライ。

$ docker run --rm -p 80:8080 --name myapp web
$ docker run --rm --name mydb postgres
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
890d7dbe56e5        postgres            "/docker-entrypoint.s"   20 seconds ago      Up 20 seconds       5432/tcp                       swarm-agent/mydb
b412bd500dc6        web                 "java -jar /admission"   48 seconds ago      Up 47 seconds       104.155.223.102:80->8080/tcp   swarm-master/myapp

別のノードで動いている。 が、これだと、コンテナ間の通信はできない。

マルチホストのコンテナ間での通信は

link ではなく networkを使えば可能。

docs.docker.com

blog.docker.com

Docker Swarm Networking