[转]docker-compose的网络networks的使用技巧
原文地址:docker-compose的网络networks的使用技巧 - 知乎
1. 介绍
1.1 介绍
前面福哥通过一篇《docker-compose学习笔记》带着大家把docker-compose的基础知识简单的学习了一番,之所以我们使用docker-compose而不是自己用docker去搞是因为docker-compose给我们提供了很多便利的功能,这些功能可以让我们更好的理解使用Docker部署服务器环境时候的一些对象的概念和特点。
docker-compose的service概念非常好,可以让我们把一个一个的容器抽象成一个一个的服务,每个服务之间存在了一定的关系,我们可以通过service的名称组织服务之间的关系而不用去关心服务背后的容器。
有些时候我们希望一些服务只能被一组特定的服务访问,这个时候使用只依靠默认的网络就行不通了,那么我们就需要根据自己的情况搭建我们的服务组的网络架构,就会用到docker-compose的networks功能了。
2. 类型
2.1 default
默认情况下docker-compose会建立一个默认的网络,名称为docker-compose.yml所在目录名称小写形式加上“_default”,我们的TFLinux环境就是“tflinux_default”。
这个默认网络会对所有services下面的服务生效,所以services下面的各个服务之间才能够通过service名称互相访问。
如果要自定义默认网络可以针对“default”网络进行设置,这样就会影响导默认网络了。
networks:
default:
driver: bridge
2.2 自定义
除了默认网络之外,我们也可以建立自定义的网络,这个网络名称就比较随意了。
networks:
persist:
driver: bridge
2.3 已存在网络
有时候我们想使用我们通过docker network create创建好的网络,而不是让docker-compose创建一个新的,这个时候就需要用到“external”关键字了。
networks:
persist:
external:
name: bridge2
3. 案例
3.1 所有服务互通
要实现这个就非常容易了,因为有默认网络的存在,所以我们什么都不配置,在services下面的服务的容器里面都可以通过service名称访问其端口,前提是service需要通过ports发布它的端口出来。
services:
# mysql
mysql:
build:
dockerfile: Dockerfile
context: ./image/mysql5.7
container_name: mysql
image: tflinux-mysql5.7
networks:
- default
- persist
volumes:
- /tongfu.net/env/mysql-5.7.28/data/:/var/lib/mysql/
restart: always
3.2 宿主机访问服务端口
通过docker-compose的默认网络就可以在宿主机上面访问服务的端口,但是docker-compose的默认网段是每次都会变化的。要想解决这个问题就只能通过在宿主机上面建立一个固定网段的网络,然后指定服务的网络为这个已经存在的网络,这样宿主机就可以通过这个网络的网关访问服务的端口了。
创建固定网段的网络bridge2。
docker network create --subnet=10.16.1.0/16 --gateway=10.16.1.1 --opt "com.docker.network.bridge.name"="bridge2" bridge2
把bridge2网络配置导docker-compose里面。
networks:
default:
driver: bridge
persist:
external:
name: bridge2
给需要放开的服务增加default、persist两个网络。
注意:因为我们指定了persist特殊网络,所以default默认网络就自动失效了,如果需要使用default网络需要显性地指定下。
services:
# mysql
mysql:
build:
dockerfile: Dockerfile
context: ./image/mysql5.7
container_name: mysql
image: tflinux-mysql5.7
networks:
- default
- persist
volumes:
- /tongfu.net/env/mysql-5.7.28/data/:/var/lib/mysql/
restart: always
3.3 服务访问宿主机端口
首先福哥不提倡这样使用,因为宿主机被访问是一种很危险的行为!
如果一定要访问宿主机的端口,可以通过服务网络的网关IP地址实现,前提是宿主机的端口绑定的是全部IP地址。
4. 总结
今天童鞋们跟着福哥对docker-compose的networks有了一个了解,使用networks搭建复杂的应用服务组,即安全,又方便。