开发手册 欢迎您!
软件开发者资料库

Docker 网络命令及配置

Docker 网络(network)是为了实现容器间或容器与外接进行通信,Docker提供了6种网络模式来解决不同场景下的连接方案,分别是bridge、host、overlay、macvlan、none、network plugin。本文主要介绍Docker 网络和命令,以及命令和相关配置。

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