--前言--
我们在项目部署时,往往会部署多台容器,例如:java项目的上线,肯定会有数据库吧(举个例子,数据库并不会容器化),那多台容器之间要怎样通信呢
正常的思路来说呢,tomcat暴露8080端口,mysql暴露3306,tomcat通过127.0.0.1:3306与mysql进行连接
完全可以实现,但是有个问题哈,127.0.0.1:3306这样也就意味着3306端口开放了,公网ip+端口也可以连接你的数据库,数据库很可能遭到攻击,被暴力破解
那有没有一种方式,数据库只能让tomcat进行访问,公网无法访问,答案是有的
在实际部署中,服务端只会暴露网关,各服务、组件之间均是内网访问
docker容器也是有ip的,安装docker后会有一个docker0网卡,每启动一个docker容器,docker就会给docker容器分配一个ip,都是桥接在这个网卡上面
命令:docker inspect 容器id
言归正传
首先说说我们的实验期望
-
启动两个容器,假设第一个的ip是172.12.0.2,第二个的ip是172.12.0.3,在未指定网卡的前提下,默认桥接到docker0网卡,那他们的ip之间是可以互通的
-
那么如果ip发生了变化,就会导致容器之间无法通信,我们使用自定义网络实现容器名网络互通,使用容器名进行通信
下面我们先执行两条命令,创建一个centos(tomcat容器中无ping命令,需要自行安装),一个mysql
docker run -d -p 5022:22 --privileged --name docker-network-centos centos:8 /usr/sbin/init docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name docker-network-mysql mysql:5.7
查看mysql的容器ip
docker inspect docker-network-mysql # 172.17.0.2
进入docker-network-centos容器,使用ping命令测试容器ip通信是否正常
-
docker network create 网络名称 创建自定义网络
-
docker network connect 网络名称 容器名称 连通网络与容器
-
docker network ls 查看网络列表
创建一个网卡名为 docker-network
连通docker-network-centos、docker-network-mysql
进入docker-network-centos容器,使用ping命令ping docker-network-mysql
看到了吗,是通的,分配的ip为172.19.0.3,简单分析一下,看下图
使用inspect查看容器详情,绑定了两块网卡,因为我们使用的是连通,刚才的通信实际是第二块网卡在通信
大伙会有疑问哈,这有什么用?
我给大家举两个例子
1、下面这个配置熟悉吗,mysql的配置文件呗,ip写死明显不,如果部署了,ip有变化,重新改呗
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://120.3.34.134:10086/cxs_currency_sys?useUnicode=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: cxs_currency_sys password: cxs2022 database: cxs_currency_sys type: com.alibaba.druid.pool.DruidDataSource
那自定义网络之后,就可以这样写,一下子就高大上了
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://docker-network-mysql:3306/cxs_currency_sys?useUnicode=true&useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: cxs_currency_sys password: cxs2022 database: cxs_currency_sys type: com.alibaba.druid.pool.DruidDataSource
2、假设我这个mysql不想暴露端口,那我可以这样启动
发现了没有,没有-p参数,意味着这台mysql没有对外暴露端口,你通过10.10.10.10无法连接(端口都没有暴露)
但是我告诉你,在docker-network-mysql容器中(选择它是因为里面有mysql环境),我可以连接到,它的端口就是3306,默认的
那有些小伙伴还会有个问题,那我通过10.10.10.10:3306可以吗,答案是不可以,3306端口已经分配给docker-network-mysql了,docker-network-mysql-2压根就没有绑定宿主机端口,既然没暴露,就不存在外网攻击了