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
$ 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
$ 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으로 되돌아간것을 확인할수있다.