有“ Podman Compose”吗?

时间:2019-03-14 03:11:55

标签: docker docker-compose containers

我最近发现有关Podman(https://podman.io)的信息。有一种使用Linux fork进程而不是Daemon的方法,而不必使用root运行,引起了我的注意。

但是我非常习惯使用docker-compose来协调机器上运行的容器(在生产中,我们使用kubernetes)。我真的很喜欢。

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

  

别名docker = podman

它将起作用吗?你能建议其他工具吗?如果可能的话,我真的打算保留我的docker-compose.yml文件。

2 个答案:

答案 0 :(得分:7)

注意:Podman 错误阻止在附加模式下将 docker-compose up 与最新的 Podman 版本 (3.2.1) 一起使用。 下一个 Podman 版本将包含一个 bug fix

暂时避免使用附加模式,而是使用分离模式,即使用 docker-compoe up -d

以普通用户(无根用户)使用 Podman 运行 docker-compose

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

  1. 安装可执行文件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(见下文)。

  2. 运行

    systemctl --user start podman.socket
    
  3. 设置环境变量DOCKER_HOST

    export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
    
  4. 运行

    ~/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 -line 选项

--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 Official Images (a catalogue) 所以一个很好的猜测是在容器图像名称前面加上 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(参见 Shortcomings of 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 相关的功能。

参考文献:

答案 1 :(得分:6)

是的,现在可以执行,检查podman-compose,这是一种方法,另一种方法是使用Kompose将docker-compose yaml文件转换为kubernetes部署。 Jérôme Petazzoni @jpetazzo: from docker-compose to kubernetes deployment

上有一篇博客文章