Skip to content

07.Docker Compose 2

我们将上节分批启动的容器汇总到一个 Docker-compose 文件中,新建一个 docker-compose.yml 文件,内容如下:

yml
version: '3'
services:
  redis:
    # 服务的名称,后面要使用该服务即使用此名称,如 vote 中的 -redis:redis 中的第一个 redis 既是该名称
    image: redis:alpine
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
  vote:
    image: voting-app
    ports:
      - 5000:80
    links:
      - redis:redis
  worker:
    image: worker-app
    links:
      - db:db
      - redis:redis
  result:
    image: result-app
    ports:
      - 5001:80
    links:
      - db:db

然后命令执行:

bash
docker-compose up

即可启动这些容器,访问浏览器,将得到和上节相同的效果。

使用 Docker compose 部署时,会自动创建一个网络,可以从这里的输出中看到:

cmd
[+] Running 6/6
 ✔ Network study-compose_default     Created                                                                                      0.1s 
 ✔ Container study-compose-worker-1  Created                                                                                      0.7s 
 ✔ Container study-compose-result-1  Created                                                                                      0.7s 
 ✔ Container study-compose-db-1      Created                                                                                      0.7s 
 ✔ Container study-compose-redis-1   Created                                                                                      0.7s 
 ✔ Container study-compose-vote-1    Created                                                                                      0.7s

这里创建的网络名称为 study-compose_default ,当然也可以在启动时在指令中显式指定。

另外,不需要显式的指定 links 选项,在 3.x 及以上版本的 Docker compose 不再强制要求指定 links ,Docker Compose 会自动为同一网络中的容器提供DNS 解析功能,容器可以直接使用主机名 redis 来访问 redis 服务(如果容器内部使用的名称和 compose 文件中定义的不同,仍需要使用 links 选项):

yml
version: '3'
services:
  redis:
    image: redis:alpine
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
  vote:
    image: voting-app
    ports:
      - 5000:80
  worker:
    image: worker-app
  result:
    image: result-app
    ports:
      - 5001:80