Get started with Docker Part 3: Services

Dodkcer Get Started 隨手記。

Part 3: Services

Linux 要先安裝 Docker Compose,Windows 的 Docker Desktop 已經包含 Docker Compose。

Service

分散式系統中各 app 都可稱為一個 “service”,儲存資料到 DB、處理 video transcoding 等等都可以是個 “service”。

Docker 的 services 是一堆在 production 的 containers。一個 service run 一個 image,service 會指定這個 image 要怎麼執行──使用哪些 port、會跑多少 container 等等。只要改變執行的 container instance 數量就能 scale service。透過 docker-compose.yml 定義、執行跟 scale services。

docker-compose.yml

docker-compose.yml 定義 container 在 production 該有什麼行為。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: "3"
services:
# 這個 service 叫作 web
web:
# 從 registry pull image
image: cjwind/get-started:part2
deploy:
# run 5 instances
replicas: 5
resources:
limits:
# 一個 instance 最多只能使用一個 single core CPU 10% 的 CPU time
cpus: "0.1"
# 一個 instance 最多只能用 50MB memory
memory: 50M
restart_policy:
# container fail 會立刻 restart
condition: on-failure
ports:
# map host port 4000 到 service web 的 port 80
- "4000:80"
networks:
# 讓 containers 透過 webnet 這個 load-balanced network 共用 host 的 port 80
- webnet
networks:
# 以預設值(load-balanced overlay network)定義 webnet
webnet:

執行 service

跑 service 前要先:

1
$ docker swarm init

接著執行:

1
2
$ docker stack deploy -c docker-compose.yml <stack_name>
$ docker stack deploy -c docker-compose.yml getstartedlab

可以用以下兩個 command 看執行的 service:

1
2
$ docker service ls
$ docker stack services <stack_name>

兩個 command 的結果都是:

1
2
ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS
ylewu1idwhp0 getstartedlab_web replicated 5/5 cjwind/get-started:part2 *:4000->80/tcp

A single container running in a service is called a task.

列出 service 的 task:

1
2
$ docker service ps <service_name>
$ docker service ps getstartedlab_web

當然也可以用 docker container ls 看 service 的 running container。

列出 stack 所有 task:

1
2
$ docker stack ps <stack_name>
$ docker stack ps getstartedlab

service 執行時如果想修改 task 數量,只要修改 docker-compose.ymlreplicas 設定,再執行一次 docker stack deploy -c docker-compose.yml <stack_name> 就可以了!

要結束 service,首先關掉 app:

1
$ docker stack rm getstartedlab

離開 swarm:

1
$ docker swarm leave -f