Docker 网络原理
启动docker服务发现docker虚拟网卡
遇到问题
查看容器内部网卡信息时报错,阉割版的linux系统ip指令也没有(脑裂)
尝试在容器内安装ip相关指令,发下apt更新失败
推测可能是域名无法解析,修改docker配置文件
vim /etc/docker/daemon.json
添加dns解析服务器地址
重启docker服务,发现安装成功
其次为了提高下载速度可以配置国内镜像源
cat <<EOF >/etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
EOF
#更新可用软件包信息
apt update
回归主题
启动新容器nginx01,nginx02,进入容器查看网卡
查看宿主机ip地址,发现docker容器的网卡在宿主机中存在对应信息
由上图发现新启动的容器,与docker01网卡在同一网段,相互之间可以通信
使用命令查看两个容器的网卡信息
docker inspect nginx01
docker inspect nginx02
发现两个容器的网关都是docker0的ip值,且网络模式均为bridge,所以可以粗略画出网络通信图
由于容器启动后ip地址会变动,为了建立稳定的通信方式,需要使用容器名进行通信,这里可以使用–link可以达到实现通过容器名ping通。
docker rm -f nginx02
docker run -d -P --name nginx02 --link nginx01 nginx
#也可以给将要连接到的容器起别名,相当于在nginx02中访问new_name就是访问nginx01
#docker run -d -P --name nginx02 --link new_name:nginx01 nginx
docker exec nginx02 apt update && install iputils-ping -y
docker exec nginx02 ping nginx01
查看nginx02容器的/etc/hosts文件,发现–link实际上的实现原理,是做了一个host映射,将nginx01指向了ip:172.17.0.2。
如果存在大量容器之间需要通信使用–link比较麻烦,而且–link的连接是单向的
容器互联(自定义网络)
解决–link配置麻烦的问题,我们可以使用自定义网络。
#查看所有的docker网络
docker network ls
我们每次启动容器时都会有一个默认参数–net指定网络模式,默认的网络的模式是bridge,我们创建自己的网络后就可以用–net自定自定义网络。
# driver指定网络模式,subnet指定子网掩码,geteway指定网关
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynet
新启动两个容器,使用自定义网络
docker run -d -P --name nginx03 --net mynet nginx
docker run -d -P --name nginx04 --net mynet nginx
# 查看自定义网络详细信息
docker inspect network mynet
使用ping命令发现,自定义网络中的容器可以相互之间使用容器名ping通,修复了docker0网络与–link的不足,而且使用十分简单
网络联通(不同网络中的容器通信)
实现了同一网络中容器的自由通信,那是否也可以实现不容网络中容器的通信呢?
操作方法
# 将nginx01与mynet网络连通
docker network connect mynet nginx01
# 查看mynet网络信息
docker network inspect mynet
插卡mynet网络信息发现,将nginx01与网络mynet联通,只是将nginx01增加了一个mynet网络内的ip地址,这就是同一个容器存在两个ip.测试
发现不同网络中的容器可以通过容器名ping通,至此实现了不同网络之间容器的互联。