Docker 与 Podman常用知识汇总
一、常用命令的对比汇总
1、基础说明
-
Docker:传统的容器引擎,使用
dockerd
守护进程。 -
Podman:无守护进程、无root容器引擎,兼容 Docker CLI。
Podman 命令几乎完全兼容 Docker 命令,只需将
docker
替换为podman
。
2、命令对比总表
1. 镜像管理(Images)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
拉取镜像 | docker pull | podman pull | 从远程仓库拉取镜像 | docker pull nginx |
查看镜像 | docker images | podman images | 列出本地镜像 | podman images |
删除镜像 | docker rmi | podman rmi | 删除本地镜像 | docker rmi nginx |
构建镜像 | docker build | podman build | 根据 Dockerfile 构建镜像 | docker build -t myapp . |
2. 容器管理(Containers)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
运行容器 | docker run | podman run | 运行新容器 | docker run -d -p 80:80 nginx |
查看容器 | docker ps | podman ps | 查看运行中容器 | podman ps |
查看所有容器 | docker ps -a | podman ps -a | 包含已停止容器 | podman ps -a |
停止容器 | docker stop | podman stop | 停止容器运行 | docker stop mycontainer |
启动容器 | docker start | podman start | 启动已停止容器 | podman start mycontainer |
删除容器 | docker rm | podman rm | 删除容器 | docker rm mycontainer |
查看容器日志 | docker logs | podman logs | 查看容器输出 | docker logs mycontainer |
进入容器 | docker exec -it | podman exec -it | 在容器中执行命令 | docker exec -it mycontainer bash |
3. 镜像仓库与标签(Registry & Tags)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
给镜像打标签 | docker tag | podman tag | 添加镜像别名 | docker tag nginx myrepo/nginx:latest |
推送镜像 | docker push | podman push | 上传镜像到远程仓库 | docker push myrepo/nginx |
登录仓库 | docker login | podman login | 登录远程仓库 | podman login registry.example.com |
4. 容器网络(Networking)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
创建网络 | docker network create | podman network create | 创建自定义网络 | docker network create mynet |
查看网络 | docker network ls | podman network ls | 显示可用网络 | podman network ls |
删除网络 | docker network rm | podman network rm | 删除自定义网络 | docker network rm mynet |
5. 容器卷(Volumes)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
创建卷 | docker volume create | podman volume create | 创建数据卷 | docker volume create myvol |
查看卷 | docker volume ls | podman volume ls | 列出所有卷 | podman volume ls |
删除卷 | docker volume rm | podman volume rm | 删除数据卷 | podman volume rm myvol |
挂载卷运行容器 | docker run -v | podman run -v | 挂载卷到容器 | docker run -v myvol:/data nginx |
6. 容器导入导出(Import/Export)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
导出容器 | docker export | podman export | 导出容器文件系统为 tar 包 | docker export mycontainer > mycontainer.tar |
导入容器 | docker import | podman import | 从 tar 文件导入镜像 | docker import mycontainer.tar |
保存镜像 | docker save | podman save | 保存镜像为 tar 包 | docker save nginx > nginx.tar |
加载镜像 | docker load | podman load | 从 tar 包加载镜像 | docker load < nginx.tar |
7. 容器信息与检查(Inspect)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
检查镜像/容器详情 | docker inspect | podman inspect | 查看对象详细信息 | docker inspect mycontainer |
8. 系统资源(System)
功能 | Docker 命令 | Podman 命令 | 说明 | 示例 |
---|---|---|---|---|
清理无用资源 | docker system prune | podman system prune | 清理未使用镜像、容器等 | podman system prune -a |
查看磁盘使用 | docker system df | podman system df | 显示容器磁盘使用情况 | docker system df |
查看版本 | docker version | podman version | 查看当前版本 | podman version |
查看系统信息 | docker info | podman info | 显示系统整体信息 | podman info |
9. Podman 专属命令
功能 | Podman 命令 | 说明 | 示例 |
---|---|---|---|
创建 pod | podman pod create | 创建一组共享网络和命名空间的容器组 | podman pod create --name mypod |
将容器加入 pod | podman run --pod | 运行容器加入已有 pod | podman run --pod=mypod nginx |
查看 pod | podman pod ps | 显示当前 pods | podman pod ps |
删除 pod | podman pod rm | 删除 pod | podman 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 ls | podman network ls |
创建网络 | docker network create | podman network create |
查看容器 IP | docker inspect | podman inspect |
使用 host 网络 | --network host | --network host |
显示网络配置 | /etc/docker/daemon.json | /etc/cni/net.d/ |
6、实用建议
-
开发环境:建议使用 bridge + 端口映射。
-
生产环境:
-
高性能需求:使用
--network=host
-
多容器通信:创建自定义网络,容器间通过 DNS 名称通信
-
-
安全需求:使用
--network=none
,禁用网络
7、常见容器网络架构
容器可以创建多种网络架构,这些架构决定了容器如何与其他容器以及外部网络进行通信。以下是一些常见的容器网络架构及其特点:
1. Bridge 网络(默认模式)
- 架构原理:
- 容器运行时(如 Docker)会在宿主机上创建一个虚拟的以太网桥(通常命名为
docker0
)。 - 每个容器启动时,都会创建一对虚拟网络接口(
veth pair
)。其中一个接口位于容器的网络命名空间中(例如eth0
),另一个接口连接到宿主机上的桥接网络。 - 宿主机上的桥接网络负责在连接到它的所有网络接口(包括容器的虚拟接口和宿主机的物理网卡)之间转发数据包。
- 容器通过桥接网络的私有 IP 地址进行通信。
- 当容器需要访问外部网络时,通常会通过宿主机的网络地址转换(NAT)将容器的私有 IP 地址转换为宿主机的 IP 地址,然后通过宿主机的物理网卡进行通信。
- 容器运行时(如 Docker)会在宿主机上创建一个虚拟的以太网桥(通常命名为
- 特点:
- 隔离性好: 每个容器拥有独立的网络命名空间和私有 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
接口桥接:
步骤如下(高级):
-
创建一个额外接口桥接到宿主;
-
配置 NAT 或 static route;
-
或者在 PVE 中启用
macvtap
并使用虚拟交换机。
6、总结:PVE + Docker 网络桥配置方案
项目 | 方法 | 是否推荐 |
---|---|---|
Bridge 桥接到 vmbr0 | 使用 macvlan | ✅ 推荐 |
宿主可访问容器 | 使用 veth + bridge | ⚠️ 需额外配置 |
容器独立 IP | 是(可访问内网) | ✅ |
支持 DHCP 分配 | 否(需静态 IP) | ⚠️ 限制 |
容器间通信 | 支持(同一 macvlan 网络) | ✅ |