2022年5月6日更新:现在Podman支持Docker Compose v2.2及以上版本(详见Podman 4.1.0发布说明)
旧回答:
使用普通用户(非root)身份在Podman中运行docker-compose
要求:Podman版本>=3.2.1(于2021年6月发布)
Install the executable 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
Alternatively you could also run docker-compose in a container image (see below).
Run
systemctl --user start podman.socket
Set the environment variable DOCKER_HOST
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
Run
~/docker-compose up -d
以root身份使用Podman运行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
$
一种备选解决方案是使用sysctl
调整net.ipv4.ip_unprivileged_port_start(详见Rootless Podman的缺点)
如果缺少Systemd
大多数Linux发行版使用Systemd,您可以通过“启动”Podman套接字来启动提供REST API的Podman服务。
systemctl --user start podman.socket
或者
systemctl start podman.socket
但是如果缺少Systemd,您也可以直接启动Podman服务
podman system service --time 0 unix:/some/path/podman.sock
Systemd提供了额外的好处,即使用Systemd socket激活按需启动Podman服务,并在一段时间不活动后停止。
注意:Swarm功能缺失
与Docker的区别是,在使用docker-compose与Podman时,与Swarm相关的功能不受支持。
参考资料: