有没有"Podman Compose"?

27

我最近了解到 Podman (https://podman.io)。它使用 Linux fork 进程而不是守护进程,而且不需要以 root 用户身份运行,这引起了我的关注。

但我习惯于使用 docker-compose 对正在我的机器上运行的容器进行编排(在生产中我们使用 Kubernetes),我真的很喜欢它。

所以我正在尝试替换 docker-compose。 我将尝试保留 docker-compose,以便通过将 podman 作为 docker 的别名来使用,因为 Podman 使用与 docker 相同的语法:

alias docker=podman

这会起作用吗? 你能否推荐其他工具? 如果可能的话,我真的打算保留我的 docker-compose.yml 文件。


1
我期待未来 Podman 的发展会带来许多新的答案。 - Alec Istomin
我们可以在RHEL8中使用“dnf install podman-docker”来模拟Docker,然后按照这里 https://www.redhat.com/sysadmin/podman-docker-compose 的说明使用docker-compose。 - Kiran P
3个回答

27

2
谢谢@walid!这个还很新。但看起来它能解决问题。Kompose也很有帮助。采用Kubernetes作为“事实上”的标准可以帮助您更快地进入生产环境。我会尝试两者。最好的问候! - otaviofcs
你好,@otaviofcs,我已经添加了Jérôme Petazzoni的博客参考。希望这些足够让你开始了;-) - Walid
2
请注意,有许多docker-compose命令与podman-compose不兼容,这是不幸的: https://github.com/containers/podman-compose/issues - Régis B.
1
@RégisB。然而对于简单的情况,您可能只需使用podman,请查看有关从compose到podman的最新文章https://www.redhat.com/sysadmin/compose-podman-pods - Walid

11

2022年5月6日更新:现在Podman支持Docker Compose v2.2及以上版本(详见Podman 4.1.0发布说明

旧回答:

使用普通用户(非root)身份在Podman中运行docker-compose

要求:Podman版本>=3.2.1(于2021年6月发布)

  1. 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).

  2. Run

    systemctl --user start podman.socket
    
  3. Set the environment variable DOCKER_HOST

    export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
    
  4. 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.yamlDockerfile文件包含短的容器镜像名称,例如

$ 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相关的功能不受支持。

参考资料:


感谢您改进答案。何时可以更新生产版本? - otaviofcs
我认为要求以 root 模式运行 podman 以支持 docker-compose 是一个缺点。为什么 Redhat 没有继续投资于 podman-compose 呢? - Bruce Sun

0
  1. 确保您的计算机上已安装Podman。
  2. 您可以在终端中使用以下命令安装Podman Compose:
pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz
  1. 进入包含docker-compose文件的目录,使用cd
  2. 运行podman-compose up

参见以下link进行良好的介绍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接