Docker 基础:网络
Docker 网络模式
我们一开始在使用 Docker 时,就要考虑到几个问题:
容器的网络是怎么来的
如何与他或与多个容器之间进行通信
容器和容器之间进行通信
因此,我们很有必要来了解关于 Docker 的网络相关知识,以满足更高的需求
在了解 Docker 网络之前,我们需要先了解 Docker 的网络模式都是什么:
网络模式 | 功能(简述) |
---|---|
bridge | 为每个容器分配或设置IP,连接到名为“docker0”的虚拟网络 |
host | 使用宿主机的IP和端口,不使用 Docker 配置 |
none | 容器有独立的网络配置,但是并没有进行网络设置,无IP分配,本地回环 |
container | 不会创建自己的网卡,而是与其他容器共享IP和端口 |
网络模式的运行原理较为复杂,这里不进行讲解,请自行了解
Docker 默认网络
查看网络模式
我们在安装完成 Docker 后,会默认的创建三种虚拟网络,通过如下命令,我们可以查看:
docker network ls
结果如下:
查看容器网络
也可通过查询ip地址的方式来查看容器IP:
ip addr | grep inet # 这里使用了管道,也可以直接使用 ip addr 命令
结果:
可见,192.168.100.1、172.17.0.1、172.10.4.254是我所用的容器ip地址
对于每个容器的IP地址和Gateway信息,我们可以通过如下命令进行查看,在 NetworkSettings 节点中看到更详细的信息
docker inspect $containerName|$container ID
本站正是Docker容器所部署,详细如下(节选):
同样的,我们可以通过如下命令来查看某种网络模式下的所有容器,在Container节点中可查看到容器名称
docker network inspect $networkModle
例如 bridge 模式:
可见幻兽帕鲁服务器在 bridge 模式的 172.17.0.0 网段工作,ip地址为 172.10.0.2
Docker 容器通信
在这里,建议使用自定义的网络模式来控制容器之间的通信
你可以创建任意数量的网络模式,并可以在给定时间将容器连接或断开网络中的各个网络,而无需重新启动容器
当容器连接到多个网络时,其外部连接通过的第一个非内部网络以词法顺序提供
创建网络
假定,我们创建一个 bridge 模式的网络,命令格式如下:
docker network create --driver $networkModle $modleName
# 创建一个名为 cokeserver 的 bridge 网络
# docker network create --driver bridge cokeserver
如果想要创建其自定义的ip和网关,命令参数如下:
docker network create --driver $networkModle --subnet $networkSubnet --gateway $networkGate $modleName
# 创建一个名为 cokeserver ,ip段为 172.20.0.0/24,网关为 172.20.0.1 的bridge 网络
# docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 cokeserver
注意:
bridge 自定义网络之间默认支持域名解析
bridge 自定义网络与系统自带的网桥之间默认有解析
docker的系统自带网桥默认无解析
容器内部通信
同一网桥的容器之间可以通信
假定我们通过上述方法再创建了一个bridge 网络模式,名为 cokeserver2 ,已知现有的容器:Halo-Blog,想要实现通信,命令格式如下:
docker network connect $networkName $containerName
docker attach $containerName
# 将容器 Halo-Blog 与网络模式 cokeserver2 建立连接
# docker network connect cokeserver Halo-Blog
# docker attach Halo-Blog
进入容器,测试是否可以通信(ping方法)
容器Halo-Blog内(172.10.4.2)
bridge 网络模式cokeserver2(172.11.4.2)
root@a77dd40e0a04:/# ping 172.11.4.2
如若有返回值,则说明成功建立通信
容器外部通信
端口映射
外部主机访问容器或外部容器之间访问是通过docker-proxy实现的
查看iptable的nat防火墙策略:
iptables -t nat -nL
如下:
假如创建一个名为 nginx 容器(外部访问443映射内部容器端口80)命令格式如下:
docker run -d --name $containerName -p outer_port:inner_port $containerName
# 外部访问443映射内部容器端口80的 nginx 容器
# docker run -d nginx -p 443:80 nginx
再次使用iptables命令即可看到新的nginx容器的端口转发