docker-compose网络设置之networks的使用

 更新时间:2024年10月13日 11:14:10   作者:Kiloveyousmile  
本文详细解释了在使用 Docker Compose时如何配置网络,包括创建、使用和问题解决等方面,介绍了如何通过docker-compose.yml文件快速编排和部署应用服务,同时解决网络隔离问题,感兴趣的可以了解一下

官网的docker-compose.yml参考文档:Compose file version 3 reference

较为准确的中文翻译版:Compose file version 3 reference  

networks通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行,从而解决网络隔离问题。这种应用在swarm部署中,非常常见。不过,本文并不做讨论。

一般对于集群服务,常常通过docker-compose.yml文档快速编排、部署应用服务。官网中给出了如下的使用场景和方式:

1. 未显式声明网络环境的docker-compose.yml

例如,在目录app下创建docker-compose.yml,内容如下:

version: '3'
services:
  web:
    mage: nginx:latest
    container_name: web
    depends_on:
      - db
    ports:
      - "9090:80"
    links:
      - db
  db:
    image: mysql
    container_name: db

使用docker-compose up启动容器后,这些容器都会被加入app_default网络中。使用docker network ls可以查看网络列表,docker network inspect <container id>可以查看对应网络的配置。

$ docker net work ls
NETWORK ID          NAME                     DRIVER              SCOPE
6f5d9bc0b0a0        app_default              bridge              local
0fb4027b4f6d        bridge                   bridge              local
567f333b9de8        docker-compose_default   bridge              local
bb346324162a        host                     host                local
a4de711f6915        mysql_app                bridge              local
f6c79184ed27        mysql_default            bridge              local
6358d9d60e8a        none                     null                local

2. networks关键字指定自定义网络

例如下面的docker-compose.yml文件,定义了front和back网络,实现了网络隔离。其中proxy和db之间只能通过app来实现通信。其中,custom-driver-1并不能直接使用,你应该替换为host, bridge, overlay等选项中的一种。

version: '3'

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"

值得注意的是,这里定义了backfront两个网络,似乎它们的名字就定义成了backfont,但是你使用docker network ls命令并不能找到它们。假如你是在myApp目录下运行的docker-compose up命令,那么这两个网络应该分别对应myApp_backmyApp_front

3. 配置默认网络

version: '2'

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

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

4. 使用已存在的网络

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

遇到的问题

学习了上面的东西,笔者准备将自己的项目付诸实践。我的项目包含了两个docker-compose.yml,且使用了links选项,所以必须使用networks配置。

其中,一个docker-compose.yml用于启动mysql服务,位于mysql/目录下:

 version: "3"
services:
  dbmaster:
    image: master/mysql:latest
    container_name: dbmaster
    ports:
      - "3308:3306"
    volumes:
      - $HOME/Work/data/dbmaster:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: master
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20"
    networks:
      - app

  dbslave:
    image: slave/mysql:latest
    container_name: dbslave
    ports:
      - "3309:3306"
    depends_on:
      - dbmaster
    volumes:
      - $HOME/Work/data/dbslave:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: slave
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20"
    links:
      - dbmaster
    networks:
      - app
networks:
   default:
    external:
      name: app

另一个docker-compose.yml用于启动服务程序,位于cloudgo/目录下:

version: "3"
services:
  web:
    image: nginx:latest
    container_name: web
    depends_on:
      - cloudgo
    ports:
      - "9090:80"
    volumes:
      - $HOME/Work/docker/docker-compose/nginx/conf.d:/etc/nginx/conf.d
    links:
      - cloudgot
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20"
    networks:
      - app

  cloudgo:
    image: cloudgo:latest
    container_name: cloudgo
    ports:
      - "8080:8080"
    logging:
      driver: "json-file"
      options:
        max-size: "1000k"
        max-file: "20" 
    external_links:
      - dbmaster
      - dbslave
    networks:
      - app
networks:
  app:
    external: true

我决定使用预先创建的网络,然后把他们加入这个已经创建好的网络,从而实现通信。为此,我运行了如下命令:

$ docker network create app

之后,开始运行编写好的docker-compose.yml文件。首先运行启动mysql的配置文件,结果如下:

l$ docker-compose up
ERROR: Service "dbmaster" uses an undefined network "app"

明明已经创建好了,却还是报了错,说该网络未定义。尝试改变名称mysql_app,但是依旧报出同样的错误。最终证明,这种方法无法实现,至今没有找到官方文档给出的例子。

所以,最终决定将第一个docker-compose.yml文件中的networks配置改为如下内容:

networks:
   mysql_app:
     driver: bridge

在这个文件中定义一个网络,以便在后面使用。这里修改完毕,该文件其他地方凡是引用到了该网络的地方均要作出相同的修改。同样,第二个文件也一样。

其他的一些用法

使用aliases代替link

一般的使用格式如下:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

在下面的例子中,我的web容器可以直接通过database:3306或者db:3306访问db容器了。它们同时属于一个网络,并且db设置了主机别名,所以这样的访问方式是完全可以的。

version: '2'

services:
  web:
    depends_on:
      - worker
    networks:
      - new

  worker:
    depends_on:
      - db
    networks:
      - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql
networks:
  new:
  legacy:

此时直接使用depends_on已经不再需要link,如果woker需要访问db,可以直接通过mysql:port的方式。
使用networks的要点在于:

1. 注意自定义网络的方式
2. 注意docker-compose.yml文件的位置与网络默认命名的关系
3. 注意遇到问题尝试几种替代方式去解决

到此这篇关于docker-compose网络设置之networks的使用的文章就介绍到这了,更多相关docker compose networks内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker容器修改端口和目录映射的方法步骤

    docker容器修改端口和目录映射的方法步骤

    在使用Docker时,容器的端口映射是一个核心概念,它允许容器与宿主机以及外部网络进行通信,这篇文章主要介绍了docker容器修改端口和目录映射的方法步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • 使用dockercompose搭建springboot-mysql-nginx应用

    使用dockercompose搭建springboot-mysql-nginx应用

    这篇文章主要介绍了使用dockercompose搭建springboot-mysql-nginx应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Docker镜像导出与导入与拷贝实例分析

    Docker镜像导出与导入与拷贝实例分析

    在本篇文章里小编给大家整理的是关于Docker镜像导出与导入与拷贝实例分析,有需要的朋友们可以参考下。
    2020-02-02
  • Docker启动mysql服务的实现步骤

    Docker启动mysql服务的实现步骤

    本文主要介绍了Docker启动mysql服务的实现步骤,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Docker Desktop启动后容器自启动关闭指南

    Docker Desktop启动后容器自启动关闭指南

    在使用 Docker Desktop 的时候,有些容器会在每次启动 Docker Desktop 后自动启动,但是这个服务我并不是每次都需要用,所以希望它不要跟随 Docker Desktop 自动启动,而是在需要的时候手动启动,所以本文给大家介绍了Docker Desktop启动后容器自启动关闭方法
    2026-06-06
  • docker快速搭建私有镜像仓库registry以及registryUI方式

    docker快速搭建私有镜像仓库registry以及registryUI方式

    本文详细介绍了如何在Windows系统上使用Docker搭建私有镜像仓库,并通过registry-web界面进行管理,内容包括环境准备、搭建步骤及上传和下载镜像的操作
    2024-12-12
  • 将Docker的根目录迁移到其他挂载盘的详细流程

    将Docker的根目录迁移到其他挂载盘的详细流程

    Docker默认将所有容器、镜像、数据卷等内容存放在 /var/lib/docker 下,随着业务增长,该目录很容易撑爆根分区,所以本文将教你如何将 Docker 的根目录迁移到其他挂载盘并保持原有容器、镜像、数据卷不丢失,需要的朋友可以参考下
    2025-08-08
  • 通过容器技术(docker)部署MySQL读写分离

    通过容器技术(docker)部署MySQL读写分离

    Mycat作为开源数据库中间件,在MySQL读写分离架构中发挥核心作用,通过智能代理层实现读写请求的自动路由、负载均衡与故障转移,从而提高系统性能和可用性
    2026-01-01
  • Docker link实现容器互联的方式

    Docker link实现容器互联的方式

    通过link方式创建容器,然后我们可以使用被link容器的别名进行访问。本文重点给大家介绍Docker link实现容器互联的方式,感兴趣的朋友一起看看吧
    2021-12-12
  • Docker搭建Elasticsearch集群和Kibana全过程

    Docker搭建Elasticsearch集群和Kibana全过程

    这篇文章主要介绍了Docker搭建Elasticsearch集群和Kibana全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论