一.Docker容器的网络基础

通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。

docker0是Linux虚拟网桥。

                               

docker 本地网络 查看 docker查看网络连接_docker

Linux虚拟网桥的特点:

  • 可以设置IP地址
  • 相当于拥有一个隐藏的虚拟网卡

docker0的地址划分:

  • IP:172.17.42.1 子网掩码: 255.255.0.0
  • MAC: 02:42:ac:11:00:00 到 02:42:ac:11:ff:ff
  • 总共提供65534个地址

docker守护进程在一个容器启动时,实际上它要创建网络连接的两端。一端是在容器中的网络设备,而另一端是在运行docker守护进程的主机上打开一个名为veth*的一个接口,用来实现docker这个网桥与容器的网络通信。

                                      

docker 本地网络 查看 docker查看网络连接_docker 本地网络 查看_02

需要查看网桥,需要linux的网桥管理程序:

Ubuntu: apt-get install bridge-utils

CentOS:  yum install bridge-utils

 

docker 本地网络 查看 docker查看网络连接_重启_03

docker 本地网络 查看 docker查看网络连接_docker_04

运行一个docker容器,在容器中查看它的网络设备(如果没有ifconfig命令,通过apt-get install -y net-tools,若是centos镜像就用yum安装。这里面不在多提了,下面都是这样的。)

docker 本地网络 查看 docker查看网络连接_docker 本地网络 查看_05

docker 本地网络 查看 docker查看网络连接_docker_06

docker已经自动创建了eth0的网卡。Ctrl+p Ctrl+q退出容器。再运行如下查看网桥的状态

docker 本地网络 查看 docker查看网络连接_docker 本地网络 查看_07

我们看到在interface中多了一个veth*的这样一个接口。通过ifconfig命令同样可以看到这个网络接口。

docker 本地网络 查看 docker查看网络连接_重启_08

【注意】一个dokcer容器对应一个虚拟网卡veth*

docker 本地网络 查看 docker查看网络连接_Docker_09

自定义docker0

  • 修改docker0默认分配的ip地址:
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

docker run -it centos /bin/bash

yum install net-tools 

ifconfig

【注意】一般不推荐直接修改docker0网桥,建议添加一个网桥,也就是下面的配置方式!

 

  • 添加虚拟网桥
sudo brctl addbr br0

sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

 

  • 修改docker配置文件

  

vim /etc/docker/daemon.json

{
 "bridge":"br0"
}

【注意】daemon.json文件是自己创建的

  • 重启docker
systemctl daemon-reload

systemctl restart docker
  • docker 启动容器,观察容器的eth0是否在规定的ip段上!

docker 本地网络 查看 docker查看网络连接_重启_10

docker 本地网络 查看 docker查看网络连接_重启_11

 

二.Docker容器的互联

用于测试的Docker镜像 Dockerfile:

FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash

 构建测试镜像:

docker build -t="nan_df_test" .

查看镜像是否创建成功:

dokcer images

 

docker 本地网络 查看 docker查看网络连接_docker_12

1.允许所有容器互联

在同一宿主机下,docker的容器是通过虚拟网桥来进行连接的。那么在默认情况下,在同一宿主机中运行的容器都是可以互相连接的。

--icc=true 默认

docker 本地网络 查看 docker查看网络连接_重启_13

【注意】容器退出的方式是Ctrl+p Ctrl+q。

docker 本地网络 查看 docker查看网络连接_docker_14

docker 本地网络 查看 docker查看网络连接_docker_15

可以看见cct2可以ping通cct1,并且访问cct1上的nginx服务!

容器的ip地址实际上是一个不可靠的连接,因为它会随着容器的启动而改变。理论上是这样的,但是我了具体的测试,试了好几次ip地址都没有变化!但是还是要介绍一下下面的操作方式。

--link

docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]

docker 本地网络 查看 docker查看网络连接_docker 本地网络 查看_16

docker 本地网络 查看 docker查看网络连接_docker 本地网络 查看_17

查看--link给我带来的变化:

查看环境变量:

docker 本地网络 查看 docker查看网络连接_docker_18

查看hosts文件:

docker 本地网络 查看 docker查看网络连接_重启_19

docker 本地网络 查看 docker查看网络连接_Docker_20

【注意】当容器的ip变化时,hosts的文件内容以及环境变量都会动态的改变!

 

【提示】推荐--link的方式!

 

三、拒绝所有容器连接

Docker守护进程的启动选项

--icc=false

修改vim /etc/docker/daemon.json 

docker 本地网络 查看 docker查看网络连接_重启_21

重启Docker服务:

systemctl daemon-reload

systemctl restart docker

测试:

docker 本地网络 查看 docker查看网络连接_重启_22

四、允许特定容器间的连接

Docker守护进程的启动选项

--icc=false --iptables=true

--link 在容器启动时添加link

docker利用iptables中的机制,在icc=false时,阻断所有的docker容器间的访问,仅仅运行利用link选项配置的容器进行相互的访问。

【注意】如果出现ping不通的情况,可能为iptables的问题(DROP规则在docker之前了)。

sudo iptables -L -n    查看iptables规则的情况
sudo iptables -F    清空iptables规则设置
sudo systemctl restart docker 重新启用docker的服务

重新启动容器即可

 

演示:

配置文件

docker 本地网络 查看 docker查看网络连接_docker 本地网络 查看_23

重启docker服务:

docker 本地网络 查看 docker查看网络连接_Docker_24

启动docker容器:

docker 本地网络 查看 docker查看网络连接_重启_25

 

成功ping通! 

注意cct4容器的创建与cct3一致!只是名字不通:

docker run -it --name cct4 --link=cct1:webtest nan_df_test

 

【提示】我个人在做实验室时,我把iptables规则清空之后,再次重启,发现依旧ping不通!后来reboot重启了多次,莫名其妙的就好了~~~~