docker swarm service

docker swarm service

docker swarm에서 n개의 node 관련 컨테이너 환경설정등을 swarm에서 service라 지칭한다.
단일 docker 환경에서는 run 명령어로 컨테이너 환경설정을 구성해보았다면 service 명령어도 무척 쉽게느껴질것이다.
run 명령어와 크게 다르지않으며 -p host_port:container_port -e key:value 등 기존의 run 명령어에서 사용한 옵션들을 그대로 사용가능하다.( -v 는 –mount 로 service에서 권장사항으로 변경이되었다. )
어떻게 n개의 node 에서 컨테이너를 관리하는지 알아보자.

create service

가장 기본적인 service 생성은 다음과 같다.

1
$ docker service create -d --name nginx setyourmindpark/debian-nginx

정상적으로 생성되었는지 확인하자.

1
2
3
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
wwl53p7zh25r nginx replicated 1/1 setyourmindpark/debian-nginx:latest *:80->80/tcp

replicas 옵션을 설정하지않는다면 default 1개로 생성이된다.
어느 node에서 생성되었는지, process 상세정보를 얻고자한다면 다음명령어를 통해 확인할수있다.

1
2
3
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
yivhgl2pk2jd nginx.1 setyourmindpark/debian-nginx:latest master Running Running 2 minutes ago

master node 에서 1개의 컨테이너가 실행중임을 알수있다.

ingress network

ingress network를 binding 을 해보자. n 개의 service container들은 비지니스 로직에따라 3자의 container를 연결하거나, 호출할필요가 분명존재할것이다.
다음과같이 ingress network를 생성한후 2개의 service를 생성하여 진행해보자.
먼저 ingress network 를 생성한다.

1
2
3
4
5
6
$ docker network create --driver overlay setyourmindpark_net
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
...
kowrro91wn5v setyourmindpark_net overlay swarm
...

service 를 생성한다.
( dns ping test를 진행하기위해 mariadb와 nginx 이미지로 진행한다. 추가적인 volume mount나 port는 생략한다. )

1
2
3
4
5
6
7
8
9
10
$ docker service create -d --name nginx --network setyourmindpark_net setyourmindpark/debian-nginx
$ docker service create -d --name mariadb --network setyourmindpark_net -e MYSQL_ROOT_PASSWORD=0000 mariadb
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
6rc28lwmg6v7 nginx.1 setyourmindpark/debian-nginx:latest nginx Running Running 34 seconds ago
$ docker serbvice ps mariadb
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
nd1pucccgrzj mariadb.1 mariadb:latest master Running Running about a minute ago

nginx container는 nginx node에, mariadb container는 master 에 각각 1개씩 생성된것을 확인할수있다.
이제 각자의 container에 접속하여 등록된 dns로 ping을 날려보자.
생성된 각각의 컨테이너로 접속한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# nginx node
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8c1858d2f50 setyourmindpark/debian-nginx:latest "/entrypoint.sh" 5 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx.1.6rc28lwmg6v7vars1w7xs93z3
$ docker exec -it b8c1858d2f50 /bin/bash
$ ping mariadb
PING mariadb (10.0.0.13): 56 data bytes
64 bytes from 10.0.0.13: icmp_seq=0 ttl=64 time=0.095 ms
64 bytes from 10.0.0.13: icmp_seq=1 ttl=64 time=0.087 ms
64 bytes from 10.0.0.13: icmp_seq=2 ttl=64 time=0.284 ms
# master node
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e04095504a51 mariadb:latest "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 3306/tcp mariadb.1.nd1pucccgrzje2xdkm833lgmg
$ docker exec -it e04095504a51 /bin/bash
$ ping nginx
PING nginx (10.0.0.15): 56 data bytes
64 bytes from 10.0.0.15: icmp_seq=0 ttl=64 time=0.061 ms
64 bytes from 10.0.0.15: icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from 10.0.0.15: icmp_seq=2 ttl=64 time=0.072 ms

서로다른 물리 node 지만 ingress network로 바인딩되어 컨테이너 생성시 같은 network로 구성된 서비스들이 자동으로 dns로 등록된것을 확인할수있다.

replicas

swarm 을 사용하는 가장중요한 이유중 하나가 replicas 를 사용하기위해서 이기도 하다.
replicas option 을 사용하여 container scale up 을 해보자 .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ docker service scale nginx=2
nginx scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
86h0rksc6100 nginx replicated 2/2 setyourmindpark/debian-nginx:latest
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
6rc28lwmg6v7 nginx.1 setyourmindpark/debian-nginx:latest nginx Running Running 11 minutes ago
st00fxl6khpm nginx.2 setyourmindpark/debian-nginx:latest master Running Running 9 seconds ago

master node 와 nginx node에 1개씩 container가 생성된것을 확인할수있다.

create replicated service in specific node

docker swarm service의 replicas는 개발자가 직접 설정하지않으면 node에 분산되어 container 가 생성된다.
특정 node에서만 container 들을 replicas 하도록 설정해보자.
먼저 node의 type을 설정해주도록한다. ( 당연히 leader node에서 진행한다 )

1
2
3
4
5
6
7
$ docker node update --label-add type=nginx nginx
$ docker node inspect nginx
...
"Labels": {
"type": "nginx"
},
..

다음과 같이 설정이 완료된후, scaleup 한다 .

1
2
3
4
5
6
7
8
9
10
11
12
$ docker service create -d --name nginx --constraint "node.labels.type == nginx" --replicas 3 setyourmindpark/debian-nginx
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xmtddrtwibb2 mariadb replicated 1/1 mariadb:latest
dv5xvtwpf7np nginx replicated 3/3 setyourmindpark/debian-nginx:latest
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mvt47mwyyhwo nginx.1 setyourmindpark/debian-nginx:latest nginx Running Running 29 seconds ago
fqppx2a4m01f nginx.2 setyourmindpark/debian-nginx:latest nginx Running Running 29 seconds ago
dxygv37emol6 nginx.3 setyourmindpark/debian-nginx:latest nginx Running Running 29 seconds ago

특정 node에 replocas된 service 가 생성된것을 확인할수있다.

create service with docker private registry

docker swarm 을 service 하는 기업입장에서 private registry에 올려놓은 image들로 서비스를 구성할것이다. docker 는 private registry에서 pull 하는 옵션으로 --with-registry-auth 를 제공한다.
docker private registry 구성은 docker private registry 를 참고한다.

1
$ docker service create -d --name my-private-image --replicas 5 --with-registry-auth setyourmindpark:5000/my-private-image:1.0

service update

service를 update시 무정지 배포도 가능하다.
사용중인 image version1.0 에서 2.0 으로 update 시 다음과 같이 사용할수있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker service update --image setyourmindpark:5000/my-private-image:2.0 --with-registry-auth my-private-image
$ docker service ps my-private-image
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
o8g58unqwsrx my-private-image.1 setyourmindpark:5000/my-private-image:2.0 master Running Running 48 seconds ago
0kh6v9dk10go \_ my-private-image.1 setyourmindpark:5000/my-private-image:1.0 nginx Shutdown Shutdown 42 seconds ago
ozmcs99v3pl4 my-private-image.2 setyourmindpark:5000/my-private-image:2.0 master Running Running about a minute ago
t6l1hjh6j72y \_ my-private-image.2 setyourmindpark:5000/my-private-image:1.0 master Shutdown Shutdown about a minute ago
bvi8da63ruxl my-private-image.3 setyourmindpark:5000/my-private-image:2.0 nginx Running Running 5 seconds ago
rmeyhhexod6k \_ my-private-image.3 setyourmindpark:5000/my-private-image:1.0 nginx Shutdown Shutdown 6 seconds ago
d1db4z35ejk5 my-private-image.4 setyourmindpark:5000/my-private-image:2.0 nginx Running Running 29 seconds ago
6abz8v3ghj9e \_ my-private-image.4 setyourmindpark:5000/my-private-image:1.0 nginx Shutdown Shutdown 30 seconds ago
n8lxnj7raj45 my-private-image.5 setyourmindpark:5000/my-private-image:2.0 master Running Running 24 seconds ago
kzea4jr0w9kf \_ my-private-image.5 setyourmindpark:5000/my-private-image:1.0 master Shutdown Shutdown 25 seconds ago

해당 명령어를 실행해보면 알겠지만, 현재 실행중인 container들을 하나씩 차례로 shutdown하고 1.0 version에서 2.0 version으로 update 하는것을 확인할수있다. ( rolling 한다 )

service rollback

service를 update하였으나, 어떠한 문제로인해 service가 update되지않는경우, update 하기전 상태로 rollback 할수있는 기능을 제공한다. 명령어는 무척이나 간단하다 .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ docker service rollback my-private-image
$ docker service ps my-private-image
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
siaw130oi5cl my-private-image.1 setyourmindpark:5000/my-private-image:1.0 master Running Running 47 seconds ago
o8g58unqwsrx \_ my-private-image.1 setyourmindpark:5000/my-private-image:2.0 master Shutdown Shutdown 47 seconds ago
0kh6v9dk10go \_ my-private-image.1 setyourmindpark:5000/my-private-image:1.0 nginx Shutdown Shutdown 4 minutes ago
tne09aocufyk my-private-image.2 setyourmindpark:5000/my-private-image:1.0 master Running Running 59 seconds ago
ozmcs99v3pl4 \_ my-private-image.2 setyourmindpark:5000/my-private-image:2.0 master Shutdown Shutdown 59 seconds ago
t6l1hjh6j72y \_ my-private-image.2 setyourmindpark:5000/my-private-image:1.0 master Shutdown Shutdown 5 minutes ago
tm2nsmei9r50 my-private-image.3 setyourmindpark:5000/my-private-image:1.0 nginx Running Running about a minute ago
bvi8da63ruxl \_ my-private-image.3 setyourmindpark:5000/my-private-image:2.0 nginx Shutdown Shutdown about a minute ago
rmeyhhexod6k \_ my-private-image.3 setyourmindpark:5000/my-private-image:1.0 nginx Shutdown Shutdown 4 minutes ago
y9oujmebhdyc my-private-image.4 setyourmindpark:5000/my-private-image:1.0 nginx Running Running about a minute ago
d1db4z35ejk5 \_ my-private-image.4 setyourmindpark:5000/my-private-image:2.0 nginx Shutdown Shutdown about a minute ago
6abz8v3ghj9e \_ my-private-image.4 setyourmindpark:5000/my-private-image:1.0 nginx Shutdown Shutdown 4 minutes ago
z7jfvtn7v4if my-private-image.5 setyourmindpark:5000/my-private-image:1.0 master Running Running about a minute ago
n8lxnj7raj45 \_ my-private-image.5 setyourmindpark:5000/my-private-image:2.0 master Shutdown Shutdown about a minute ago
kzea4jr0w9kf \_ my-private-image.5 setyourmindpark:5000/my-private-image:1.0 master Shutdown Shutdown 4 minutes ago

2.0 version에서 rollback 실행후 1.0으로 되돌아간것을 확인할수있다.