Skip to content

Instantly share code, notes, and snippets.

@crazyguitar
Last active November 28, 2018 19:49
Show Gist options
  • Save crazyguitar/7c5be1484e3a9535c726093149c62e9d to your computer and use it in GitHub Desktop.
Save crazyguitar/7c5be1484e3a9535c726093149c62e9d to your computer and use it in GitHub Desktop.
docker swarm

Docker Swarm Note

Common commands

Create a Swarm

On Machine 1 (master)

$ private_ip="10.130.63.96"
$ docker swarm init --advertise-addr "$private_ip"
Swarm initialized: current node (umkbjkcectb1vaxgh87djq6c6) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5etpbtmjby634yoe8smr6piyn4a98q83pqnenec3hyymbv0fch-1af319govc5ug3tl17dene7w0 10.130.63.96:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

On Machine 2 (slave)

$ docker swarm join --token SWMTKN-1-5etpbtmjby634yoe8smr6piyn4a98q83pqnenec3hyymbv0fch-1af319govc5ug3tl17dene7w0 10.130.63.96:2377

On Machien 3 (slave)

$ docker swarm join --token SWMTKN-1-5etpbtmjby634yoe8smr6piyn4a98q83pqnenec3hyymbv0fch-1af319govc5ug3tl17dene7w0 10.130.63.96:2377

Check cluster's information

$ docker node ls
ID                            HOSTNAME                     STATUS              AVAILABILITY        MANAGER STATUS
umkbjkcectb1vaxgh87djq6c6 *   coreos-s-1vcpu-1gb-sgp1-01   Ready               Active              Leader
wrz5r89fy7gp3nq5ny8o6ywqc     coreos-s-1vcpu-1gb-sgp1-02   Ready               Active              
rqs8cv9jm6x8yjda2ztstk32u     coreos-s-1vcpu-1gb-sgp1-03   Ready               Active

Create a Service in Swarm

# 1 replicas
$ docker service create --replicas 1 --name webserver nginx

# 3 replicas
$ docker service create --replicas 3 --name backendweb nginx

show the services

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
v9vh25a4pp61        backendweb          replicated          1/3                 nginx:latest        
osfj56c5fgbl        webserver           replicated          1/1                 nginx:latest

Inspect the services

$ docker inspect --pretty webserver
ID:             osfj56c5fgbl3knggfub1ul2o
Name:           webserver
Service Mode:   Replicated
 Replicas:      1
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         nginx:latest@sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de
Resources:
Endpoint Mode:  vip

Scale-out service

$ docker service scale webserver=6
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
v9vh25a4pp61        backendweb          replicated          3/3                 nginx:latest        
osfj56c5fgbl        webserver           replicated          6/6                 nginx:latest

Delete service

$ docker service rm backendweb
backendweb
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
osfj56c5fgbl        webserver           replicated          6/6                 nginx:latest

Rolling Update to a Service

Start a redis service from redis:3.2.11-alpine

$ docker service create \
   --replicas 3 \
   --name redis \
   --update-delay 10s \
   redis:3.2.11-alpine
zlc6u7ond1r29jwm9bv5v6oj7
$ docker service ls
docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
zlc6u7ond1r2        redis               replicated          3/3                 redis:3.2.11-alpine   
osfj56c5fgbl        webserver           replicated          6/6                 nginx:latest

Update redis version

$ docker service update --image redis:4.0.8-alpine redis
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                PORTS
zlc6u7ond1r2        redis               replicated          3/3                 redis:4.0.8-alpine   
osfj56c5fgbl        webserver           replicated          6/6                 nginx:latest

Get update info

$ docker service inspect --pretty redis 

Watch the rolling update

$ docker service ps redis
ID                  NAME                IMAGE                 NODE                         DESIRED STATE       CURRENT STATE                 ERROR               PORTS
spxopuiosy4o        redis.1             redis:4.0.8-alpine    coreos-s-1vcpu-1gb-sgp1-03   Running             Running 2 minutes ago                             
6d908gm5gvsd         \_ redis.1         redis:3.2.11-alpine   coreos-s-1vcpu-1gb-sgp1-03   Shutdown            Shutdown 2 minutes ago                            
i2zri4rki21l        redis.2             redis:4.0.8-alpine    coreos-s-1vcpu-1gb-sgp1-01   Running             Running 2 minutes ago                             
m3q9omxm2ufj         \_ redis.2         redis:3.2.11-alpine   coreos-s-1vcpu-1gb-sgp1-01   Shutdown            Shutdown 2 minutes ago                            
jkn30y98qb4e        redis.3             redis:4.0.8-alpine    coreos-s-1vcpu-1gb-sgp1-02   Running             Running about a minute ago                        
rshtv0qsy0pa         \_ redis.3         redis:3.2.11-alpine   coreos-s-1vcpu-1gb-sgp1-02   Shutdown            Shutdown about a minute ago

Assign tasks to any ACTIVE node (DRAIN)

DRAIN availability prevents a node from receiving new tasks from the swarm manager

$ docker node update --availability drain coreos-s-1vcpu-1gb-sgp1-02
coreos-s-1vcpu-1gb-sgp1-02
$ docker node ls
ID                            HOSTNAME                     STATUS              AVAILABILITY        MANAGER STATUS
umkbjkcectb1vaxgh87djq6c6 *   coreos-s-1vcpu-1gb-sgp1-01   Ready               Active              Leader
wrz5r89fy7gp3nq5ny8o6ywqc     coreos-s-1vcpu-1gb-sgp1-02   Ready               Drain               
rqs8cv9jm6x8yjda2ztstk32u     coreos-s-1vcpu-1gb-sgp1-03   Ready               Active
$ docker service ps web
ID                  NAME                IMAGE               NODE                         DESIRED STATE       CURRENT STATE            ERROR               PORTS
0u4c678mh4px        web.1               nginx:latest        coreos-s-1vcpu-1gb-sgp1-03   Running             Running 51 seconds ago                       
xx04i1qst907        web.2               nginx:latest        coreos-s-1vcpu-1gb-sgp1-01   Running             Running 51 seconds ago                       
xn8sh7skrcwz        web.3               nginx:latest        coreos-s-1vcpu-1gb-sgp1-03   Running             Running 51 seconds ago

# ending the task on a node with Drain availability and creating a new task on a node with Active availability

$ docker node update --availability active coreos-s-1vcpu-1gb-sgp1-02
coreos-s-1vcpu-1gb-sgp1-02
$ docker node ls
ID                            HOSTNAME                     STATUS              AVAILABILITY        MANAGER STATUS
umkbjkcectb1vaxgh87djq6c6 *   coreos-s-1vcpu-1gb-sgp1-01   Ready               Active              Leader
wrz5r89fy7gp3nq5ny8o6ywqc     coreos-s-1vcpu-1gb-sgp1-02   Ready               Active              
rqs8cv9jm6x8yjda2ztstk32u     coreos-s-1vcpu-1gb-sgp1-03   Ready               Active

publish ports

All nodes participate in an ingress routing mesh to publish ports for services to make them available to resources outside the swarm

$ docker service create \
>   --name my-web \
>   --publish published=8080,target=80 \
>   --replicas 2 \
>   nginx
$ curl 128.199.193.7:8080

Publish port from existing service

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                PORTS
uuks7qyio10o        my-web              replicated          2/2                 nginx:latest         *:8080->80/tcp
zlc6u7ond1r2        redis               replicated          3/3                 redis:4.0.8-alpine
ksyqibiw7hz7        web                 replicated          3/3                 nginx:latest
osfj56c5fgbl        webserver           replicated          6/6                 nginx:latest

$ docker service update --publish-add published=8888,target=80 webserver
webserver

docker service ls                      
ID                  NAME                MODE                REPLICAS            IMAGE                PORTS
uuks7qyio10o        my-web              replicated          2/2                 nginx:latest         *:8080->80/tcp
zlc6u7ond1r2        redis               replicated          3/3                 redis:4.0.8-alpine
ksyqibiw7hz7        web                 replicated          3/3                 nginx:latest
osfj56c5fgbl        webserver           replicated          5/6                 nginx:latest         *:8888->80/tcp

$ curl 128.199.193.7:8888

Reference

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment