1、Docker 网络
Docker 网络是用来与其他容器以及Docker Host通信。在Docker主机上执行ifconfig
,可以看到Docker以太网适配器。以太网适配器是在Docker主机上安装Docker时创建的。根据不同的业务场景选择不同的网络 ,需要多个容器在同一个Docker主机上进行通信时,用户定义的bridge网络是最佳选择。当网络不与Docker主机隔离时,host网络是最好的选择。
需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用swarm服务协同工作时,overlay网络是最佳选择。从VM设置迁移或需要容器看起来像网络上的物理主机时,Macvlan网络是最佳的,每个主机都具有唯一的MAC地址。network plugin允许将Docker与专用网络集成。
1)bridge网络
bridge模式是默认容器启动默认分配的网络方式,容器使用独立的网络命名空间(namespace),并连接到docker0虚拟网卡上。
2)host网络
host模式是容器与Docker主机共享同一网络命名空间(namespace),Docker主机的网络协议栈、路由表、iptables规则、网卡、IP、端口等等都是共享的。规模小的场景,可以使用这种模式。主机网络驱动程序仅适用于Linux主机,不支持Windows及Mac平台。
3)overlay网络
overlay模式是多个Docker主机之间的分布式网络解决方案。该网络位于特定于主机的网络之上,允许连接到它的容器(包括群集服务容器)安全地进行通信。
4)macvlan网络
macvlan与overlay类似,也是跨主机互联的解决方案。在某些大流量或性能要求较高的场景下,需要直接连接到物理网络,在这种情况下,可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。
5)none网络
none模式用于完全禁用容器上的网络,容器单独使用一个网络命名空间(namespace),仅创建回环设备,如果需要容器连接其他网络,则需要手动进行网络相关的设置,灵活性最高但也是最复杂。
6)network plugin网络
上面五种驱动都是docker原生提供的,如以上五种不满足需求,除了原生支持的,还可以使用第三方的驱动模式接入。比如,flannel、pipework、weave 和 calico 等等。
2、Docker 网络命令
1)显示所有Docker网络
docker network ls
例如,
# sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
a8e391ede6b8 bridge bridge local
03c2fcc45d1e cjavapy_default bridge local
5d11dd8d6953 host host local
44c9137e7a75 none null local
ac69bb23b7c1 root_default bridge local
2)检查Docker网络
使用docker network inspect
命令,可以查看更多网络信息:
docker network inspect networkname
networkname:需要检查的网络的名称。
例如,
# sudo docker network inspect bridge
[
{
"Name": "bridge",
"Id": "a8e391ede6b83ea500754660c008af980e33c7bc504f57f2f341c05ec076147e",
"Created": "2021-11-10T21:13:54.323983878+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
3)创建docker网络
在启动容器之前,可以在Docker中创建一个网络,命令如下:
docker network create –-driver drivername netname
drivername:网络驱动程序的名称。
netname:网络的名称。
例如,
sudo docker network create –-driver bridge my_nw
在启动创建容器时配置创建的网络:
sudo docker run –it –network=my_nw ubuntu:latest /bin/bash
查看网络可以使用docker network inspect
命令如下:
sudo docker network inspect my_nw
3、Docker 网络配置固定IP
docker 容器在启动时默认使用的是bridge 模式,Docker 容器启动后,会连到一个名为 docker0 的虚拟网桥,每次启动docker容器的IP都不是固定的,Docker集群或其它情况不方便管理。则需要将容器IP配置成固定的。
1)使用pipework配置容器IP
主机中下载配置pipework,命令如下:
$ git clone https://github.com/jpetazzo/pipework.git
$ cp pipework/pipework /usr/local/bin/
安装bridge-utils,命令如下:
$ yum -y install bridge-utils
建网桥及设置IP网段,命令如下:
$ brctl addbr br1
$ ip link set dev br1 up
$ ip addr add 192.168.31.1/24 dev br1
启动一个名为myubuntu的ubuntu容器及设置IP,命令如下:
$ docker run -d --name=myubuntu ubuntu
$ pipework br1 myubuntu 192.168.31.12/24
brctl 命令的使用:
brctl show
#查看网桥状态
brctl delif <网桥名> <端口名>
#卸载网桥上的端口
ifconfig
#查看是否有网桥网卡名
ifconfig <网桥名> down
#关闭此网卡
brctl delbr <网桥名>
#删除网桥
2)使用自定义网络
创建自定义网络:
docker network create --subnet=192.168.31.1/24 my_nw
创建启动容器时指定IP:
docker run -itd --name web1 --hostname web1 --net my_nw --ip 192.168.31.12 -d -P -p 80:8080 -p 443:8081 centos