【Docker学习总结】15.Docker容器的网络连接

一.Docker容器的网络基础

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

docker0是Linux虚拟网桥。

                               【Docker学习总结】15.Docker容器的网络连接_第1张图片

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学习总结】15.Docker容器的网络连接_第2张图片

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

Ubuntu: apt-get install bridge-utils

CentOS:  yum install bridge-utils

 【Docker学习总结】15.Docker容器的网络连接_第3张图片

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

【Docker学习总结】15.Docker容器的网络连接_第4张图片

【Docker学习总结】15.Docker容器的网络连接_第5张图片

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

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

【Docker学习总结】15.Docker容器的网络连接_第6张图片

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

【Docker学习总结】15.Docker容器的网络连接_第7张图片

自定义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学习总结】15.Docker容器的网络连接_第8张图片

【Docker学习总结】15.Docker容器的网络连接_第9张图片

 

二.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学习总结】15.Docker容器的网络连接_第10张图片

1.允许所有容器互联

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

--icc=true 默认

【Docker学习总结】15.Docker容器的网络连接_第11张图片

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

【Docker学习总结】15.Docker容器的网络连接_第12张图片

【Docker学习总结】15.Docker容器的网络连接_第13张图片

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

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

--link

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

【Docker学习总结】15.Docker容器的网络连接_第14张图片

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

查看环境变量:

【Docker学习总结】15.Docker容器的网络连接_第15张图片

查看hosts文件:

【Docker学习总结】15.Docker容器的网络连接_第16张图片

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

 

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

 

三、拒绝所有容器连接

Docker守护进程的启动选项

--icc=false

修改vim /etc/docker/daemon.json 

重启Docker服务:

systemctl daemon-reload

systemctl restart docker 

测试:

【Docker学习总结】15.Docker容器的网络连接_第17张图片

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

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学习总结】15.Docker容器的网络连接_第18张图片

重启docker服务:

启动docker容器:

【Docker学习总结】15.Docker容器的网络连接_第19张图片

 

成功ping通! 

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

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

 

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

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(【Docker学习总结】15.Docker容器的网络连接)