浅谈docker-compose网络设置之networks

作者:Kiloveyousmile 时间:2023-05-11 14:17:19 

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. 注意遇到问题尝试几种替代方式去解决

来源:https://blog.csdn.net/Kiloveyousmile/article/details/79830810

标签:docker,compose,networks
0
投稿

猜你喜欢

  • 如何给你的网站书写标题,从而更有利于SEO

    2009-03-09 11:14:00
  • 域名转入到godaddy教程

    2010-04-22 16:48:00
  • 关键词优化的研究要观念先行

    2008-12-23 14:52:00
  • Windows下打造完美的服务器平台

    2008-10-23 17:47:00
  • 中小网站如何能从广告联盟获取到更多利益

    2008-12-26 13:19:00
  • .htaccess重定向和url重写详细介绍

    2023-10-19 12:22:50
  • 科汛V6.5:加强推广积分互动 增加后台广告

    2009-12-02 14:57:00
  • 如何让你的网站快速获得外链

    2008-05-25 15:02:00
  • Godaddy iis7 windows主机 Discuz7.X伪静态设置

    2010-04-11 13:13:00
  • Serv-U3.0的Domain设置(中)

    2007-11-15 13:26:00
  • 搜索引擎优化之六大细节决定成败

    2007-10-02 12:32:00
  • 站长买虚拟主机的被骗经历

    2008-06-04 12:52:00
  • windows2003 服务器系统权限与安全配置

    2009-11-28 15:34:00
  • 分析称版署通知对中国其他网游公司影响不大

    2009-11-07 07:32:00
  • DEDECMS更换模板的方法

    2009-05-31 17:09:00
  • AdSense for Mobile 设置指南

    2007-09-23 08:15:00
  • WINDOWS服务器安装多套PHP

    2009-02-19 13:09:00
  • DEDE:显示文章上级栏目的名称和链接

    2009-02-15 09:39:00
  • 鼠年祝福短信大全

    2008-02-06 10:55:00
  • Linux 配置WWW服务器全攻略

    2021-07-15 11:02:18
  • asp之家 网站运营 m.aspxhome.com