- environment setup:
- create three virtual machines running docker:
docker-machine create -d virtualbox --virtualbox-host-dns-resolver manager01
docker-machine create -d virtualbox --virtualbox-host-dns-resolver manager02
docker-machine create -d virtualbox --virtualbox-host-dns-resolver manager03
- point local docker client to manager01 and nitialize swarm:
eval $(docker-machine env manager01)
docker swarm init --advertise-addr $(docker-machine ip manager01) \
--listen-addr $(docker-machine ip manager01):2377
- generate token for managers and set env variable:
TOKEN=$(docker swarm join-token manager -q)
- point local docker client to manager02 and join swarm as a manager:
eval $(docker-machine env manager02)
docker swarm join --token $TOKEN \
$(docker-machine ip manager01):2377
- point local docker client to manager03 and join swarm as a manager:
eval $(docker-machine env manager03)
docker swarm join --token $TOKEN \
$(docker-machine ip manager01):2377
- Push docker images to each node
for node in manager01 manager02 manager03
do
eval $(docker-machine env $node)
mvn install
for image in url-shortener/spring-cloud-workshop-config-server \
url-shortener/spring-cloud-workshop-service-discovery \
url-shortener/spring-cloud-workshop-url-shortener-backend \
url-shortener/spring-cloud-workshop-url-shortener-frontend
do
docker create -e affinity:image=$image $image
done
done
- list nodes in the swarm:
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2no8xk6evzc577wbhobekh0xd manager01 Ready Active Leader
6uwv9gu71m7oefjrc6nxopxfr manager02 Ready Active Reachable
c8c6b0wemgshgyi72r8a4immr * manager03 Ready Active Reachable
- deploy services
Create an overlay "workshop" network, all containers that constitute workshop services will be assigned to that network. Contianer assigned to the overlay network can communicate with each other no matter on which nodes they are deployed.
docker network create --driver overlay --subnet 10.0.0.0/24 workshop
docker service create --replicas 1 --name spring-cloud-workshop-redis --network workshop redis
docker service create --endpoint-mode dnsrr --replicas 1 --name config-server --network workshop \
url-shortener/spring-cloud-workshop-config-server --spring.cloud.config.server.git.uri=$REPO
docker service create --endpoint-mode dnsrr --replicas 1 --name dicovery-service --network workshop \
url-shortener/spring-cloud-workshop-service-discovery
docker service create --endpoint-mode dnsrr --replicas 1 --name backend --network workshop \
url-shortener/spring-cloud-workshop-url-shortener-backend --spring.cloud.config.uri=http://config-server:8888/
docker service create --replicas 3 --name frontend --network workshop -p 8080:8080 \
url-shortener/spring-cloud-workshop-url-shortener-frontend --spring.cloud.config.uri=http://config-server:8888
docker service create --replicas 1 --name spring-cloud-workshop-redis --network workshop redis
-
scale a service:
docker service scale service_name=desired num of containers / docker service update --replicas num of containers serviec_name docker service ps service_name
docker service scale spring-cloud-workshop-redis=3
spring-cloud-workshop-redis scaled to 3
- rolling updates:
docker service update --image updated/image:0.2 --update-parallelism 2 --update-delay 60s service_name
-
--update-parallelism num - number of service tasks that the scheduler updates simultaneously
-
--update-delay s/m/h/ - time delay between updates to a service task or sets of tasks