48、容器管理:镜像、网络与存储全解析

容器管理:镜像、网络与存储全解析

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 未来展望

随着容器技术的不断发展,容器管理将变得更加智能化和自动化。未来可能会出现更多的工具和平台,帮助我们更轻松地管理容器镜像、网络和存储。同时,容器安全也将成为一个重要的研究方向,以保障容器环境的安全稳定运行。

通过本文的介绍,相信你对容器管理有了更深入的了解。希望这些知识能帮助你在实际工作中更好地使用容器技术。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值