Skip to content

一、基本概念

Docker Compose 默认为应用创建网络,使各容器可通过服务名作为hostname相互访问。应用网络名称基于工程名,即docker-compose.yml所在目录名。可通过 --project-name标识或 COMPOSE_PROJECT_NAME环境变量修改工程名。

示例:

假设应用位于 myapp目录,docker-compose.yml内容如下:

yaml
version: '2'
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

执行 docker-compose up时:

  1. 创建名为 myapp_default的网络
  2. 创建web服务容器并加入网络,hostname为"web"
  3. 创建db服务容器并加入网络,hostname为"db"

各容器可通过服务名互访,如web服务可通过 postgres://db:5432访问数据库。

二、更新容器

当服务配置变更时,使用 docker-compose up更新配置。Compose会替换旧容器,新容器IP可能变更但名称保持不变。旧连接会关闭,服务会自动连接到新容器。

通过 links可为服务定义别名:

yaml
version: '2'
services:
  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

这样web服务可同时使用 dbdatabase作为hostname访问数据库。

四、自定义网络

当默认网络配置不满足需求时,可使用 networks自定义网络拓扑:

yaml
version: '2'
services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back
networks:
  front:
    driver: custom-driver-1
  back:
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

在此配置中,proxy与db服务网络隔离,app服务可与两者通信,实现了网络分段。

五、配置默认网络

可为默认网络指定自定义配置:

yaml
version: '2'
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
networks:
  default:
    driver: custom-driver-1

六、使用已存在网络

若需加入已存在的网络而非创建新网络,可使用 external选项:

yaml
networks:
  default:
    external:
      name: my-pre-existing-network

原文地址

不知道写什么