全栈小白的gravatar头像
全栈小白 2023-03-19 20:50:07
【docker】- docker-network的使用及配置

--前言--

我们在项目部署时,往往会部署多台容器,例如: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

【docker】- docker-network的使用及配置

言归正传

首先说说我们的实验期望

  1. 启动两个容器,假设第一个的ip是172.12.0.2,第二个的ip是172.12.0.3,在未指定网卡的前提下,默认桥接到docker0网卡,那他们的ip之间是可以互通的

  2. 那么如果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

【docker】- docker-network的使用及配置

查看mysql的容器ip

docker inspect docker-network-mysql  # 172.17.0.2

进入docker-network-centos容器,使用ping命令测试容器ip通信是否正常

【docker】- docker-network的使用及配置那我们试试容器名呢?答案是不可以的

【docker】- docker-network的使用及配置常用命令

  • docker network create 网络名称 创建自定义网络

  • docker network connect 网络名称 容器名称 连通网络与容器

  • docker network ls 查看网络列表

创建一个网卡名为 docker-network

【docker】- docker-network的使用及配置连通docker-network-centos、docker-network-mysql

【docker】- docker-network的使用及配置进入docker-network-centos容器,使用ping命令ping docker-network-mysql

【docker】- docker-network的使用及配置看到了吗,是通的,分配的ip为172.19.0.3,简单分析一下,看下图

【docker】- docker-network的使用及配置

使用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不想暴露端口,那我可以这样启动

【docker】- docker-network的使用及配置

发现了没有,没有-p参数,意味着这台mysql没有对外暴露端口,你通过10.10.10.10无法连接(端口都没有暴露)

但是我告诉你,在docker-network-mysql容器中(选择它是因为里面有mysql环境),我可以连接到,它的端口就是3306,默认的

【docker】- docker-network的使用及配置

那有些小伙伴还会有个问题,那我通过10.10.10.10:3306可以吗,答案是不可以,3306端口已经分配给docker-network-mysql了,docker-network-mysql-2压根就没有绑定宿主机端口,既然没暴露,就不存在外网攻击了


打赏

已有1人打赏

最代码官方的gravatar头像
最近浏览
流水本无情  LV9 3月13日
deluser  LV3 2023年10月3日
凌秋枫  LV8 2023年8月28日
shaoqi 2023年7月26日
暂无贡献等级
444105047  LV6 2023年7月21日
budaga  LV1 2023年7月21日
微信网友_6568795145506816  LV1 2023年7月19日
13232875251  LV14 2023年7月17日
最代码_码鑫源  LV6 2023年7月11日
3263394665  LV9 2023年6月30日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友