Docker Swarm - кластер с использованием docker-machine (без сохранения данных после перезагрузки)
Не рекомендую делать так.
При остановке сервера базы данных, данные пропадают.
По материалам видеокурса: Projects-in-Docker
Делаю в конце апреля 2018
Разворачиваю в swarm вот это приложение:
https://github.com/webmakaka/Projects-in-Docker
$ mkdir ~/docker-swarm-scripts
$ cd ~/docker-swarm-scripts
$ vi create-machine.sh
#!/bin/bash
for i in 1 2 3; do
docker-machine create -d virtualbox swarm-$i
done
$ vi destroy-machine.sh
#!/bin/bash
for i in 1 2 3; do
docker-machine rm -f swarm-$i
done
$ source ./destroy-machine.sh
$ docker-machine ls
никаких машин не возвращает
$ source ./create-machine.sh
$ eval $(docker-machine env swarm-1)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
swarm-1 * virtualbox Running tcp://192.168.99.100:2376 v18.04.0-ce
swarm-2 - virtualbox Running tcp://192.168.99.101:2376 v18.04.0-ce
swarm-3 - virtualbox Running tcp://192.168.99.102:2376 v18.04.0-ce
$ docker swarm init --advertise-addr $(docker-machine ip swarm-1)
$ docker swarm join-token manager
$ docker swarm join-token worker
$ JOIN_TOKEN=$(docker swarm join-token -q worker)
$ echo $JOIN_TOKEN
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
muvi5yxed9q4iieutf96l58ic * swarm-1 Ready Active Leader 18.04.0-ce
$ eval $(docker-machine env swarm-2)
$ docker swarm join --token $JOIN_TOKEN \
--advertise-addr $(docker-machine ip swarm-2) \
$(docker-machine ip swarm-1):2377
$ eval $(docker-machine env swarm-3)
$ docker swarm join --token $JOIN_TOKEN \
--advertise-addr $(docker-machine ip swarm-3) \
$(docker-machine ip swarm-1):2377
$ eval $(docker-machine env swarm-1)
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
muvi5yxed9q4iieutf96l58ic * swarm-1 Ready Active Leader 18.04.0-ce
ifswsuffyd7y6x6vhqv0ashm3 swarm-2 Ready Active 18.04.0-ce
pboiazm2mfrfdm9b02o5iu836 swarm-3 Ready Active 18.04.0-ce
Сеть
$ docker network create -d overlay blog_network
$ docker network ls
p7pw78didto8 blog_network overlay swarm
Подготовка имиджей
$ cd mydb
$ docker build -t marley/mydb .
$ cd myapp/
$ docker build -t marley/myapp .
$ cd mywebserver/
$ docker build -t marley/mywebserver --build-arg PASSWORD=pass123 .
Чтобы запустить контейнер в swarm, его нужно куда-то положить. То что он лежит локально на хост машине, ничего незначит. Виртуалки не знают ничего об этом. Я решил, что проще всего положить их на docker hub.
Захожу на docker hub, создаю репо. (мб. уже и не нужно создавать в веб интерфейсе. хз)
$ docker login
$ docker push marley/mydb
$ docker push marley/myapp
$ docker push marley/mywebserver
Запуск сервисов
$ docker service create -d \
--name db_server \
--replicas 1 \
--network blog_network \
--mount type=volume,source=database_volume,destination=/data/db \
marley/mydb
$ docker service create \
--name app_server \
--replicas 3 \
--network blog_network \
marley/myapp
$ docker service create -d \
--name=webserver \
--replicas 3 \
--network blog_network \
--publish=8080:80/tcp \
marley/mywebserver
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r6ppou1bqmg0 app_server replicated 3/3 marley/myapp:latest
417mscwvu3oj db_server replicated 1/1 marley/mydb:latest
oatk2lqmynxa webserver replicated 3/3 marley/mywebserver:latest *:8080->80/tcp
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ee8c2a26dd7 marley/mywebserver:latest "nginx -g 'daemon of…" 2 minutes ago Up 3 minutes 80/tcp webserver.3.gawovk8leaow20ru9qywplunc
65d5f241a953 marley/myapp:latest "npm start" 3 minutes ago Up 3 minutes 3000/tcp app_server.3.iphvuq3k37oh6oa3yypou4xio
582cc62298b4 marley/mydb:latest "docker-entrypoint.s…" 16 minutes ago Up 17 minutes 27017/tcp db_server.1.kjwzu91ibh87f1rppfpi4j7qr
$ curl -I http://$(docker-machine ip swarm-1):8080
OK
$ echo http://$(docker-machine ip swarm-1):8080
http://192.168.99.100:8080
http://192.168.99.100:8080/create.html#/
login: user
pass: pass123
Тоже самое с помощью yml файла
$ vi blog_swarm.yml
version: "3"
services:
db_server:
image: marley/mydb
networks:
- blog_network
deploy:
replicas: 1
restart_policy:
condition: on-failure
volumes:
- database_volume:/data/db
app_server:
image: marley/myapp
networks:
- blog_network
depends_on:
- db_server
deploy:
replicas: 3
restart_policy:
condition: on-failure
webserver:
image: marley/mywebserver
networks:
- blog_network
ports:
- 8080:80
depends_on:
- app_server
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
blog_network:
volumes:
database_volume:
$ docker stack deploy -c blog_swarm.yml blog_swarm