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_back和myApp_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。我看到这两个词使我感到困惑。例如,这是一个docker-compose,它定义了两个服务和。 该文件定义了一个名为lognet的桥接网络,所有服务都将连接到该网络。据我了解,此操作使那些服务可以看到其他服务。那么在上述情况下,为什么应用程序服务仍需要链接到Redis服务。 谢谢 问题答案: 链接已被网络取代。Docker将它们描述为您应避免使用的旧功能。您可以安
以太网连接 在启动时,Slitaz默认会在eth0上启动一个DHCP连接。如果你的网卡被识别为eth0,你又使用路由器,你的连接应该会正常工作。在每次启动 时,连接将会向DHCP服务器请求一个和路由器或者其它电脑结合在一起的新IP地址。如果你需要一个静态IP地址,你可以直接编辑配置文件或者使用 netbox,netbox可以从菜单-系统工具里找到。在Linux命令行或者终端里,你可以用ifconf
本文向大家介绍浅谈vue2 单页面如何设置网页title,包括了浅谈vue2 单页面如何设置网页title的使用技巧和注意事项,需要的朋友参考一下 前端框架如Vue、React等都是单页面的应用,也就是说整个web站点其实都是一个index页面,所谓的页面跳转都是替换index.html里边的内容,而页面的title是在每个页面初始化的时候才设置一次。对于现在的前端框架,传统的每个页面设置titl
本文向大家介绍浅谈pytorch torch.backends.cudnn设置作用,包括了浅谈pytorch torch.backends.cudnn设置作用的使用技巧和注意事项,需要的朋友参考一下 cuDNN使用非确定性算法,并且可以使用torch.backends.cudnn.enabled = False来进行禁用 如果设置为torch.backends.cudnn.enabled =Tru
我想设置一个Docker网络,其中包含keyCloak、postgres和webapp实例。 有没有一种方法可以在容器之间进行网络通信,同时也理解oidc客户端重定向?我有一个问题,容器可以互相交谈只是罚款,如果我设置OIDC容器名称为docker网络,但然后我遇到的问题与客户端,不能连接到这些相同的URL以外的docker网络在主机上机器。 有人能给我指出正确的docker留档来寻找DNS或主机
问题内容: 在Docker中使用自定义网络时 并尝试运行它,我得到了错误 错误:网络服务层已声明为外部,但找不到。请使用手动创建网络,然后重试。 是否可以使用docker-compose自动创建网络,还是除了首先手动创建网络外没有其他方法? 问题答案: 是使用现有网络。如果您想组成网络,只需执行以下操作: ..指示组成网络。它们将被命名为使用验证创建。 您还可以覆盖默认网络或指定更多属性。 ..将