docker网络常见隔离方法常见隔离方法

怎么来隔离或者是说怎么来通讯。怎么在docker下进行我们常见的隔离。怎么去理解呢,我们可以举个例子给大家看下

范例:

1、先将所有的docker正在运行的容器删掉

[15:53:13 root@docker ~]#docker rm -f $(docker ps -a -q)

2、启动两个容器,这里我先启动一个nginx容器,并且进入到该容器中

#启动一个nginx容器
[15:53:20 root@docker ~]#docker run --name nginx -d -p80:80 nginx-1.19.1:alpine-3.12 

#进入到nginx容器中
[15:56:07 root@docker ~]#docker exec -it nginx sh
#在容器中通过ifconfig查看IP
/ # ifconfig 

3、然后再另一个终端上启动一个tomcat的容器并且进入到tomcat容器中

#运行一个docker容器
[16:00:17 root@docker ~]#docker run -it --name tomcat -p8080:8080 -d tomcat-web:app1 bash

#进入到tomcat容器中
[16:00:41 root@docker ~]#docker exec -it tomcat bash

#切换为普通用户,然后启动tomcat服务
[root@a1c3e81ee0bd /]# su www
[www@a1c3e81ee0bd /]$ /apps/tomcat/bin/catalina.sh start
[www@a1c3e81ee0bd /]$ ifconfig 

4、然后在tomcat的容器中ping 172.17.0.2是能通的

这就意味着这两边使用的是对应的程序的话就能够互相的访问了。

但是如果这时候我在docker内构建两个项目,这两个项目之间我不希望它们能够互相访问的话,我们该怎么做呢

我们刚才也说了它默认会工作在同一个网络命名空间内部,那我们是不是可以将他们放到不同的网络命名名称空间呢?这就实现了隔离了。所以接下来我就带着大家去做一下怎么实现名称空间的隔离。

7.4.1 基础命令说明

在做隔离之前我们需要去学习几个命令

1、查看所有网络类型

docker network ls   #查看当前可用的网络类型

范例:

[16:08:25 root@docker ~]#docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6c03a1e3d3c5        bridge              bridge              local
9f085d5080cc        host                host                local
5bd10ca8a54b        none                null                local

#在这里会发现bridge默认的工作方式也是bridge,所以只要是在这个命名名称空间内部的他都是相同的

2、创建新的网络链接和指定他的网络类型以及名称空间

docker network create -d 类型 网络空间名称  #后面跟上我们的创建类型和网络命名空间的名称

docker network create:#命令用于创建一个新的网络连接

类型分为下面两种:   
    overlay network #覆盖性网络,主要是实现我们不同的主机的容器之间可以互相通信,但是需要借助其他软件去实现
    bridge network  #也就是我们的网桥。

7.4.1.1 创建新得网桥范例实现网络命名名称空间的隔离:

1、我们创建一个新的网桥命名名称空间

[16:08:35 root@docker ~]#docker network create -d bridge lamp

docker network create:  #创建一个新的网络连接
-d bridge lamp:         #网络类型是bridge,名称空间给他取名的是lamp

2、我们再创建一个lnmp的网桥命名名称空间

[16:24:06 root@docker ~]#docker network create -d bridge lnmp

docker network create:  #创建一个新的网络连接
-d bridge lamp:         #网络类型是bridge,名称空间给他取名的是lnmp

3、再次查看所有网络类型

#通过再次查看网络类型就会发现多了两个,分别是lnmp和lamp
[16:27:48 root@docker ~]#docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6c03a1e3d3c5        bridge              bridge              local
9f085d5080cc        host                host                local
bd090936768b        lamp                bridge              local
82ba9357a546        lnmp                bridge              local
5bd10ca8a54b        none                null                local

4、通过ifconfig查看就会发现多了两个网段的IP地址 172.19.0.1和172.18.0.1

5、现在我们通过指定lamp的网络名称空间来启动一个nginx容器

[16:30:55 root@docker ~]#docker run --name nginx11 --network=lamp -d nginx-1.19.1:alpine-3.12

docker run :                #启动一个容器
--name nginx11:             #这个容器名称为nginx11
--network=lamp:             #指定网络是名称空间是lamp
-d#后台运行
nginx-1.19.1:alpine-3.12:   #通过该镜像启动

6、这时候我们再启动一个nginx111的容器,但是使用的是lnmp的网络命名名称空间

[16:41:58 root@docker ~]#docker run --name nginx111 --network=lnmp -d nginx-1.19.1:alpine-3.12

7、进入到nginx11容器中

#进入到nginx11容器中
[17:01:51 root@docker ~]#docker exec -it nginx11 sh

#通过ifconfig查看网络,就会发现已经不在172.17.0.0网段了
/ # ifconfig 

8、进入到nginx111容器中查看网卡信息

#进入到nginx111容器中
[17:08:15 root@docker ~]#docker exec -it nginx111 sh

#通过ifconfig查看网络,就会发现已经不在172.17.0.0网段了
/ # ifconfig

然后在nginx111容器中ping nignx11容器的172.18.0.2 ip发现ping不通了

所有由此就能够看出来容器之间已经没办法正常通讯了,因为没有路由。那如果这是两个不同的项目的话这两项目就已经互相隔离了,并且我们和外网的通讯还是正常的。所以隔离的还是容器与容器之间,这样的话我们在做不同的项目的时候,可以把不同的项目扔到不同的网络命名名称空间中即可,这也是我们之前做harbor的时候,为啥harbor的地址会不一样呢,原因就是在这里。在创建harbor的时候已经提前创建好了一个harbor的网络命名名称空间。

7.4.1.2 自定义指定网桥以及怎么让两个容器之间“互相见面”

由于在上面的步骤中我们已经对这两个nginx容器做了网络命名名称空间的隔离,所以它们两个之间是不能够相互访问的。原因是172的网段是一个私有IP,这两个容器之间都有各自的私网,所以不能够互相访问,那怎么办呢?

在K8S上有多中方案来实现,但是这里我给大家演示一种方案即可

7.4.1.2.1 实现容器通过自定义网桥访问,给一个独立的IP地址给容器

我们先将所有容器都删除掉。给他一个感觉的环境

[17:51:21 root@docker ~]#docker rm -f $(docker ps -a -q)
  • 然后现在我们需要一个真正的网桥,这个网桥能够具有和外界主机通讯的能力,这句话怎么理解呢。简单来说这里的这个网桥,讲难听一点就是假的,他只具备能让容器互相通信的能力,我现在要来的这个网桥是采用真正的往里网卡去实现的这个网桥,能够和外网真正的主机通讯的网桥,所以第一步我就创建网桥。

  • 网桥的创建方式有很多种,可以通过名或者是工具去创建,然而在这里我们通过修改配置文件去创建

创建网桥范例:

1、首先我们到/etc/sysconfig/network-scripts/目录下

[17:51:31 root@docker ~]#cd /etc/sysconfig/network-scripts/

2、拷贝eth0网卡为br0网卡

[18:26:56 root@docker network-scripts]#cp ifcfg-eth0 ifcfg-br0

3、然后打开eth0网卡做修改

将原有的IP相关配置全部删除,并且添加了一个字段叫做BRIDGE=br0

[18:27:29 root@docker network-scripts]# vim ifcfg-eth0 

NAME=eth0
DEVICE=eth0
ONBOOT=yes                                           
BRIDGE=br0      #添加这个参数字段br0,也就是告诉他我们现在的网桥是br0

4、修改刚才拷贝的Iifcfg-br0文件

[19:00:00 root@docker network-scripts]#vim ifcfg-br0 

DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.0.0.117
GATEWAY=10.0.0.2
DNS1=8.8.8.8                                          
NETMASK=255.255.255.0

5、重启我们的网络

[18:36:10 root@docker network-scripts]#systemctl restart network

6、重启成功以后通过ifconfig查看

[18:38:32 root@docker network-scripts]#ifconfig 

eth0上面已经没有地址了、这个地址已经跑到了br0上面去了,这就是一个能够正式工作的这么一个地址了,但是默认情况下docker是不能够借助这个br0的地址来进行通讯,所以就要给他用一个命令pipework,这个命令是放在GitHub上托管的所以我们需要给他安装一个git工具,把这个代码托下来。

7、安装GitHub

[18:38:35 root@docker network-scripts]#yum install git -y

8、通过git clone 去克隆一个项目,这一步的目的就是将代码克隆下来

[19:07:03 root@docker network-scripts]#git clone https://github.com/jpetazzo/pipework

9、将该命令放到/usr/local/bin/

#将命令拷贝到/usr/local/bin/下
[19:07:12 root@docker network-scripts]#cp pipework/pipework /usr/local/bin/

#加上执行权限
[19:08:14 root@docker network-scripts]#chmod a+x /usr/local/bin/pipework

完成了上面的操作之后我们就可以做测试了,

10、启动一个容器

[19:24:52 root@docker ~]#docker run  --name nginx --net=none -d nginx-1.19.1:alpine-3.12

docker run:                 #启动容器
--name nginx:               #容器名为nginx
--net=none:                 #不使用任何网络模式
-d#放后台运行
nginx-1.19.1:alpine-3.12:   #启动的是nginx-1.19.1:alpine-3.12容器

11、接着通过pipwork去赋予一个IP地址给容器

#通过br0网桥给nginx这个容器一个10.0.0.12的ip地址
[19:27:28 root@docker ~]#pipework br0 nginx 10.0.0.12/24

pipework br0:   #更上br0也就是我们的网桥类型
nginx:          #容器的名称
10.0.0.12/24:   #这是我们要为他赋予的IP地址

12、通过宿主机的DOS终端来ping一下10.0.0.12IP是否能够通讯

通过测试已经能够通了

13、通过浏览器访问测试已经能够访问他的nginx页面

14、并且再宿主机上没有80端口的映射,他是直接访问的容器端口。

总结:

并且会发现现在这个容器有自己独立的IP了,这样的话两台主机容器之间的相互访问岂不是和玩一样,并且我们客户端也可以通过访问这个IP来进行访问容器内部的服务了,但是需要大家注意一下pipework这个命令不是永久生效的所以需要添加到我们的开机脚本中。以上就是给我们容器去赋予一个独立的IP地址,并且是可以让公网进行访问的IP地址。通过上面的这种做就能够实现两个容器之间的访问

点赞