原文地址:https://docs.docker.com/compose/networking/

以下介绍Compose网络特性仅适用于Compose-file2格式,在version1不支持。

如不指定项目名称,Docker-Compose默认以当前文件目录名作为应用的项目名(ProjectName)
Docker-Conpose为你的应用创建一个网络,Docker-Compose为每个Service创建一个容器,并加入到这个网络中,被网络中的其它容器访问和发现。此容器能够以容器名称作为hostname标识,被其它容器访问。

注:Docker-compose命令中通过--project-name-p参数来指定项目名称,也可以指定环境变量COMPOSE_PROJECT_NAME

示例说明docker-compose创建资源

docker-compose.yml

version: '2'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

myapp目录使用命令docker-compose up,将执行以下几步:
+ 创建一个名为myapp_default的网络
+ 以服务名(web、db)分别创建两个容器,添加到myapp_default网络中
+ 容器以服务名(web、db)作为其hostname相互访问,如web可以postgres://db:5432访问db容器

由于Service与容器对应,以下将Docker-Compose创建的容器简称为Service。

更新容器

使用docker-compose up将停止并移除旧容器,重建新容器。
任何连接到旧容器的(其它容器的)连接将关闭,然后检测条件,根据容器名称查找并重建连接。

默认情况下,Docker-Compose下的Servcie之间是可通过服务名称(容器名称,也即hostname)相互访问的。
links只不过为Service提供了以别名访问其它Service的一种方式。

跨主机网络

当把Compose部分到Swarm集群时,可利用Swarm内置的overlay驱动实现不同主机间容器访问,
无需改变Compose文件或应用程序代码。

如何将Comnpose应用到Swarm集群?

networks关键字指定自定义网络

compose file中顶级networks关键字,可以用来创建更加复杂的网络拓扑,指定自定义网络驱动和选项,
也可以用它来连接外部创建(非Compose创建)的网络。
每个Service可通过service内部的networks关键字来指定它要使用的顶级网络。
给Service指定networks的好处是,实现网络隔离或连接

version: '2'

services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back

networks:
  front:
    # Use a custom driver
    driver: custom-driver-1
  back:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
Networks can be c

配置默认网络

version: '2'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

使用已存在的网络

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

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐