您现在的位置是:首页 >技术教程 >Docker Compose网络系列--网络的配置网站首页技术教程

Docker Compose网络系列--网络的配置

IT利刃出鞘 2023-05-12 20:05:56
简介本文介绍Docker Compose的网络的配置。

原文网址:Docker Compose网络系列--网络的配置_IT利刃出鞘的博客-CSDN博客

简介

说明

        本文介绍Docker Compose的网络的配置。

官网网址

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

compose的默认配置

        默认情况下,Compose会为应用创建一个网络,服务(docker-compose.yaml中的services项)的每个容器都会加入该网络中。这样容器就可被该网络中的其他容器访问,而且该容器还能以服务名称作为hostname被其他容器访问。

默认的网络

例如, 假设有一个项目,目录名myapp, docker-compose.yml 配置如下:

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

当执行 docker-compose up 的时候。会发生以下事情:

  1. 会创建一个名字是 myapp_default的网络(networks)
  2. web这个容器会加入到 myapp_default网络中,并且在网络中的名称为:web 。
  3. db这个容器会加入到 myapp_default网络中,并且在网络中的名称为:db。

        这里每个容器都能通过应用名找到对方,例如,web容器可以通过 postgres://db:5432 来使用 Pg数据库。

        上面例子有一个注意点就是端口号,注意区分HOST_PORT和CONTAINER_PORT,以上面的db为例:8001 是宿主机的端口,5432(postgres的默认端口) 是容器的端口,当容器之间通讯时, 是通过 CONTAINER_PORT 来连接的。这里有宿主机端口,那么容器就可以通过宿主机端口和外部应用连接。

更新容器

        当服务的配置发生变更时,可使用docker-compose up命令更新配置。

        此时,Compose会删除旧容器并创建新容器。新容器会以不同的IP地址加入网络,名称保持不变。任何指向旧容器的连接都会被关闭,容器会重新找到新容器并连接上去。

links

        默认情况下,服务之间可使用服务名称相互访问。links允许定义一个别名,从而使用给别名访问其他服务。

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

这样Web服务就可使用db或database作为hostname访问db了。

指定自定义网络

概述

        有时默认的网络配置满足不了需求,可使用一级配置中的networks选项自定义网络。

        networks选项允许创建更复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,还可使用networks将服务连接到外部创建的而且不是由Compose管理的网络。

        每个service 配置下也可以指定networks配置,来指定一级配置的网络。

示例

        下边的配置中,proxy与db服务隔离(不能通讯,因为不在一个网络中),app服务可与两者通信。使用networks命令,可方便实现服务间的网络隔离与连接。

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

配置默认网络

除自定义网络外,也可配置默认网络。不配置的话,默认是使用:bridge。

示例

        下边的配置中,将应用的默认网络指定为一个自定义网络(custom-driver-1)。

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

指定一个已经存在的网络 

        如果多个容器不在同一个配置中(不在一个应用里),也可以进行网络通信。方法是:

第1步:

第2步:使用external选项。方法如下:

services:
  # ...
networks:
  default:
    name: my-pre-existing-network
    external: true

或者:

services:
  # ...
networks:
  default:
    external:
      name: my-pre-existing-network

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。