容器管理:镜像、网络与存储全解析
1. 管理容器镜像
1.1 使用不同注册表的私有仓库
默认情况下,
docker login
命令会尝试连接到 Docker Hub。若要连接其他注册表服务,需对
docker login
命令稍作修改,示例如下:
docker login some.registry.com:8000
执行此命令后,就可以像平常一样使用
pull
命令从该注册表服务的仓库中拉取镜像。
1.2 处理镜像版本控制
随着容器镜像新版本的创建,需要一种方法来跟踪容器的版本。常用的方法是使用标签(tags)来跟踪新的容器镜像版本。
-
获取镜像 ID
:运行
docker images
命令获取镜像 ID。
docker images
-
为镜像打标签
:使用
docker tag命令为镜像打标签,语法如下:
docker tag <image_id> image/tag
例如,为 ID 为
b5f8b706670f
的
coreiis
容器镜像打
v1.0
标签:
docker tag b5f8b706670f coreiis:v1.0
再次运行
docker images
命令,就能看到新的标签。
2. 容器网络
2.1 不同类型的网络连接
Windows 容器网络有五种不同的模式:
| 网络模式 | 描述 | 使用场景 |
| ---- | ---- | ---- |
| NAT | 默认网络模式,容器运行时若未指定其他网络,将分配到 NAT 网络,并从
172.16.0.0/16
范围内分配 IP 地址。 | 开发者或家庭实验室 |
| Overlay | 当 Docker 引擎配置为 Swarm 模式时,允许容器与其他容器主机上的容器通信。 | Docker Swarm 多节点架构 |
| Transparent | 类似于传统网络连接,容器可直接与外部世界交互。 | 开发者或小规模部署 |
| L2bridge | 容器与容器主机处于同一子网,并通过外部交换机连接到物理网络。 | Kubernetes 和 Microsoft SDN |
| L2tunnel | 专为 Microsoft 云栈和 Azure 设计,与 L2bridge 类似,但所有容器间通信都发送到物理 Hyper - V 主机。 | 仅适用于 Azure |
2.2 查看网络适配器和虚拟交换机
-
查看容器网络
:运行
docker network ls命令列出为容器定义的所有网络。若未配置,将看到 Docker 引擎首次运行时创建的默认 NAT 连接。
docker network ls
-
查看虚拟交换机
:运行
Get - VMSwitch命令查看当前机器上的虚拟交换机。若为全新安装,通常只有一个名为 NAT 的内部虚拟交换机。
Get - VMSwitch
2.3 配置网络地址转换(NAT)网络连接
默认会创建一个 NAT 网络,但受限于 Microsoft 分配的
172.16.0.0/16
大子网。若要定义更小的子网,可使用以下命令创建自定义 NAT 连接:
docker network create -d nat --subnet=<subnet with cidr> --gateway=<network_gwaddress> <nat_network_name>
运行此命令后,可使用
docker network ls
命令查看新创建的 NAT 连接。
2.4 配置透明网络连接
透明网络连接使容器能直接与外部世界交互,创建透明网络的命令比创建 NAT 网络的命令更简单,无需定义子网或默认网关:
docker network create -d transparent <network_name>
此命令会创建透明网络和对应的外部虚拟交换机(若之前没有)。若要控制容器流量通过的网络适配器,可绑定到特定网络接口:
docker network create -d transparent -o com.docker.network.windowsshim.interface="net_adapter_name" <network_name>
2.5 配置覆盖网络连接
覆盖网络用于支持 Docker Swarm 中容器主机间的容器通信。需注意,编写本文时,Windows 容器节点不支持加密覆盖网络。创建覆盖网络的命令如下:
docker network create -d overlay <network_name>
为支持覆盖网络通信,需在容器主机上打开以下防火墙端口:
- TCP 2377:集群管理流量
- TCP/UDP 7946:节点间通信
- UDP 4789:覆盖网络通信
2.6 配置 L2bridge 网络连接
L2bridge 网络使容器与容器主机处于同一子网,并通过外部交换机连接到物理网络。创建 L2bridge 网络的命令如下:
docker network create -d l2bridge --subnet=192.168.1.0/24 --gateway= 192.168.1.1 BridgeNet
运行命令后,可使用
docker network ls
和
Get - VMSwitch
命令验证网络连接是否创建成功。
2.7 配置 L2tunnel 网络连接
L2tunnel 连接专为 Microsoft 云栈和 Azure 设计,与 L2bridge 类似,但所有容器间通信都发送到物理 Hyper - V 主机。创建 L2tunnel 网络的命令如下:
docker network create -d l2tunnel --subnet=192.168.1.0/24 --gateway= 192.168.1.1 TunnelNet
同样,可使用
docker network ls
和
Get - VMSwitch
命令验证网络连接是否创建成功。
2.8 删除网络连接
若需要删除已配置的网络连接,可使用
docker network rm
命令,示例如下:
docker network rm <network name>
例如,删除名为
BridgeNet
的 L2bridge 网络:
docker network rm BridgeNet
2.9 连接到网络
在运行容器时,可使用以下命令指定容器要连接的网络:
docker run -dit --network=<network_name> <image_name>
对于某些类型的网络连接(如透明网络和 L2bridge 网络,若容器主机是虚拟机),可能需要启用媒体访问控制(MAC)地址欺骗,可运行以下命令:
Get - VMNetworkAdapter -VMName <container_host_name> | Set - VMNetworkAdapter -MacAddressSpoofing On
3. 容器存储
3.1 了解容器存储
Windows 容器中的存储称为层存储,因为对容器所做的更改是基于基础容器镜像的一层。默认情况下,层存储在
C:\ProgramData\docker
下的
image
和
windowsfilter
目录中。
若要更改存储位置,可在 Docker 引擎的配置文件
daemon.json
中添加
data - root
条目,并指定存储层的路径。最佳实践是将其设置在系统卷以外的位置。同时,不要直接通过文件系统更改层,应使用 Docker 命令(如
docker images
、
docker rmi
和
docker pull
)来管理层。
3.2 在容器内创建卷
若应用程序需要自己的卷,可在运行时创建卷。创建卷的命令如下:
docker run -it -v <volumepath> <imagename>
例如,为
coreiis
容器镜像创建一个名为
Data
的卷:
docker run -it -v C:\Data coreiis
此命令会在容器内创建一个符号链接,指向容器主机上的实际存储位置。默认情况下,卷存储在
C:\ProgramData\docker\volumes\volID\_data
中。
若要查看容器主机上的所有卷,可运行
docker volume ls
命令;若要获取卷的详细信息(如存储位置),可运行
docker volume inspect <volumeid>
命令。
为方便管理卷,可在创建卷时指定名称,示例如下:
docker run -it -v MyVolume:c:\data coreiis
3.3 使用持久卷
持久卷是使数据对容器可用的首选方法,可使多个容器共享同一卷,并确保数据在容器创建或销毁时持久存在。创建容器卷时,有两种类型的卷可供选择:
-
绑定挂载(Bind mounts)
:将主机上的存储挂载到容器中,性能最佳,但功能不如卷丰富。默认情况下,绑定挂载是读写启用的,示例如下:
docker run -v c:\ContainerData:c:\Data <imagename>
若只希望容器有只读访问权限,需在绑定命令中指定:
docker run -v c:\ContainerData:c:\Data:RO <imagename>
- 命名卷(Named volumes) :是在容器外部存储数据的首选方法,由 Docker 完全管理,可在多个容器间共享。
3.3 使用持久卷(续)
3.3.1 绑定挂载与命名卷对比
| 卷类型 | 优点 | 缺点 | 使用场景 |
|---|---|---|---|
| 绑定挂载 | 性能最佳 | 功能不如卷丰富,依赖容器主机 | 对性能要求极高的场景 |
| 命名卷 | 由 Docker 完全管理,可在多个容器间共享 | - | 多个容器需要共享数据的场景 |
3.3.2 持久卷使用示例
以下是一个使用命名卷的示例,我们将创建一个名为
my_named_volume
的命名卷,并在容器中使用它:
# 创建命名卷
docker volume create my_named_volume
# 运行容器并使用命名卷
docker run -it -v my_named_volume:/app/data <imagename>
在这个示例中,我们首先使用
docker volume create
命令创建了一个命名卷
my_named_volume
,然后在运行容器时,通过
-v
参数将该命名卷挂载到容器的
/app/data
目录下。
3.4 容器存储的流程图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{选择存储类型}:::decision
B -->|层存储| C(配置存储位置):::process
B -->|卷存储| D{选择卷类型}:::decision
D -->|绑定挂载| E(指定挂载路径):::process
D -->|命名卷| F(创建命名卷):::process
C --> G(使用 Docker 命令管理层):::process
E --> H(运行容器并挂载):::process
F --> H
H --> I([结束]):::startend
4. 总结
4.1 容器管理要点回顾
-
容器镜像管理
:通过
docker login连接不同注册表服务,使用docker tag进行镜像版本控制。 - 容器网络配置 :了解五种不同的网络模式(NAT、Overlay、Transparent、L2bridge、L2tunnel),掌握查看、创建、删除和连接网络的命令。
- 容器存储管理 :熟悉层存储和卷存储的概念,学会在容器内创建卷和使用持久卷(绑定挂载和命名卷)。
4.2 实践建议
在实际应用中,根据不同的需求选择合适的容器管理策略。例如,对于开发和测试环境,可以使用 NAT 网络和绑定挂载,以提高开发效率;对于生产环境,建议使用 Overlay 网络和命名卷,以确保容器的高可用性和数据的持久性。
4.3 未来展望
随着容器技术的不断发展,容器管理将变得更加智能化和自动化。未来可能会出现更多的工具和平台,帮助我们更轻松地管理容器镜像、网络和存储。同时,容器安全也将成为一个重要的研究方向,以保障容器环境的安全稳定运行。
通过本文的介绍,相信你对容器管理有了更深入的了解。希望这些知识能帮助你在实际工作中更好地使用容器技术。
超级会员免费看
1131

被折叠的 条评论
为什么被折叠?



