如何在 Linux 上将 docker-compose 与 Podman 一起使用如何在 Linux 上将 docker-compose 与 Podman 一起使用如何在 Linux 上将 docker-compose 与 Podman 一起使用如何在 Linux 上将 docker-compose 与 Podman 一起使用
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上将 docker-compose 与 Podman 一起使用

Podman 是 Docker 的免费开源替代品,由 Red Hat 创建。尽管 Docker 可能更广泛,以至于它成为“容器”的同义词,但从技术角度来看,Podman 更胜一筹:它从一开始就被设计为无守护进程,它能够在没有任何守护进程的情况下运行不需要root权限,并且更好地集成在Linux环境中。可能阻止许多人从 Docker 迁移到 Podman 的原因之一是缺乏 docker-compose 的成熟 Podman 等效项。通过在 Podman 和 Docker 之间创建一个兼容层,现在实际上可以像使用 Podman 原生工具一样使用 docker-compose。

在本教程中,我们将了解如何在最常用的 Linux 发行版上安装 docker-compose,以及如何将其与 Podman 而不是 Docker 一起使用。

在本教程中您将学习:

  • 如何在最常用的 Linux 发行版上安装 podman、podman-docker 和 docker-compose
  • 如何配置 Podman 以与 docker-compose 一起使用
  • 如何将 docker-compose 与 Podman 一起使用

安装软件包

为了将 docker-compose 与 Podman 一起使用,我们需要做的第一件事是安装 podman-docker 软件包。该软件包在 Docker 和 Podman 之间提供了一个兼容层,模拟 Docker CLI,但在底层执行 Podman 命令。

要在 Fedora 和 Red Hat 系列的其他发行版上执行安装,我们可以运行:

$ sudo dnf install podman podman-docker

要在 Debian 和基于 Debian 的发行版上安装该软件包,我们可以运行:

$ sudo apt install podman podman-docker

安装 docker-compose

现在我们必须安装 docker-compose。目前存在两个版本的 docker-compose:第一个版本“v1”是用 Python 编写的原始版本,现已弃用,它仅接收安全修复程序。第二个“v2”是用 Go 编写的,正在积极开发中,并且在 Docker 官方存储库中打包为 Docker 插件。

安装 docker-compose v1

大多数 Linux 发行版都包含一个“docker-compose”包,它提供了该工具的 Python 版本。要在 Fedora 上安装它,我们运行:

$ sudo dnf install docker-compose

在 RHEL 和克隆上,docker-compose 软件包不能开箱即用,也不能从 EPEL 存储库安装(至少在撰写本文时)。在这些发行版上,我们必须使用 python 包管理器 pip 将 docker-compose v1 安装为 Python 包。

由于我们不想以 root 身份运行 pip,因此我们以标准的非特权用户身份将包安装在其自己的专用虚拟环境中,然后创建指向可执行文件的符号链接(或者我们可以使用像 pipx 这样的工具)。在下面的示例中,我假设 ~/.local/bin 目录存在,并且位于我们的 PATH 中:

$ python3 -m venv virtualenv
$ virtualenv/bin/pip install docker-compose
$ ln -s "${PWD}/virtualenv/bin/docker-compose" ~/.local/bin/docker-compose

要在 Debian 和基于 Debian 的发行版上安装 docker-compose v1,我们可以运行:

$ sudo apt install docker-compose

安装 docker-compose v2

正如我们已经说过的,官方支持和积极开发的 docker-compose 版本是 v2。一种通用的、跨发行版的安装方式是直接从项目 GitHub 存储库下载适用于我们系统架构的预编译二进制文件。在下面的示例中,我们下载最新版本的 Linux x86_64 版本(撰写本文时为 2.27):

$ curl -LO https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64

下载二进制文件后,将其设为可执行文件,然后将其移至 PATH 中的目录下。要仅为我们的用户安装它,我们可以将其移动到 ~/.local/bin,要在系统范围内安装它,我们可以将其移动到 /usr/local/bin :

$ chmod +x docker-compose-linux-x86_64 
$ sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

安装 docker-compose v2 的另一种方法是从官方 Docker 存储库。首先,我们按照官方指南将存储库添加到我们的发行版中,然后安装“docker-compose-plugin”包:

$ sudo dnf install docker-compose-plugin

运行上面的命令时,我们将 docker-compose 安装为 Docker 插件而不是独立的二进制文件:要这样使用它,只需在 PATH 中的目录下创建一个符号链接即可:

$ sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose

启用并启动 Podman 套接字

Podman 和 Docker 之间的主要区别之一是它们的设计。 Docker 使用客户端-服务器架构:Docker 守护进程在后台运行,通常具有 root 权限(尽管最新版本的 Docker 支持运行无根、用户级版本的守护进程),而 Podman 使用所谓的“fork-exec” ”架构(每个容器作为 Podman 子进程运行)。由于 docker-compose 旨在与 Docker 一起工作,因此它期望 docker 守护进程正在运行。因此,Podman 提供了“podman.socket”systemd 单元。为了将 docker-compose 与 Podman 一起使用,需要启动并启用它:

$ sudo systemctl enable --now podman.socket

如果我们想将 docker-compose 与无根 Podman 实例一起使用,我们需要启用并启动套接字的用户级实例:

$ systemctl --user enable --now podman.socket

在后一种情况下,我们还需要定义并导出 DOCKER_HOST 环境变量。传统的方法是将下面的行添加到 ~/.bash_profile 或 ~/.profile,具体取决于我们使用的 shell:

export DOCKER_HOST=unix:///run/user/1000/docker.sock

为了使更改立即在我们当前的 shell 实例中生效,而无需等待下次登录,我们可以直接获取文件:

$ source ~/.bash_profile

Systemd 套接字与服务

除了我们在上一步中激活的套接字单元 (/usr/lib/systemd/system/podman.socket) 之外,Podman 软件包还附带了一个 systemd“服务”单元 (/usr/ lib/systemd/system/podman.service);这个服务实际上完成了什么,为什么我们使用套接字单元而不是直接使用该服务?

要查看 Systemd 在启动 Podman 服务时执行的命令,只需查看该单元本身就足够了。在这种情况下,我们感兴趣的是“Service”部分中“ExecStart”选项的值:

ExecStart=/usr/bin/podman $LOGGING system service

我们可以看到,当服务启动时,Systemd会执行podman system service命令。该命令的作用是创建一个侦听服务来应答 Podman 的 API 调用。这样,虽然 Podman 本身不需要守护进程来工作,但 Podman 可以“模仿”Docker 界面。

为什么我们启用并启动socket单元,而不是直接启动服务?这样做,我们利用了 Systemd 的一个功能:套接字激活服务。套接字侦听连接并根据请求启动服务,以最有效的方式利用资源。

使用 docker-compose

一旦一切就绪,我们就可以使用 docker-compose,就像在后台运行 Docker 一样。下面是一个撰写文件的基本示例。它为 MariaDB 服务器生成一个容器,并为 phpMyAdmin 生成一个容器:

version: '3.7'
services:
  mariadb:
    image: docker.io/mariadb
    volumes:
      - db:/var/lib/mysql
    environment:
      TZ: "Europe/Rome"
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpassword
      MYSQL_DATABASE: testdb

  phpmyadmin:
    image: docker.io/phpmyadmin
    environment:
      PMA_HOST: mariadb
    ports:
      - "80:80"
    depends_on:
      - mariadb

volumes:
  db:

要为堆栈创建容器、卷和专用网络,我们运行:

$ sudo docker-compose up

结论

在本教程中,我们学习了如何设置 Podman 来使用 docker-compose。 Docker-compose 旨在与 Docker 配合使用,与 Podman 不同,它使用客户端-服务器架构。通过启用 Podman 套接字并安装 podman-docker 软件包,我们基本上创建了一个兼容性层,让我们可以透明地使用 docker-compose 与 Podman。

©2015-2025 艾丽卡 support@alaica.com