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 lsNETWORK ID NAME DRIVER SCOPEa8e391ede6b8 bridge bridge local03c2fcc45d1e wonhero_default bridge local5d11dd8d6953 host host local44c9137e7a75 none null localac69bb23b7c1 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