docker-compose网络设置之networks的示例分析

这篇文章主要介绍了docker-compose网络设置之networks的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

成都创新互联拥有一支富有激情的企业网站制作团队,在互联网网站建设行业深耕十载,专业且经验丰富。十载网站优化营销经验,我们已为上1000家中小企业提供了网站设计、网站制作解决方案,定制网站制作,设计满意,售后服务无忧。所有客户皆提供一年免费网站维护!

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的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!

当前名称:docker-compose网络设置之networks的示例分析
网页URL:https://www.cdcxhl.com/article24/gdojje.html

成都网站建设公司_创新互联,为您提供标签优化外贸网站建设网站维护网站内链网站排名企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站网页设计