这里是对docker compose 网络配置的一些说明,详细的文档参考:

https://docs.docker.com/compose/networking/

1 default network

如果不显式指定,Compose会为每一个app设置一个default网络。每个service的container会加入这个default网络并且能够被这个网络上的其他container访问到,hostname就是container的name,通过这个hostname可以发现container。

注意:

  App的default网络的名字基于yaml文件所在的目录名字命名。可以修改此name使用--project-name flag或者COMPOSE_PROJECT_NAME 环境变量。

 

例子:

假设yaml文件所在的目录名为myapp,内容为:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

当运行docker-compose up命令时,会做一下事情:

  1. 创建一个名为myapp_default 的network
  2. 创建一个container使用web的配置参数,它加入myapp_default network并且hostname为web
  3. 创建一个container使用db的配置参数,它加入myapp_default network并且hostname为db

 

每一个container可以使用hostname web和db访问者两个容器。例如,web中的application可以使用url postgres://db:5432 访问postgre 数据库。

 

2区分HOST_PORT 和CONTAINER_PORT

上面的例子中,dbHOST_PORT8001 CONTAINER_PORT5432. 同一个networkservice之间使用CONTAINER_PORT进行通信, 如果有HOST_PORT, 那么docker之外可以使用HOST_PORT访问服务。

例如,web container内的进程可以使用postgres://db:5432访问db服务。 宿主机上的程序可以使用postgres://{DOCKER_IP}:8001 访问db服务。

 

3更新容器

如果更新了一个docker service的配置,然后运行docker-compose up 更新它, 那么老的container会被删除,新的container会使用一个不同ip加入network但是host name相同。正在运行的container可以通过名字查找并连接到新的ip,老的ip不再工作了。

如果有container仍然存在到老container的连接,这些连接会被关闭。 Container负责检测这种状况并重新连接到新container。

4自定义network

除了使用default 网络,也可以使用networks关键字自定义自己的网络。这样可以创建更复杂的拓扑结构,也可以连接到外部的网络。例如下面的例子,service proxy和db是相互隔离的,因为他们分别加入不同的网络,app可以与他们两个都建立通信。

version: "3"
services:

  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    external: true
driver: custom-driver-1
name: frontend
  backend:
    driver: custom-driver-2
    name: backend

5 docker network常用命令

docker network命令是network相关的操作

主要的命令有:

$ docker network --help

Usage: docker network COMMAND

Manage networks

Commands:

  connect     连接一个container到一个network

  create      创建一个network

  disconnect  从一个network断开container

  inspect     显示network的详细信息

  ls          列出所有的network

  prune      删除不用的networks

  rm         删除一个或多个network

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐