Docker Compose
将 docker-compose.yml 部署为一个 sh0 应用:每个服务成为私有网络中的一个容器,使用命名卷,并只有一个公开地址。
概述
sh0 将 Compose 文件导入为一个应用。每个服务成为由其 image 启动的容器,按 depends_on 给出的顺序启动。服务不能被构建:声明了 build: 的服务会被拒绝;请在别处构建镜像,或将其作为单独应用从 Git 仓库部署。
部署栈
在控制面板中打开一个栈,点击 Add App,选择 Docker Compose,为应用命名,将文件粘贴到 docker-compose.yml 中,然后点击 Deploy Now。在命令行中,sh0 compose validate 检查文件,sh0 compose deploy 进行部署。以下示例包含一个 Web 服务和一个 Redis 缓存:
services:
web:
image: traefik/whoami:v1.10
ports:
- "8080:80"
environment:
REDIS_URL: redis://cache:6379
depends_on:
- cache
deploy:
resources:
limits:
memory: 64M
cpus: "0.25"
healthcheck:
test: ["CMD", "true"]
cache:
image: redis:7-alpine
mem_limit: 128m
cpus: 0.5
volumes:
- cache-data:/data
volumes:
cache-data:$ sh0 compose validate docker-compose.yml
[ok] Compose file is valid
Services: web, cache
$ sh0 compose deploy --app-name my-stack --wait docker-compose.yml
[*] Deploying compose file 'docker-compose.yml' as 'my-stack'...
[ok] Compose stack 'my-stack' deployed (app ID: 79389ae4-4a59-42a5-b8f6-37a018c95ddc, status: deploying)
[*] Waiting for deployment to complete...
[ok] Deployment completed successfully--var KEY=VALUE(可重复)会替换所有定义了环境变量 KEY 的服务中的该值。
校验内容
以下情况文件会被拒绝:没有任何服务;某个服务没有 image、声明了 build:、端口无效或命令无法解析;或挂载了主机路径(/srv/data:/data、./data:/data)——只允许命名卷。sh0 不读取的键不会被提示:上面的示例能通过校验,尽管其中的 deploy 和 healthcheck 块会被忽略。
Compose 键
sh0 读取的键:
image:必填,从 Docker Hub 或任意镜像仓库拉取。ports:只使用容器端口。按文件顺序第一个声明端口的服务,会通过反向代理获得应用的公开地址。你写的主机端口不会在服务器上开放。environment:映射或列表形式均可。volumes:仅限命名卷。应用my-stack的卷cache-data会以sh0-my-stack-cache-data的名称创建,重启后数据保留。depends_on:启动顺序,列表形式或扩展形式均可。command:字符串或列表。mem_limit和cpus:服务的内存和 CPU 限制。这是 sh0 唯一读取的资源键。
被忽略的键
deploy(包括 deploy.resources)、healthcheck、entrypoint、restart、labels 和 networks 会被接受但忽略。每个容器的重启策略都是 unless-stopped,未设置 mem_limit 或 cpus 的服务使用默认限制。在示例栈中,写在 deploy.resources 下的 64 MB 限制没有生效,而 mem_limit: 128m 生效了:
$ docker inspect -f "{{.Name}} mem={{.HostConfig.Memory}} nanocpus={{.HostConfig.NanoCpus}} restart={{.HostConfig.RestartPolicy.Name}}" \
sh0-17b83e1c-my-stack-web sh0-17b83e1c-my-stack-cache
/sh0-17b83e1c-my-stack-web mem=536870912 nanocpus=1000000000 restart=unless-stopped
/sh0-17b83e1c-my-stack-cache mem=134217728 nanocpus=500000000 restart=unless-stopped网络
栈内各服务共享一个私有网络,并通过服务名互相访问:在示例中,cache 容器可以从 http://web:80 得到响应。只有持有公开地址的服务能从外部访问。
管理服务
该栈在 sh0 apps 和控制面板中显示为一个应用。其服务可通过 GET /api/v1/apps/<app-id>/services 列出,并可用 POST /api/v1/apps/<app-id>/services/<service-id>/restart(或 /stop、/start)逐个重启、停止或启动。
修改已部署的栈
1.10.2 版本无法把新版 Compose 文件应用到已存在的栈。以相同名称再次部署会被拒绝,重新部署该应用也会因为没有仓库而失败:
$ sh0 compose deploy --app-name my-stack docker-compose.yml
[*] Deploying compose file 'docker-compose.yml' as 'my-stack'...
Error: An app with name 'my-stack' already exists (VALIDATION_ERROR)
$ sh0 deploy my-stack --wait
[*] Deploying my-stack...
Deployment ID: 34f99c19-adda-4a30-a1dc-4e670a3ff505
Status: queued
[*] Waiting for deployment to complete...
error: Deployment failed.
# Build log of that deployment:
[STEP 1/6] Cloning repository
[ERROR] App has no repository URL configured这些失败不会影响正在运行的服务。要修改栈,请以新名称部署新文件,迁移流量和数据,然后删除旧应用;sh0 delete 会删除应用及其资源。
environment 中保留占位值,部署时再用 --var 设置真实值。