一、Docker 容器的网络基础
1.docker0(Lunix的虚拟网桥)
1).查看
ifconfig
2).定义
(1).前言
通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。
docker0是Linux虚拟网桥。
Linux虚拟网桥的特点:
- 可以设置IP地址
- 相当于拥有一个隐藏的虚拟网卡
docker0的地址划分: - IP:172.17.0.1 子网掩码: 255.255.0.0
- MAC: 02:42:c7:62:53:e0
- 总共提供65534个地址
docker守护进程在一个容器启动时,实际上它要创建网络连接的两端。一端是在容器中的网络设备,而另一端是在运行docker守护进程的主机上打开一个名为veth*的一个接口,用来实现docker这个网桥与容器的网络通信。
(2).centos7 查看网桥设备
brctl show
(3).案例
1.运行容器
docker run --name centos7 -it centos:7 /bin/bash
2.查看网络设备
3.安装查看工具
yum -y install vim net-tools ifconfig
4.查看docker 网络设备
3).自定义docker0
(1).前言
修改默认的配置文件 /etc/docker/daemon.json对Docker进行配置。
如果没有直接创建
(2).关闭 docker服务
systemctl stop docker
(3).修改bip
vim /etc/docker/daemon.json
{
"bip":"192.168.10.1/16"
}
(4).重启docker
systemctl restart docker
2.自定义docker虚拟网桥
1.查看现有网络情况
docker network ls
2.新建名为net-test的网桥(只有使用–subnet创建的网络才能指定静态IP)
docker network create --driver bridge --subnet 192.168.10.0/24 --gateway 192.168.10.1 net-test
报错:Error response from daemon: Pool overlaps with other one on this address space
这是因为新创建的网络自定义的子网ip与已有的网络子网ip冲突。
只需要重新定义子网ip段就行
docker network create --driver bridge --subnet 10.22.1.0/24 --gateway 10.22.1.1 net-test
docker network ls
3.重新查看网络配置信息:
docker network inspect 网桥名称
docker network inspect net-test
4.备注信息:
当用ifconfig命令查看的时候,显示的并不是net-test,而是br-ed63c1fd55b9
如需能在ifconfig中显示网桥名称,添加选项com.docker.network.bridge.name
docker network create --driver bridge --subnet 25.168.1.0/24 --gateway 25.168.1.1 net-test1 -o com.docker.network.bridge.name=net-test1
5,使用自定义网桥,指定端口启动容器
docker run -it --network=net-test1 -p 8080:80 centos:7 /bin/bash
二、Docker 容器的互联
1.允许所有容器互联
1前言
在同一宿主机下,docker的容器是通过虚拟网桥来进行连接的。那么在默认情况下,在同一宿主机中运行的容器都是可以互相连接的。
–icc=true 默认
1).测试 --icc=true 默认允许连接
docker run -it --name cct1 mycentos:1.0
docker run -it --name cct2 mycentos:1.0
其中mycentos:1.0自定义的镜像
2.容器的ip地址实际上是一个不可靠的连接,因为它会随着容器的启动而改变。
–link
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
CONTAINER_NAME: 需要连接的容器名字
ALIAS: 在容器中连接的代号(别名随机取)
docker run -it --name cct4 mycentos:1.0
docker run -it --name cct5 --link=cct4:web mycentos:1.0
2.允许特定容器互联解决方案
如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。
通过自定义 虚拟网桥 来实现指定容器间的互联 隔离
参考: 本文的 自定义docker虚拟网桥
docker run -it --rm --name test6 --network net-test mycentos:1.0
docker run -it --rm --name test7 --network net-test mycentos:1.0
3.网络连通(Docker 两个不同网络间实现连通)
1).前言
docker0和自定义网络肯定不通,我们使用自定义网络的好处就是网络隔离。
但是在实际的工作中,比如我们部署了mysql使用了一个网段。部署了tomcat使用了另一个网段,两个网段之间肯定是不能相互连通的,但是tomcat和mysql又需要相互连通,我们就要使用网络连通。原理图如下:
在没有使用connect命令的情况下,不同网络间的容器是无法进行网络连接的。
2).启动不同网络的容器
(1).启动两个bridge(自带默认)桥接的容器
docker run -it --name tomcat1 tomcat
docker run -it --name tomcat2 tomcat
# 查看容器
docker ps -a
(2).启动两个mynet(自定义)桥接的容器
网桥创建如下:
docker network create --driver bridge --subnet 10.22.1.0/24 --gateway 10.22.1.1 mynet
docker network ls
启动两个mynet(自定义)桥接的容器如下:
docker run -it --name tomcat-net-01 --net mynet tomcat
docker run -it --name tomcat-net-02 --net mynet tomcat
# 查看容器
docker ps -a
3).两个不同网络,容器间互通
1.查看操作语法
docker network connect [OPTIONS] NETWORK CONTAINER
2.实际操作指令
docker network connect mynet tomcat1
3.测试两者间是否互通
tomcat1 ping tomcat-net-01可以ping通!
docker exec -it tomcat1 ping tomcat-net-01