• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    浅谈docker-compose网络设置之networks

    networks使用方式之官网教程

    官网的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: db1234567891011121314
    
    

    使用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
    12345678910
    
    

    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"123456789101112131415161718192021222324252627

    值得注意的是,这里定义了back和front两个网络,似乎它们的名字就定义成了back和font,但是你使用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-11234567891011121314

    4. 使用已存在的网络

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

    遇到的问题

    学习了上面的东西,笔者准备将自己的项目付诸实践。我的项目包含了两个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: app12345678910111213141516171819202122232425262728293031323334353637383940414243

    另一个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: true123456789101112131415161718192021222324252627282930313233343536373839

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

    $ docker network create app1

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

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

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

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

    networks:
      mysql_app:
       driver: bridge123

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

    其他的一些用法

    使用aliases代替link

    一般的使用格式如下:

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

    在下面的例子中,我的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:123456789101112131415161718192021222324252627
    
    

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

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

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    上一篇:详解Docker-compose networks 的例子
    下一篇:在Ubuntu Linux上安装和使用Git和GitHub
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    浅谈docker-compose网络设置之networks 浅谈,docker-compose,网络,设,