以普通用户身份使用 Podman 运行 docker-compose(无根用户)
要求:Podman 版本 >= 3.2.1(2021 年 6 月发布)
安装可执行的docker-compose
curl -sL -o ~/docker-compose https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)
chmod 755 ~/docker-compose
或者,您也可以在容器映像中运行docker-compose(见下文)。
跑
systemctl --user start podman.socket
设置环境变量DOCKER_HOST
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
跑
~/docker-compose up -d
以 Podman 为 root 运行 docker-compose
要求:Podman 版本 >= 3.0(2021 年 2 月发布)
按照相同的程序,但删除标志--user
systemctl start podman.socket
在容器镜像中运行 docker-compose
使用容器镜像docker.io/docker/compose运行
docker -compose
podman \
run \
--rm \
--detach \
--env DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock \
--security-opt label=disable \
--volume $XDG_RUNTIME_DIR/podman/podman.sock:$XDG_RUNTIME_DIR/podman/podman.sock \
--volume $(pwd):$(pwd) \
--workdir $(pwd) \
docker.io/docker/compose \
--verbose \
up -d
(标志--verbose
是可选的)
在单行上带有简短命令行选项的相同命令:
podman run --rm -d -e DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock --security-opt label=disable -v $XDG_RUNTIME_DIR/podman/podman.sock:$XDG_RUNTIME_DIR/podman/podman.sock -v $(pwd):$(pwd) -w $(pwd) docker.io/docker/compose --verbose up -d
关于 SELINUX:从安全的角度来看,最好使用 SELINUX 运行 Podman,但我没有让它在 Fedora 34 计算机上工作,所以我通过添加命令行选项禁用了 SELINUX
--security-opt label=disable
故障排除提示
测试 Docker REST API
只需检查一下 Docker REST API 是否正常工作:
$ curl -H "Content-Type: application/json" \
--unix-socket $XDG_RUNTIME_DIR/podman/podman.sock \
http://localhost/_ping
OK$
避免使用简短的容器镜像名称
如果您的任何docker-compose.yaml或Dockerfile文件包含一个简短的容器映像名称,例如
$ grep image: docker-compose.yaml
image: mysql:8.0.19
$
$ grep FROM Dockerfile
FROM python:3.9
$
编辑文件以使用整个容器映像名称
$ grep image: docker-compose.yaml
image: docker.io/library/mysql:8.0.19
$
$ grep FROM Dockerfile
FROM docker.io/library/python:3.9
$
大多数情况下,短名称已用于引用DockerHub 官方镜像
(一个目录),因此一个好的猜测是在容器镜像名称前面加上docker.io/library/
目前有许多不同的容器镜像注册表,不仅仅是 DockerHub (docker.io)。因此,编写整个容器映像名称是一个好习惯。Podman 可能会抱怨,这取决于 Podman 的配置方式。
无根用户无法绑定1024以下的端口
如果例如
$ grep -A1 ports: docker-compose.yml
ports:
- 80:80
$
编辑docker-compose.yaml使主机端口号 >= 1024,例如8080
$ grep -A1 ports: docker-compose.yml
ports:
- 8080:80
$
另一种解决方案是调整net.ipv4.ip_unprivileged_port_start(sysctl
请参阅Rootless Podman 的缺点)
如果缺少 Systemd
大多数 Linux 发行版使用 Systemd,您最好通过“启动”Podman 套接字来启动 Podman 服务(提供 REST API)
systemctl --user start podman.socket
或者
systemctl start podman.socket
但是如果缺少 Systemd,您也可以直接启动 Podman 服务
podman system service --time 0 unix:/some/path/podman.sock
Systemd 提供了额外的好处,即 Podman 服务通过 Systemd 套接字激活按需启动,并在一段时间不活动后停止。
警告:缺少 Swarm 功能
与 Docker 不同的是,在将 docker-compose 与 Podman 一起使用时,不支持与 Swarm 相关的功能。
参考: