docker-compose 网络

docker-compose 网络

February 27, 2024·wylu
wylu

Default network

默认情况下,Compose 会创建一个网络,服务的每个容器都会加入该网络中,这样容器就可被网络中的其它容器访问。容器还能以服务名称作为hostname被其它容器访问。

​ 应用程序的网络名称基于 Compose 的工程名称,而项目名称基于docker-compose.yml所在目录名称。如需修改工程名称,可使用 --project-name 标识或 COMPOSE_PORJECT_NAME 环境变量。

docker-compose.yml
# 位于software目录下
version: "2"
services:
  web:
    build: ..
    ports:
      - "8000:8000"
  db:
    image: postgres

当执行docker-compose up指令时,将会分为一下几步:

  • 创建一个名为software_default的网络;
  • 使用 web 服务的配置创建容器,并以web名称加入上述创建的网络;
  • 使用 db 服务的配置创建容器,并以db名称加入网络;

容器间可以使用服务名称(webdb)作为 hostname 互相访问。例:web 服务可通过 postgres://db:5432访问 db 容器。

Custom network

一些场景下,默认的网络配置无法满足使用需求,可通过 networks 命令自定义网络。还可以使用 networks 将服务连接到不是由 Compose 管理的、外部创建的网络。

docker-compose.yml
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"

其中,proxy 服务与 db 服务隔离,两者分别使用自己的网络,app 服务可与两者通信。使用networks命令,即可方便实现服务间的网络隔离与连接。

配置默认网络

docker-compose.yml,hl_lines=[1,2]
version: "2"

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

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

links

服务之间可以使用服务名称互相访问。links 允许定义一个别名,从而使用该别名访问服务。

docker-compose.yml
version: "2"
services:
  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

web 服务可以使用 db 或 database(alias)作为 hostname 访问 db 服务。

network_mode

bridge(默认模式)

这是 Docker 的默认网络模式。每个容器在 Docker 内部的桥接网络上运行,并通过 NAT 访问外部网络。

version: '2'
services:
  node-manager-web:
    image: harborbaas.zkjg.com:4443/baas/web:latest
    user: root
    network_mode: bridge
    ports:
      - "3000:80"
    volumes:
      - $PWD/web/nginx.conf:/etc/nginx/nginx.conf

host

容器将与主机共享网络栈。这种模式适用于需要高性能或需要直接访问主机网络的场景。

version: '2'
services:
  node-manager-web:
    image: harborbaas.zkjg.com:4443/baas/web:latest
    user: root
    network_mode: host
    volumes:
      - $PWD/web/nginx.conf:/etc/nginx/nginx.conf

none

容器将没有任何网络连接。这种模式适用于不需要网络连接的容器。

container:<name|id>

容器将与指定的另一个容器共享网络栈。两个容器之间可以直接通信。

version: '2'
services:
  node-manager-web:
    image: harborbaas.zkjg.com:4443/baas/web:latest
    user: root
    network_mode: "container:another_container"
    volumes:
      - $PWD/web/nginx.conf:/etc/nginx/nginx.conf

自定义网络名称

最后更新于