docker compose配置 network

发布时间 2023-11-04 01:09:18作者: youxin

docker-compose配置networks

默认网络

例如, 假设有一个项目,目录名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_PORTCONTAINER_PORT,以上面的db为例:

  • 8001 是宿主机的端口
  • 5432(postgres的默认端口) 是容器的端口

当容器之间通讯时 , 是通过 CONTAINER_PORT 来连接的。

这里有宿主机端口,那么容器就可以通过宿主机端口和外部应用连接。

更新容器

对已经启动的容器,再执行 docker-compose up 的时候,旧容器删除,然后创建一个新的容器。

新容器会加入到网络,相同的网络名称,但容器IP是不一样的。已经连接的其他容器会自己重连到新的容器IP上。

自定义网络

可能通过一级配置networks来自定义网络,可以创建更复杂的网络选项和配置,也可以用来连接已经存在的网络(不是通过compose创建的)

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

例如:

version: "3"
services:

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

networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
  1. 一级配置networks 用来创建自定义的网络 。这里配置了两个frontendbackend . 且自定义了网络类型。
  2. 每一个serviceg下,proxy , app , db都定义了一下networks配置。
    1. proxy 只加入到 frontend网络。
    2. db 只加入到backend网络。
    3. app同时加入到 frontendbackend
    4. dbproxy不能通讯,因为不在一个网络中。
    5. app和两个都能通讯,因为app在两个网络中都有配置。
    6. dbproxy要通讯,只能通过app这个应用来连接。

配置默认网络

不指定网络时,默认的网络也是可以配置的。不配置的话,默认是使用:brige,也可以修改为其他 的。

version: "3"
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

这里name就是指定已经存在的网络名称。



作者:_孙行者_
链接:https://www.jianshu.com/p/3004fbce4d37
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

先,我们需要理解Docker Compose文件中的“networks”部分。这个部分允许我们定义一个或多个自定义网络,并指定每个服务应该连接到哪些网络。

例如:

version: '3'
services:
  web:
    build: .
    networks:
      - mynet
networks:
  mynet:

上述代码创建了一个名为“mynet”的自定义网络,并指定了web服务将连接到这个网路。

接下来就是IP和主机名(hosts)设置问题了。默认情况下,在同一docker-compose文件内创建的所有容器都会被添加到同一默认网路上,并且可以通过其服务名称作为主机名相互通信。

然而,在某些情况下,默认设置可能无法满足需求,比如你可能需要手动设定某些容器或者服务的IP地址和主机名映射关系等等。这时候就可以使用docker-compose文件内 extra_hosts字段来进行手动设定:

version: '3'
services:
  webapp1: 
    image: myapp1 
    extra_hosts: 
      - "somehost:162.242.195.82"
      - "otherhost:50.31.209.229"

在这个例子中,我们为webapp1服务添加了两个额外的主机名映射。这样,webapp1服务内的应用程序就可以通过主机名"somehost"和"otherhost"来访问对应的IP地址。

如果你需要为某个服务指定一个静态IP地址,可以在网络配置中使用 ipv4_address或者 ipv6_address字段:

version: '3'
services:
  web:
    image: nginx
    networks:
      mynet:
        ipv4_address: 172.20.0.5

networks:
  mynet:
    ipam:
      config:
        - subnet: 172..20..0..0/16

在上述例子中,我们创建了一个自定义网络mynet,并且指定了其子网。然后我们为web服务分配了一个静态IP地址。

总结一下,在Docker Compose中进行网络配置和设置IP、主机名并不复杂。只需要理解并合理使用Docker Compose文件内相关字段即可满足大部分需求。希望本文能帮助你更好地理解和使用Docker Compose进行网络配置。

注意:以上所有操作都需要根据实际情况进行调整,并确保所有设置都符合你的实际需求和环境限制。

 

 

docker-compose 容器固定IP(network subnet)

由于默认的bridge桥接网络,重启容器后会改变ip地址。在一些场景下我们希望固定容器IP地址。
docker-compose是docker的一个编排工具,相对于命令模式创建网络,容器等。使用配置文件相对来说更方便,可追溯问题。

docker-compose.yml  参考官网 https://docs.docker.com/compose/compose-file/#network-configuration-reference

 

https://www.cnblogs.com/BillyLV/articles/12896624.html