Docker网络和存储卷


Docker网络

Docker 自带网络管理系统,可以有效管理容器之间、容器与主机以及外部网络之间的通信。它还支持多种网络类型,适用于不同的典型场景。

图片

Docker 网络设置了容器如何与其他容器和外部服务通信。为了获得网络访问,容器需要是 Docker 网络的一部分。容器可以通信的方式取决于它的网络连接。Docker 提供了五种标准网络模式来执行核心网络功能:Bridge(桥接)、Host(主机)、Overlay(重叠)、IPvLAN、Macvlan。

1、桥接网络

桥接网络在主机机器和容器之间形成一个虚拟桥接。该网络上的容器可以相互通信,但与未连接到该网络的容器隔离。

图片

每个容器都会获得一个独一无二的 IP 地址。通过与主机的桥接连接,这些容器还可以相互交互,与本地网络(LAN)和 Internet 互联。然而,它们不会以物理设备的形式出现在 LAN 上。

2、主机网络(Host Network)

使用主机网络模式的容器使用与主机机器相同的网络设置,而不会被隔离。它们没有单独的 IP 地址。相反,它们使用的任何端口都直接链接到主机网络。例如,如果容器进程使用端口 8080,则可以通过 192.168.1.101:8080(即主机的 IP 地址和端口号)访问它。

图片

由于应用程序容器使用端口 8080,因此不需要端口映射,因为在这种情况下,容器使用主机端口。我们的数据库使用端口 5432,因此可以通过主机的 IP 地址和 5432 端口进行访问。

3、重叠网络(Overlay Network)

重叠网络是跨越多个 Docker 主机的网络。它们可以让这些主机上的容器相互通信,而无需操作系统管理路由。

重叠网络用于 Docker Swarm 集群。但是,如果有两个单独运行的 Docker 引擎,并且需要直接连接它们的容器,也可以这样使用它们。

图片

上图进行了简化。在真实场景中,正如容器一样,主机也会从重叠网络获取虚拟 IP 地址,而且它们的范围是相同的。

4、IPvLAN 网络

IPvLAN 是一种高级模式,可提供对容器的 IPv4 和 IPv6 地址进行详细控制的能力,它还可以处理第 2 层和第 3 层 VLAN 标记和路由。

如果你需要将容器服务连接到已有物理网络,此模式会很有用。IPvLAN 网络具有自己的接口,其性能可能比基于桥接网络的网络更好。

图片

上图显示了 IPvLAN 设置中的所有内容,包括容器,都有自己的 IP 地址,并且是网络的一部分。

5、Macvlan 网络

Macvlan 是一种更高级的选项,让容器能像网络上的物理设备一样运行。它通过为每个容器分配自己的 MAC 地址来实现这一点。

对于此类型的网络,你需要将主机的一个物理网络接口分配给虚拟网络。此外,更广泛的网络还应设置为处理来自具有大量容器的 Docker 主机的许多 MAC 地址。

6、使用哪种网络类型

桥接网络适用于大多数情况。这些网络上的容器可以使用 IP 地址和 DNS 名称相互通信。它们还可以连接到互联网和本地网络。

主机网络在需要直接使用主机的网络接口并且不需要分离容器网络时很有用。此设置使容器化的应用程序像主机网络的一部分一样运行。

重叠网络在容器位于不同 Docker 主机上时需要直接通信时是必需的。它们非常适合为了提高可靠性创建分布式应用。

在容器需要像网络上的物理设备一样运行时,Macvlan 网络很有用,例如监控网络流量。IPvLAN 网络适用于高级需求,例如对容器 IP 地址、标记和路由的特定控制。

7、创建网络

使用 docker network create 命令创建一个新网络。通过设置 -d 标志来指定要使用的驱动程序,例如桥接或主机。如果省略标志,将创建一个桥接网络。

在第一个终端窗口中运行以下命令:

docker network create test-network -d bridge
# 输出是50ed05634f6a3312e56700ef683ca39df44bfc826e2e4da9179c2593c79910f9

创建的网络 ID 将显示在终端中。目前,新网络还无法使用,因为还没有连接任何容器。

但是,你可以通过在 docker run 命令中设置 --network 标志将新容器连接到网络。在第二个终端窗口中运行以下命令:

docker run -it --rm --name container1 --network test-network busybox:latest

接下来,在第三个终端窗口中启动另一个 Ubuntu 容器,这次不使用 --network 标志:

docker run -it --rm --name container2 busybox:latest

现在,使用它们的名称在两个容器之间进行通信:

# 在container1中
/ # ping container2
ping: bad address 'container2'

容器尚未加入到同一个网络中,因此它们无法直接相互通信。

使用第一个终端窗口将 container2 连接到网络中:

docker network connect test-network container2

容器现在共享同一个网络,这使它们能够相互发现:

# 在container1中
/ # ping container2
PING container2 (172.22.0.7): 56 data bytes
64 bytes from 172.22.0.7: seq=0 ttl=64 time=2.205 ms

Docker 可以在不重新启动容器的情况下自由管理网络连接。了解了如何在创建容器后连接容器,也可以从它们不再需要参与的网络中删除容器:

docker network disconnect test-network container2

如果想删除一个网络,需要先断开或停止使用该网络的所有 Docker 容器,然后将网络的 ID 或名称传递给 network rm

docker network rm test-network

总结

Docker 的网络系统为管理容器如何与其他容器、相邻容器和 Docker 主机通信提供了多种方式。同一网络中的容器可以使用其名称或 IP 地址连接。

Docker数据卷创建、挂载、删除、数据共享

在创建 docker 的镜像和容器后,还需要对容器进行数据管理,以便能与主机、不同容器之间进行交换数据。通过数据卷的方式可以实现多个容器间的数据共享和交换。

了解docker数据卷

docker 数据卷(Data Volume)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 的 mount 操作。数据卷可以持久化存储容器数据,即使容器被删除,数据仍然可以被保留,数据卷可以实现数据持久化、数据共享和数据迁移等功能。

数据卷的生命周期独立于容器,即使容器被删除,数据卷仍然存在。

创建数据卷 docker volume create

docker volume create 命令用于创建docker数据卷。创建数据卷之后,默认会存放在目录:/var/lib/docker/volumes/数据卷名称/

命令格式:

docker volume create [OPTIONS] [VOLUME]

# OPTIONS 参数
# VOLUME 数据卷名称

命令的常用参数有:

参数 说明
-d, --driver string 指定卷驱动程序名称
--label list 设置卷的元数据
-o, --opt map 设置驱动程序特定选项

命令示例:

# 创建数据卷
docker volume create test_volume

# 查看数据卷位置
ls -la /var/lib/docker/volumes/

# 可能会返回以下内容,其中包含数据卷 test_volume
brw------- 1 root root 253, 1 Jan  4 13:53 backingFsBlockDev
-rw------- 1 root root  32768 Jan  4 13:53 metadata.db
drwx-----x 3 root root   4096 Jan  4 13:53 test_volume

挂载数据卷 docker run --mount

docker run 命令中的 --mount 参数用于在运行容器时挂载卷,通过该参数,可以将宿主机上的目录或文件挂载到容器内部,实现数据的共享和持久化。

命令格式:

docker run --mount type=type_option,source=source_path,target=target_path [OPTIONS] IMAGE [COMMAND] [ARG...]

# type 类型参数
# source_path是宿主机上的路径
# target_path是容器内的路径

其中 -mount 选项的 type 参数支持三种类型的数据卷:

参数 说明
type=volume 普通数据卷(默认类型),映射到主机/var/lib/docker/volumes路径下。
type=bind 绑定挂载,将宿主机上的目录或文件直接挂载到容器内部。
type=tmpfs tmpfs挂载,将容器内的目录挂载为tmpfs,用于存储临时数据。

命令示例:

# 将宿主机/home/user/data目录挂载到容器内的/data目录
docker run --mount type=bind,source=/home/data,target=/data image_name

挂载数据卷 docker run -v

通过 docker run 命令的 -v 或 --volume 选项也可以将宿主机上的目录或文件挂载到容器内部,从而实现数据的共享和持久化。

# 将宿主机/home/user/data目录挂载到容器内的/data目录
docker run -v /home/data:/data image_name

上述命令将在容器内部创建一个/data目录,并将宿主机上的/home/data目录挂载到该目录。容器内的任何数据变化都会反映到宿主机上的相应目录中,从而实现数据的持久化。

查看数据卷 docker volume ls

docker volume ls 命令用于查看 docker 数据卷,该命令将列出所有可用的数据卷。

命令示例:

# 查看数据卷
docker volume ls

# 可能返回以下内容,包含示例创建的 test_volume
DRIVER    VOLUME NAME
local     test_volume

数据卷详情 docker volume inspect

docker volume inspect 命令用于查看数据卷的详细信息,默认情况下,这些信息将以JSON格式呈现。

命令格式及示例:

# 命令格式
docker volume inspect 数据卷名称

# 命令示例
docker volume inspect test_volume

# 可能返回以下内容
[
    {
        "CreatedAt": "2024-01-04T13:53:04+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test_volume/_data",
        "Name": "test_volume",
        "Options": null,
        "Scope": "local"
    }
]

删除数据卷 docker volume rm

docker volume rm命令用于删除docker数据卷,需确保没有任何容器正在使用该数据卷,否则可能无法删除。

命令格式及示例:

# 命令格式
docker volume rm 数据卷名称

# 命令示例
docker volume rm test_volume

删除操作不可逆,需谨慎处理并做好相应备份。