Podman与Docker的差别

Podman与Docker的差别

Podman: Pod管理器

Pod: k8s核心调度单元

man: manager

镜像与容器:镜像是容器的模板,容器是镜像的运行实例

Docker仓房就是存放分享镜像的地方

OCI开放容器倡议

OCI开放容器倡议(Open Container Initiative):定义了镜像是如何编写、存储和分发;Podman一开始就遵循这个协议,所以Podman可以直接运行Docker的镜像,无需额外的配置。

  • 优势一:兼容Docker

    podman优势一

  • 优势二:命令行与Docker高度一致;甚至可以直接alias docker=podman设置别名,来由Docker过渡到podman,降低学习成本

Docker与Podman

  • docker依赖一个通常由root用户启动的守护进程dockerd(守护进程:是一种在操作系统后台长期静默运行的特殊程序)

  • containd:容器运行时,可以简单理解成控制容器的软件

  • runc:低级别容器运行时

  • podman是一个轻量级命令行工具,没有守护进程执行Podman命令时是直接调用runc与操作系统内核进行交互管理容器(更安全、更灵活)

docker与podman

原生Pod支持

Pod是一个k8s中的概念,是k8s的核心调度单元,一个Pod由一个或多个紧密耦合的容器组成。Podman使用Pod批量管理多个容器;对比Docker,Podman中的Pod是代替了Docker中的Docker compose的功能,用来统一管理多个容器,和k8s亲和度更高,可以无缝切换到k8s上运行

Pod原生支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建Pod
podman pod create --name my-pod -p 8081:8081

# 查看创建的Pod
podman pod list

# 示例
podman run -d --pod my-pod --name my_mongodb -e MONGO_INITDB_ROOT_USERBANE=admin -e MONGO_INITDB_ROOT_PASSWORD=admin -v /home/test/mongo_data:/data/db docker.io/library/mongo
podman run -d --pod my-pod --name my_mongodb_express -e ME_CONFIG_MONGODB_SERVER-localhost -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin -e ME_CONFIG_MONGODB_ADMINPASSWORD=admin docker.io/library/mongo-express

# 停止Pod
podman pod stop my-pod

# 启动Pod
podman pod start my-pod

# 导出Pod配置文件,兼容k8s
podman generate kube my-pod>my-pod.yaml

# 删除Pod
podman pod rm -f my-pod

# 使用配置文件创建Pod
podman play kube my-pod.yaml
  • 示例中ip地址使用localhost是由于两个容器处于同一个Pod中,他们的IP地址完全一样的,Pod的网路是宿主机内部的一个子网,和宿主机是桥接的关系。

Podman开机自启

Podman没有守护进程,无法做法开启自动启动Pod或者多个容器,可以借助linux的守护进程systemd实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用podman生成一个systemd的配置文件
podman generate systemd --name my-pod --new --files

# 在用户的home目录创建一个文件夹
mkdir -p ~/.config/systemd/user/

# 将生成的配置文件全部拷贝到创建的目录下
cp pod-my-pod.service container-*.service ~/.config/systemd/user/

# 重新载入systemd
systemctl --user daemon-reload

# 让配置生效
systemctl --user enable --now pod-my-pod.service

# 把当前用户配置成黏连的模式
sudo loginctl enable-linger $(whoami)