当前位置: 首页 > news >正文

Docker 与 Podman常用知识汇总

一、常用命令的对比汇总

1、基础说明

  • Docker:传统的容器引擎,使用 dockerd 守护进程。

  • Podman:无守护进程、无root容器引擎,兼容 Docker CLI。

Podman 命令几乎完全兼容 Docker 命令,只需将 docker 替换为 podman

2、命令对比总表

1. 镜像管理(Images)

功能Docker 命令Podman 命令说明示例
拉取镜像docker pullpodman pull从远程仓库拉取镜像docker pull nginx
查看镜像docker imagespodman images列出本地镜像podman images
删除镜像docker rmipodman rmi删除本地镜像docker rmi nginx
构建镜像docker buildpodman build根据 Dockerfile 构建镜像docker build -t myapp .

2. 容器管理(Containers)

功能Docker 命令Podman 命令说明示例
运行容器docker runpodman run运行新容器docker run -d -p 80:80 nginx
查看容器docker pspodman ps查看运行中容器podman ps
查看所有容器docker ps -apodman ps -a包含已停止容器podman ps -a
停止容器docker stoppodman stop停止容器运行docker stop mycontainer
启动容器docker startpodman start启动已停止容器podman start mycontainer
删除容器docker rmpodman rm删除容器docker rm mycontainer
查看容器日志docker logspodman logs查看容器输出docker logs mycontainer
进入容器docker exec -itpodman exec -it在容器中执行命令docker exec -it mycontainer bash

3. 镜像仓库与标签(Registry & Tags)

功能Docker 命令Podman 命令说明示例
给镜像打标签docker tagpodman tag添加镜像别名docker tag nginx myrepo/nginx:latest
推送镜像docker pushpodman push上传镜像到远程仓库docker push myrepo/nginx
登录仓库docker loginpodman login登录远程仓库podman login registry.example.com

4. 容器网络(Networking)

功能Docker 命令Podman 命令说明示例
创建网络docker network createpodman network create创建自定义网络docker network create mynet
查看网络docker network lspodman network ls显示可用网络podman network ls
删除网络docker network rmpodman network rm删除自定义网络docker network rm mynet

5. 容器卷(Volumes)

功能Docker 命令Podman 命令说明示例
创建卷docker volume createpodman volume create创建数据卷docker volume create myvol
查看卷docker volume lspodman volume ls列出所有卷podman volume ls
删除卷docker volume rmpodman volume rm删除数据卷podman volume rm myvol
挂载卷运行容器docker run -vpodman run -v挂载卷到容器docker run -v myvol:/data nginx

6. 容器导入导出(Import/Export)

功能Docker 命令Podman 命令说明示例
导出容器docker exportpodman export导出容器文件系统为 tar 包docker export mycontainer > mycontainer.tar
导入容器docker importpodman import从 tar 文件导入镜像docker import mycontainer.tar
保存镜像docker savepodman save保存镜像为 tar 包docker save nginx > nginx.tar
加载镜像docker loadpodman load从 tar 包加载镜像docker load < nginx.tar

7. 容器信息与检查(Inspect)

功能Docker 命令Podman 命令说明示例
检查镜像/容器详情docker inspectpodman inspect查看对象详细信息docker inspect mycontainer

 8. 系统资源(System)

功能Docker 命令Podman 命令说明示例
清理无用资源docker system prunepodman system prune清理未使用镜像、容器等podman system prune -a
查看磁盘使用docker system dfpodman system df显示容器磁盘使用情况docker system df
查看版本docker versionpodman version查看当前版本podman version
查看系统信息docker infopodman info显示系统整体信息podman info

9. Podman 专属命令

功能Podman 命令说明示例
创建 podpodman pod create创建一组共享网络和命名空间的容器组podman pod create --name mypod
将容器加入 podpodman run --pod运行容器加入已有 podpodman run --pod=mypod nginx
查看 podpodman pod ps显示当前 podspodman pod ps
删除 podpodman pod rm删除 podpodman pod rm mypod

3、总结

  • Docker 是工业标准,支持广泛,适合多数部署环境。

  • Podman 更安全、无 root、支持 systemd 集成,更适合企业和开发环境的细粒度管理。

二、 网络知识

1、基本网络原理

Docker 与 Podman 网络模型对比:

特性Docker 默认Podman 默认
网络驱动bridge、host、overlay、macvlan 等CNI(Container Network Interface)
网络隔离机制使用 docker0 网桥,iptables/NAT 规则管理使用 CNI 插件(同 Kubernetes 网络方式)
默认网段172.17.0.0/16通常为 10.88.0.0/16(由 CNI 配置)
服务暴露方式-p 端口映射 或 host 网络同样使用 -p--network=host
网络可管理性Docker 自带命令管理网络Podman 借助 CNI 插件配置,如 netavark

2、Docker 网络原理

1. Docker 默认网络

运行 docker network ls 可看到:

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b6509f3a0fd6   bridge    bridge    local
65a3c49f9fd3   host      host      local
5d6785e4d07b   none      null      local
  • bridge:默认,容器间可通信,外部需端口映射。

  • host:使用主机网络,容器与宿主机共享网络。

  • none:无网络连接,最安全但最孤立。

2. 容器连接到网络

docker run --name web --network bridge -p 8080:80 nginx
  • --network 连接到指定网络

  • -p 映射主机端口到容器端口

3. 创建自定义网络

docker network create mynet
docker run --rm -it --network=mynet busybox
  • 容器可通过名称互相解析(DNS 支持) 

3、Podman 网络原理

1. Podman 使用 CNI 插件

默认使用 /etc/cni/net.d/ 下的配置文件(如 87-podman-bridge.conflist)定义网络:

{
  "cniVersion": "0.4.0",
  "name": "podman",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni-podman0",
      "ipam": {
        "type": "host-local",
        "subnet": "10.88.0.0/16"
      }
    }
  ]
}

 2. 查看 Podman 网络

podman network ls

3. 启动容器并使用网络

podman run -d --name web --network podman -p 8080:80 nginx

Podman 会自动创建 cni-podman0 网桥并配置 NAT、防火墙规则。

4、进阶:自定义网络

Docker 自定义网络(桥接)

docker network create \
  --driver bridge \
  --subnet=192.168.100.0/24 \
  --gateway=192.168.100.1 \
  custom_net

Podman 自定义网络

podman network create \
  --subnet 192.168.200.0/24 \
  --gateway 192.168.200.1 \
  custom_net

 然后运行容器:

podman run --rm -it --network custom_net alpine

5、常见场景与命令总结

场景Docker 命令Podman 命令
查看网络docker network lspodman network ls
创建网络docker network createpodman network create
查看容器 IPdocker inspectpodman inspect
使用 host 网络--network host--network host
显示网络配置/etc/docker/daemon.json/etc/cni/net.d/

6、实用建议

  1. 开发环境:建议使用 bridge + 端口映射。

  2. 生产环境

    • 高性能需求:使用 --network=host

    • 多容器通信:创建自定义网络,容器间通过 DNS 名称通信

  3. 安全需求:使用 --network=none,禁用网络

7、常见容器网络架构

容器可以创建多种网络架构,这些架构决定了容器如何与其他容器以及外部网络进行通信。以下是一些常见的容器网络架构及其特点:

1. Bridge 网络(默认模式)

  • 架构原理:
    • 容器运行时(如 Docker)会在宿主机上创建一个虚拟的以太网桥(通常命名为 docker0)。
    • 每个容器启动时,都会创建一对虚拟网络接口(veth pair)。其中一个接口位于容器的网络命名空间中(例如 eth0),另一个接口连接到宿主机上的桥接网络。
    • 宿主机上的桥接网络负责在连接到它的所有网络接口(包括容器的虚拟接口和宿主机的物理网卡)之间转发数据包。
    • 容器通过桥接网络的私有 IP 地址进行通信。
    • 当容器需要访问外部网络时,通常会通过宿主机的网络地址转换(NAT)将容器的私有 IP 地址转换为宿主机的 IP 地址,然后通过宿主机的物理网卡进行通信。
  • 特点:
    • 隔离性好: 每个容器拥有独立的网络命名空间和私有 IP 地址,相互之间默认是隔离的。
    • 易于管理: 这是最简单和最常用的网络模式,容器运行时会自动创建和管理桥接网络。
    • 端口映射: 要使外部网络能够访问容器内的服务,需要进行端口映射(Port Mapping),将宿主机上的某个端口映射到容器内的端口。
    • 容器间通信: 同一个桥接网络上的容器可以直接通过 IP 地址进行通信。
    • 外部访问限制: 默认情况下,外部网络无法直接访问容器,需要通过端口映射才能实现。

2. Host 网络

  • 架构原理:
    • 容器直接共享宿主机的网络命名空间。
    • 容器不会创建自己的虚拟网络接口,而是直接使用宿主机的网络接口和 IP 地址。
    • 容器内的服务监听的端口直接暴露在宿主机上,无需进行端口映射。
  • 特点:
    • 性能高: 由于容器直接使用宿主机的网络栈,避免了额外的虚拟化开销,网络性能相对较高。
    • 端口冲突风险: 同一台宿主机上的多个容器不能监听相同的端口,因为它们共享同一个网络命名空间。
    • 隔离性差: 容器与宿主机共享网络环境,隔离性较差。
    • 配置简单: 无需进行端口映射,配置相对简单。
  • 适用场景:
    • 对网络性能要求较高的场景。
    • 只需要运行单个需要特定端口的服务,且不需要与其他容器隔离网络的情况。

3. Macvlan/IPVlan 网络

  • 架构原理:
    • 允许为容器分配宿主机物理网络接口上的 MAC 地址和 IP 地址。
    • 每个容器在物理网络上看起来就像一个独立的物理设备。
    • Macvlan: 基于单个物理接口创建多个虚拟接口,每个接口拥有独立的 MAC 地址。
    • IPVlan: 允许多个虚拟接口共享同一个 MAC 地址,但拥有不同的 IP 地址。
  • 特点:
    • 直接接入物理网络: 容器可以直接与物理网络中的其他设备通信,无需 NAT 或端口映射。
    • 更好的兼容性: 对于某些需要直接与物理网络交互的应用(例如某些网络设备或监控工具)非常有用。
    • 需要网络支持: 可能需要在物理网络交换机上进行额外的配置(例如允许混杂模式)。
    • 管理复杂性: 配置和管理相对复杂。
  • 适用场景:
    • 需要容器在物理网络中拥有独立身份的场景。
    • 需要容器直接与物理网络中的设备进行通信的场景。

4. Overlay 网络

  • 架构原理:
    • 构建在现有网络之上的虚拟网络。
    • 允许多个宿主机上的容器在逻辑上属于同一个网络,即使它们在不同的物理网络中。
    • 通常使用隧道技术(例如 VXLAN)将不同宿主机上的容器网络连接起来。
  • 特点:
    • 跨主机通信: 使得部署在不同宿主机上的容器能够像在同一个局域网中一样进行通信。
    • 灵活的网络拓扑: 可以创建复杂的网络拓扑结构。
    • 适用于微服务架构: 非常适合跨多个主机部署的微服务应用。
    • 管理复杂性: 配置和管理相对复杂,通常需要专门的网络编排工具(例如 Docker Swarm 或 Kubernetes)。
  • 适用场景:
    • 需要跨多个宿主机部署容器化应用的场景。
    • 需要构建复杂的、可扩展的容器网络拓扑的场景。

5. Custom 网络

  • 架构原理:
    • 用户可以根据自己的需求创建自定义的网络。
    • 可以是自定义的桥接网络,也可以是使用第三方网络插件创建的网络(例如 Calico、Flannel、Weave Net 等)。
  • 特点:
    • 高度灵活性: 可以根据具体需求定制网络配置,例如指定 IP 地址范围、子网、网关等。
    • 可扩展性: 可以通过第三方网络插件扩展容器网络的功能,例如网络策略、安全控制等。
    • 管理复杂性: 配置和管理取决于自定义网络的类型和所使用的工具。
  • 适用场景:
    • 需要特定的网络配置或功能的场景。
    • 需要集成第三方网络解决方案的场景。

选择哪种网络架构取决于你的具体需求,包括:

  • 容器之间的隔离要求
  • 容器是否需要直接暴露给外部网络
  • 是否需要跨多个宿主机进行容器通信
  • 对网络性能的要求
  • 管理的复杂性

三、在 PVE 虚拟网络下配置 Docker(或Podman) 网络桥

1、场景目标

  • Docker 容器运行在 PVE 中的 VM;

  • 每个容器拥有独立内网 IP,可被其他主机访问;

  • 网络桥使用 Proxmox 提供的桥(如 vmbr0);

  • 可选:静态 IP、DHCP、容器间通信。 

2、PVE 虚拟机网络准备

假设:

  • 宿主机 PVE 的桥接网卡为 vmbr0

  • 它连接到内网的物理交换机;

  • 容器网络希望使用该网桥,以获得和宿主一样的内网地址(如 192.168.1.x)。

在 PVE 中创建网桥:

/etc/network/interfaces 中应有类似配置:

auto vmbr0
iface vmbr0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports enp3s0
    bridge_stp off
    bridge_fd 0

3、Docker 使用 macvlan 桥接到 vmbr0

1. 创建 macvlan 网络(桥接到宿主网卡)

在宿主机(VM 内部)执行:

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  docker_macvlan
  • parent=eth0 为 VM 的网卡设备,需根据实际替换;

  • 此网卡需支持混杂模式(Proxmox 网桥需设置 bridge_ports 启用混杂模式);

  • 子网和网关请根据你的内网实际情况配置。

📌 重要提醒:macvlan 网络的容器无法直接访问宿主机(除非用额外配置)。

2. 使用该网络启动容器

docker run --rm -d \
  --name nginx_mac \
  --network docker_macvlan \
  --ip 192.168.1.88 \
  nginx
  • 容器将直接获得 192.168.1.88,和内网其他设备互通。 

4、Podman 使用 macvlan 桥接(类似)

podman network create \
  --driver macvlan \
  --subnet 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  --macvlan eth0 \
  podman_macvlan

 然后运行:

podman run --rm -d \
  --network podman_macvlan \
  --ip 192.168.1.89 \
  nginx

5、让容器访问宿主机(可选)

由于 macvlan 本质上“隔离”了宿主机,可添加一个额外的 veth 接口桥接:

步骤如下(高级):

  1. 创建一个额外接口桥接到宿主;

  2. 配置 NAT 或 static route;

  3. 或者在 PVE 中启用 macvtap 并使用虚拟交换机。 

6、总结:PVE + Docker 网络桥配置方案

项目方法是否推荐
Bridge 桥接到 vmbr0使用 macvlan✅ 推荐
宿主可访问容器使用 veth + bridge⚠️ 需额外配置
容器独立 IP是(可访问内网)
支持 DHCP 分配否(需静态 IP)⚠️ 限制
容器间通信支持(同一 macvlan 网络)

相关文章:

  • tmpfs的监控筛选/dev/shm下的shmem创建
  • Linux——基础开发工具
  • 【第43节】实验分析windows异常分发原理
  • 低功耗设计:Level Shift的种类(以SAED EDK 32/28nm工艺库为例)
  • ubuntu上,e1000e,i1210有线网卡驱动安装
  • 从暴力到动态规划再到双指针:使用 Java 探索接雨水问题的不同解法
  • 处理Long类型长度超长导致前端精度丢失问题
  • Python用户管理系统深度解析(附源码):从类设计到安全实现的完整指南
  • 「数据可视化 D3系列」入门第一章:Hello D3.js
  • 数据库实战篇,JSON对象在Kooboo中的实际应用(二)
  • SQL注入之时间盲注攻击流程详解
  • SLAM文献之DM-VIO: Delayed Marginalization Visual-Inertial Odometry
  • 大模型之Hugging Face
  • 信奥还能考吗?未来三年科技特长生政策变化
  • 【开发教程】学生团队项目开发协调管理文档库构建以及使用指南
  • #4 为什么要物联以及 物联网的整体结构
  • linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件
  • 【blender小技巧】Blender导出带贴图的FBX模型,并在unity中提取材质模型使用
  • telepresence使用指南
  • 【LH-开发记录】
  • 北京市平谷区政协原主席王春辉接受纪律审查和监察调查
  • 广州远洋宾馆负一层配电房发生火情:明火已扑灭,无人员伤亡
  • A股三大股指集体高开,黄金股大幅回调
  • 东方富海陈玮: 什么样的创业者能让天使投资人愿意下注
  • 打造“旧书朋友圈”,“淘书乐”为旧书找“新朋友”
  • 中国全国政协-越南祖国阵线中央暨边境省份组织第三次友好交流活动在南宁开幕