一.Docker容器的网络基础
通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。
docker0是Linux虚拟网桥。
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这个网桥与容器的网络通信。
需要查看网桥,需要linux的网桥管理程序:
Ubuntu: apt-get install bridge-utils
CentOS: yum install bridge-utils
运行一个docker容器,在容器中查看它的网络设备(如果没有ifconfig命令,通过apt-get install -y net-tools,若是centos镜像就用yum安装。这里面不在多提了,下面都是这样的。)
docker已经自动创建了eth0的网卡。Ctrl+p Ctrl+q退出容器。再运行如下查看网桥的状态
我们看到在interface中多了一个veth*的这样一个接口。通过ifconfig命令同样可以看到这个网络接口。
【注意】一个dokcer容器对应一个虚拟网卡veth*
自定义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镜像 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
1.允许所有容器互联
在同一宿主机下,docker的容器是通过虚拟网桥来进行连接的。那么在默认情况下,在同一宿主机中运行的容器都是可以互相连接的。
--icc=true 默认
【注意】容器退出的方式是Ctrl+p Ctrl+q。
可以看见cct2可以ping通cct1,并且访问cct1上的nginx服务!
容器的ip地址实际上是一个不可靠的连接,因为它会随着容器的启动而改变。理论上是这样的,但是我了具体的测试,试了好几次ip地址都没有变化!但是还是要介绍一下下面的操作方式。
--link
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
查看--link给我带来的变化:
查看环境变量:
查看hosts文件:
【注意】当容器的ip变化时,hosts的文件内容以及环境变量都会动态的改变!
【提示】推荐--link的方式!
三、拒绝所有容器连接
Docker守护进程的启动选项
--icc=false
修改vim /etc/docker/daemon.json
重启Docker服务:
systemctl daemon-reload
systemctl restart docker
测试:
四、允许特定容器间的连接
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容器:
成功ping通!
注意cct4容器的创建与cct3一致!只是名字不通:
docker run -it --name cct4 --link=cct1:webtest nan_df_test
【提示】我个人在做实验室时,我把iptables规则清空之后,再次重启,发现依旧ping不通!后来reboot重启了多次,莫名其妙的就好了~~~~