Docker网络详解

Docker是一种轻量级容器化技术,允许通过隔离OS级的虚拟化方式在一个操作系统上运行多个应用。网络是Docker中的一个非常重要的组件,它允许容器之间进行通信和联网访问。本文介绍Docker网络的基础知识,包括网络类型、网络驱动程序和网络配置等方面。

一、Docker网络概述

Docker网络有三个基本要素:网络类型、网络驱动程序和网络配置。

Docker支持四种类型的网络:

bridge:这是默认的网络类型,建立在宿主机的网络接口之上。容器默认使用这个网络类型。
host:这种网络类型,直接使用宿主机的网络栈,容器和宿主机共享网络栈。
overlay:这种网络类型可以跨越多个Docker守护进程,通过内置的DNS服务,允许容器之间跨主机进行通信。
macvlan:这种方式可以让容器拥有自己的MAC地址,从而可以直接与物理网络中的设备进行通信。

二、Docker网络驱动

Docker支持多种网络驱动程序,每种网络驱动的实现方式都不同。下面列出了Docker支持的网络驱动程序。

1、bridge驱动:此驱动为Docker的默认设置,docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。但与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。

2、host驱动:使用这种驱动的时候,Docker容器和宿主机共用同一个network namespace,使用宿主机的网卡、IP和端口等信息。但是,容器其他方面,如文件系统、进程列表等还是和宿主机隔离的。host模式不存在虚拟化网络带来的额外性能负担。但是host驱动也降低了容器与容器之间、容器与宿主机之间网络层面的隔离性,引起网络资源的竞争与冲突。

3、overlay驱动:此驱动采用IETF标准的VXLAN方式,并且是VXLAN中被普遍认为最适合大规模的云计算虚拟化环境的SDN controller模式。在使用的过程中,需要一个额外的配置存储服务, 还需要在启动Docker daemon的的时候额外添加参数来指定所使用的配置存储服务地址。

4、remote驱动:这个驱动实际上并未做真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化。

5、null驱动:使用这种驱动的时候,Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器除了network namespace自带的loopback网卡外,没有其他任何网卡、IP、路由等信息,需要用户为Docker容器添加网卡、配置IP等。这种模式如果不进行特定的配置是无法正常使用的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。

每个网络类型都具有自己的特点和适用场景,根据实际需求选择合适的网络创建方法非常重要。此外,还有其他网络驱动和网络插件可供选择,以满足不同环境的需求,例如 Calico、Weave 等。

三、docker网络创建

docker安装后会自动创建3种网络:bridge、host、none

可以用命令docker network ls查看

Docker的网络配置包括以下几个方面:

网络使用:容器可以连接到多个网络。
IP地址:容器可以使用静态或动态IP地址。
网络别名:容器可以使用多个别名来访问网络。
网络作用域:容器可以选择使用全局或本地作用域的网络。
在Docker中,可以使用以下命令来进行网络配置:

1. `docker network create`:创建一个新的Docker网络。
   例如:`docker network create my-network`
   用途:创建一个名为"my-network"的Docker网络,供容器使用。

2. `docker network connect`:将容器连接到一个已存在的Docker网络。
   例如:`docker network connect my-network my-container`
   用途:将名为"my-container"的容器连接到名为"my-network"的Docker网络,使容器可以与该网络中的其他容器进行通信。

3. `docker network inspect`:检查一个Docker网络的详细信息。
   例如:`docker network inspect my-network`
   用途:获取名为"my-network"的Docker网络的详细信息,包括网络标识符、容器连接到该网络的信息等。

4. `docker network rm`:删除一个已存在的Docker网络。
   例如:`docker network rm my-network`
   用途:删除名为"my-network"的Docker网络,该网络及其相关联的容器将被移除,停止容器之间的通信和连接。

 四、docker容器网络配置

#参数
host模式:使用 --net=host 指定。 
none模式:使用 --net=none 指定。 
bridge模式:使用 --net=bridge 指定,默认设置,不需要加。 
container模式:使用 --net=container:NAME_or_ID 指定。

1、bridge驱动

 

Bridge 网络 (桥接网络):

- 适用环境:默认情况下,在单个 Docker 主机上运行的容器之间的通信。
- 创建方法:Bridge 网络是 Docker 默认的网络类型,当创建容器时,如果不指定网络类型,则会自动创建一个桥接网络并将容器连接到该网络上。

 

Docker默认网络模式是bridge模式, docker0网桥是在docker daemon启动时自动创建的,之后创建的docker容器都会在docker0自网范围内选取一个未占用的ip并连接到docker0网桥上,docker0以veth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。

veth pair:就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。

docker0网桥的概念等同于交换机,为连在其上的设备转发数据帧。网桥上的veth网卡设备相当 于交换机上的端口,可以将多个容器或虚拟机连接在其上,这些端口工作在二层(数据链路层),所以是不需要配置IP信息的。下图docker0网桥就为连在其上的容器转发数据帧,使得同一台宿主机上的Docker 容器之问可以相互通信。docker0是普通的Linux网桥,它是可以在上面配置IP的,可以认为其内部有一个可以用于配置IP信息的网卡接口。在Docker的桥接 网络模式中,docker0的IP地址作为连于之上的容器的默认网关地址存在。

外面的机器是如何访问Docker容器的服务?

创建一个web应用的容器,将容器的80端口映射到主机的80端口

docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx

查看Iptable规则的变化:

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,将流量发往172.17.0.2:80,也就是我们上面创建的Docker容器。所以,外界只需访问10.10.101.105:80就可以访问到容器中的服务。

无需加--net=bridge参数

创建容器方法

docker run -dit -p 3306:3306 --name imagename --restart always imagename:tag(版本号)

访问方式:宿主机IP:映射端口

2、host驱动

Host 网络 (主机网络):

- 适用环境:希望容器与主机共享网络栈,容器需要直接访问主机网络接口的场景。
- 创建方法:在创建容器时,使用 `--network=host` 参数将容器连接到主机网络。

 

host模式可以让容器共享宿主机网络栈,外部主机与容器直接通信,但是容器的网络缺少隔离性。

host网络模式在创建时需指定: --network=host

##创建容器,指定参数
docker run -dit --network host --name imagesname

3、none

 None 网络:

- 适用环境:不希望容器连接到任何网络的场景,容器内部只使用本地回环地址进行通信。
- 创建方法:在创建容器时,使用 `--network=none` 参数将容器连接到无网络环境。

none模式是指禁用网络功能,只有lo接口,在容器创建时使用。

##创建容器,指定参数--network=none
docker run -it --rm --network none busybox

4、自定义网络(Custom Network)

- 创建自定义网络(也属于bridge模式):

docker network create my-custom-network

还可以自定义Docker使用的IP地址、DNS信息、网桥等

##指定网关以及IP范围
docker network create --subnet=192.168.1.0/24 --gateway=192.168.1.1 image-network
##指定子网以及IP范围
docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 image-network

- 在自定义网络上启动容器:

docker run -d --name imagename --network images-network imagename:tag

5、Overlay网络(Overlay Network)

Overlay 网络 (覆盖网络):

- 适用环境:在多个 Docker 主机上运行的容器之间的跨主机通信,如容器集群或分布式应用程序。
- 创建方法:使用 `docker network create` 命令并选择 `--driver overlay` 参数来创建 Overlay 网络。

- 创建覆盖网络:

docker network create --driver overlay my-overlay-network

- 在覆盖网络上启动容器:

docker run -d --name my-container --network my-overlay-network my-image

6、 MACVLAN网络(MACVLAN Network)

 Macvlan 网络:
- 适用环境:希望容器能够直接与物理网络接口进行通信,或希望每个容器具有独立的 IP 地址的场景。
- 创建方法:使用 `docker network create` 命令并选择 `--driver macvlan` 参数来创建 Macvlan 网络。

Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离和与物理网络的连接。

Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。由于在这些情况下没有端口映射,因此可以轻松访问外部服务。

- 创建MACVLAN网络:

docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan-network

- 在MACVLAN网络上启动容器:

docker run -d --name my-container --network my-macvlan-network my-image

五、docker删除网路重新连接服务

在ocker中,无法直接重启一个已经创建的网络,但可以通过以下步骤间接地重新创建和连接网络来实现类似的效果:

1. 断开容器与网络的连接:首先,要断开当前连接到该网络的容器,可以使用以下命令:

docker network disconnect <网络名称> <容器名称或ID>

##例如
docker network disconnect zabbix-network zabbix-mysql
docker network disconnect zabbix-network zabbix-server
docker network disconnect zabbix-network zabbix-web
docker network disconnect zabbix-network zabbix-java-gateway

2. 删除网络:接下来,删除该网络:

docker network rm <网络名称>
##例如
docker network rm zabbix-network

3. 重新创建和连接网络:最后,重新创建网络并将容器连接到该网络:

docker network create <网络名称>
docker network connect <网络名称> <容器名称或ID>

##例如
docker network connect zabbix-network zabbix-mysql
docker network connect zabbix-network zabbix-server
docker network connect zabbix-network zabbix-web
docker network connect zabbix-network zabbix-java-gateway

请注意,此过程中断开的连接和重新创建的网络可能会导致与网络相关的服务中断和清除,因此在执行此操作之前,请确保已了解相关的服务和应用程序的影响以及可能需要重新配置和启动。

此外,重启Docker守护程序或重启Docker服务并不会直接重启现有的网络,因此无法实现直接重启网络的操作。

4.修改容器IP

在Docker中,可以通过以下方法修改Docker容器中服务的IP地址:

1. 停止并移除容器:首先,要修改容器的IP地址,需要先停止并移除容器。可以使用以下命令:

docker stop <容器名称或ID>
docker rm <容器名称或ID>

2. 创建具有固定IP的新容器:接下来,创建一个新的容器,并指定固定的IP地址。可以使用以下命令:

docker run -d --net=<网络名称> --ip=<新的IP地址> --name=<容器名称> <镜像名称>

在上述命令中,将 `<网络名称>` 替换为容器应连接的网络名称,`<新的IP地址>` 替换为要为该容器分配的新IP地址,`<容器名称>` 替换为新容器的名称,`<镜像名称>` 替换为要使用的镜像名称。

3. 配置服务的IP地址:根据您的具体服务和配置方式,在容器中相应地修改服务的IP地址设置。这可能涉及到编辑配置文件、运行特定的命令或使用相关工具来更改服务配置。

4. 启动新容器:完成对服务IP地址的修改后,使用以下命令启动新容器:

docker start <容器名称>

请注意,确保新的IP地址并不与网络中的其他设备发生冲突,并在修改配置时,根据具体的服务要求进行相应的调整。

 

 

 

六、查看docker中的容器使用的是哪种网络

要查看Docker容器使用的网络,可以使用以下命令:

1. 首先,列出当前正在运行的Docker容器。可以使用以下命令:
   docker ps
   这将列出所有正在运行的Docker容器,包括容器的ID和名称。
2. 然后,查看具体容器的网络信息。选择要查看的容器的ID或名称,然后运行以下命令:
   docker inspect <container_id_or_name> | grep "NetworkMode"
   这将返回有关容器网络的信息,其中包括“NetworkMode”字段。该字段指示容器正在使用的网络模式,例如“bridge”、“host”或“none”。
另外,可以替代使用`grep`命令查找容器网络模式的“NetworkMode”字段,使用以下命令: docker inspect
--format='{{.HostConfig.NetworkMode}}' <container_id_or_name> 这将直接返回容器的网络模式。 通过以上命令,您可以查看Docker容器使用的网络模式。

 

posted @ 2023-08-05 19:30  O波V步  阅读(1114)  评论(0编辑  收藏  举报