Docker 要凉了?
原文: https://www.zido.site/blog/2021-09-22-prepare-podman/
什么是 Podman
Podman 是一个无守护程序 的开源 Linux 原生工具,旨在使用开放容器倡议(OCI)容器和容器镜像轻松查找、运行、构建、共享和部署应用程序。Podman提供了一个使用过 Docker 容器引擎的人都熟悉的命令行界面(CLI)。大多数用户可以简单地将 Docker 设置为 Podman 的别名(alias docker=podman
),没有任何问题。与其他常见的容器引擎(Docker、CRI-O、containerd)类似,Podman依赖于一个符合OCI标准的容器运行时间(runc、crun、runv等)来与操作系统对接并创建运行的容器。这使得由Podman创建的运行容器与其他普通容器引擎创建的容器几乎没有区别。
Podman 几乎就是 Docker 的替代品。为什么有了 Docker 还需要 Podman?
显而易见, Docker 太臃肿了,另外,它需要守护进程运行,通过套接字与特权进程通信来运行容器的方式是不安全的。
我们需要一套更轻量、更标准化、发展更快速的工具,而 Podman 就是其中之一。
- 不需要守护进程。
- 大部分情况下甚至不需要 Root 权限。
- 天生为 OCI 景象格式而生。
安装与配置
Podman 的安装是非常简单的,在各大 Linux 发行版下基本都能直接安装(Ubuntu 简直是耻辱,还要加 PPA)。
我的 ArchLinux 运行 sudo pamcan -S podman
即可。
配置 rootless
正常情况下,你就已经可以使用 sudo podman run --rm hello-world
来验证结果了,但是为了体现 podman 的安全性,我们会选择使用 rootless 模式来运行。
首先,检查 kernel.unprivileged_userns_clone
内核参数:
sysctl kernel.unprivileged_userns_clone
如果输出为 0,你需要使用将它设置为 1 。
接下來需要检查 subuid
和 subgid
。
cat /etc/subuid
cat /etc/subgid
如果没有值,那么可以通过touch /etc/subuid /etc/subgid
来新建文件,然后使用以下命令来设置值:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 username
也可以直接编写这两个文件:
$ cat /etc/subuid
username:100000:65536
$ cat /etc/subgid
username:100000:65536
修改完之后,podman 并不会直接生效,还需要运行以下命令:
podman system migrate
配置国内源
接下來,可以配置国内源了,在这之前,我们需要知道,当配置完 rootless 模式之后,会新增一个用户配置文件的读取路径,原来的配置文件路径为/etc/containers
,当使用 rootless 模式之后,则会读取${XDG_CONFIG_HOME/containers}
(通常是~/.config/containers
目录)。
因此我们可以直接编辑这里的配置文件来单独配置此用户的国内源,也可以直接编辑全局配置文件。
在配置文件夹下编辑(没有就创建) registries.conf
。
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
insecure = false
blocked = false
location = "docker.io"
[[registry.mirror]]
location = "f1361db2.m.daocloud.io"
[[registry.mirror]]
location = "registry.docker-cn.com"
这会依次使用以下 url 去查找下载镜像。
- registry.docker-cn.com
- f1361db2.m.daocloud.io
- docker.io
总结
配置上会稍微比 docker 繁琐一点,但是还好就一次配置,并且无守护进程的体验确实会很爽。
podman 是新时代容器化工具的三大神器的核心,也是 docker 的替代品,现在仍然在活跃的快速演进。 随着 k8s 的发展,docker 想来真的是要被驱逐出核心圈子了。
用起来了
坏起来了
原因找到了、是163镜像源的问题、看来是镜像同步的时候缺少一些必要的东西
建议修改配置文件为如下:
已修改
确实网易的镜像站经常会出现这种校验不通过的情况。😂
其实现在docker主要服务的是企业级客户
dockershim 已经被弃用了, docker 确实活不了几年了, 主要是被 k8s 降维打击。 可怜了 docker 这个容器化先驱。
单独的 docker 在企业级应用里面其实没有太大的用处的。基本上都是因为其稳定了这么多年,很多企业不敢换。
docker desktop
Mirantis 收购docker之后 重点也是k8s了
怎么说呢,至少说 docker 没有了以前的地位了,随着社区的发展,cri-o 作为社区的cri标准实现,crun 作为 oci 标准实现都已经在慢慢普及了。我们这边已经完全弃用 docker ,运行时已经换为 CRI-O + runc 了,应该过不了多久会将 runc 彻底切换到 crun。
我们的k3s集群 也没用docker了
我们的交付模式:单服务器跑各个模块容器(包含三个eureka)或者分三服务器跑(eureka分开),docker运行。是不是也可以很简单的无缝迁移到podman?
话说还有什么比较好的容器引擎?
我还在用命令启动服务😄
你说的容器引擎是指?容器运行时吗?感觉最好的是 crun,稳定可靠且性能最好
绝对无缝的,而且安全性上会更可靠
指的是替代docker的东西,就像这个podman。话说podman编译似乎挺麻烦
目前主流就这两个,另外 buildah 也可以,不过没必要, podman 能覆盖的
sysctl kernel.unprivileged_userns_clone
sysctl: cannot stat /proc/sys/kernel/unprivileged_userns_clone: 没有那个文件或目录
CentOS8相关衍生版好像没这个参数?
Anolis OS 4.19.91-23.4.an8.x86_64
Kylin 4.19.90-24.4.v2101.ky10.x86_64
另外请教一下,podman的容器如何做到自启动,网上查到的看起来是每个容器都要做一个systemd服务
podman + conmon + crun 这个组合似乎不太可靠,经常容器会跑飞。或者重启之后的各种异常,似乎无法作为docker平替,docker十分可靠。rootless的开机自启动我也没找到好的方法。
Linux xdg autostart 很方便的,我还用这种方式来管理我的虚拟机
最近发现个问题,睡醒第二天发现应用是打不开的。然后使用root帐号或avaapp帐号ssh连服务器就正常了
感觉你的问题都好奇怪,排查的思路:
上面的问题可能是loginctl enable-linger没配
但还是时有跑飞的情况。跑着跑着挂了,重启又提示容器未运行之类的(可能是 pid文件找不到的提示),进程实际是在的(conmon)。
还有其他提示:Issue #981 · containers/crun
还有个问题,slirp4netns对于rootless是必须的吗,之前没有安装也正常运行了,但看文档似乎又是必须的,还是说只是旧版本才需要。
不必须,可选项,默认是 https://github.com/rootless-containers/rootlesskit