【docker】

09-10 游戏 投稿:进迎丝
我们在项目部署时,往往会部署多台容器,例如: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/initdocker 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-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压根就没有绑定宿主机端口,既然没暴露,就不存在外网攻击了

标签: # docker
声明:生活头条网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系admin@gdcyjd.com