有没有"Podman Compose"?
There is any "Podman Compose"?
我最近发现了 Podman (https://podman.io)。有一种方法可以使用 Linux 分叉进程而不是守护进程,而不必 运行 使用 root 引起了我的注意。
但我非常习惯使用 docker-compose 在我的机器上编排容器 运行ning(在生产中我们使用 kubernetes)。我真的很喜欢它。
所以我正在尝试替换 docker-compose。我将尝试保留 docker-compose 并使用 podman 作为 docker 的别名,因为 Podman 使用与 docker:
相同的语法
alias docker=podman
有用吗?你能推荐任何其他工具吗?如果可能的话,我真的打算保留我的 docker-compose.yml 文件。
是的,现在可以了,检查podman-compose, this is one way of doing it, another way is to convert the docker-compose yaml file to a kubernetes deployment using Kompose. there is a blog post from Jérôme Petazzoni @jpetazzo: from docker-compose to kubernetes deployment
2022 年 5 月 6 日更新:Podman 现在支持 Docker Compose v2.2 及更高版本(请参阅Podman 4.1.0 release notes)
旧答案:
运行ning docker-以普通用户身份与 Podman 组合(无根)
要求: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
运行ning docker-以 root 身份与 Podman 组合
要求:Podman 版本 >= 3.0(2021 年 2 月发布)
遵循相同的步骤,但删除标志 --user
systemctl start podman.socket
运行宁docker-组成容器镜像
使用容器镜像docker.io/docker/compose到运行
docker-撰写
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:运行nng Podman 与 SELINUX 从安全的角度来看更可取,但我没有让它在 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 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
$
另一种解决方案是将 net.ipv4.ip_unprivileged_port_start 调整为 sysctl
(参见 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 with Podman 时不支持与 Swarm 相关的功能。
参考文献:
- 确保您的机器上安装了 Podman。
- 您可以使用以下命令在终端中安装 Podman Compose:
pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz
cd
进入您的 docker-compose 文件所在的目录
- 运行
podman-compose up
请参阅以下内容 link 以获得不错的介绍。
我最近发现了 Podman (https://podman.io)。有一种方法可以使用 Linux 分叉进程而不是守护进程,而不必 运行 使用 root 引起了我的注意。
但我非常习惯使用 docker-compose 在我的机器上编排容器 运行ning(在生产中我们使用 kubernetes)。我真的很喜欢它。
所以我正在尝试替换 docker-compose。我将尝试保留 docker-compose 并使用 podman 作为 docker 的别名,因为 Podman 使用与 docker:
相同的语法alias docker=podman
有用吗?你能推荐任何其他工具吗?如果可能的话,我真的打算保留我的 docker-compose.yml 文件。
是的,现在可以了,检查podman-compose, this is one way of doing it, another way is to convert the docker-compose yaml file to a kubernetes deployment using Kompose. there is a blog post from Jérôme Petazzoni @jpetazzo: from docker-compose to kubernetes deployment
2022 年 5 月 6 日更新:Podman 现在支持 Docker Compose v2.2 及更高版本(请参阅Podman 4.1.0 release notes)
旧答案:
运行ning docker-以普通用户身份与 Podman 组合(无根)
要求: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
运行ning docker-以 root 身份与 Podman 组合
要求:Podman 版本 >= 3.0(2021 年 2 月发布)
遵循相同的步骤,但删除标志 --user
systemctl start podman.socket
运行宁docker-组成容器镜像
使用容器镜像docker.io/docker/compose到运行 docker-撰写
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:运行nng Podman 与 SELINUX 从安全的角度来看更可取,但我没有让它在 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 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
$
另一种解决方案是将 net.ipv4.ip_unprivileged_port_start 调整为 sysctl
(参见 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 with Podman 时不支持与 Swarm 相关的功能。
参考文献:
- 确保您的机器上安装了 Podman。
- 您可以使用以下命令在终端中安装 Podman Compose:
pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz
cd
进入您的 docker-compose 文件所在的目录- 运行
podman-compose up
请参阅以下内容 link 以获得不错的介绍。