注:
- 此教程在 Oracle 提供的免费实验室环境中提供。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于云环境的那些值。
使用 Podman 编写文件
简介
Docker 编写是一个命令行工具,它使用格式特别的 YAML 文件作为输入来汇编,然后将单个或多个容器作为应用程序运行。这样开发人员可以开发、测试其应用程序,然后将单个 YAML 文件提供给用户,并且仅使用一个命令来启动和停止,从而可靠地运行。这种可移植性和可靠性使 Docker 编写不仅在用户和开发人员中非常受欢迎,而且越来越需要它。
目标
此实验展示了如何安装 podman-compose 和 docker-compose 并将其与 Podman 一起使用,并验证它们是否使用简单的 docker-compose.yaml 文件。
先决条件
- 安装了 Oracle Linux 的客户机系统
- 已安装 Podman(‘ container-tools ’软件包)
- 访问 Internet
Oracle 支持免责声明
Oracle 不会为以下说明中提供的步骤序列提供技术支持,因为这些步骤指的是 Oracle 未提供的软件程序和操作系统。本教程提供了可选的说明,仅供参考。
有关 Oracle 支持的基于 Podman 的服务开发和使用的方法的更多信息,请参见 https://docs.oracle.com/en/operating-systems/oracle-linux/podman/。
设置实验室环境
注:使用免费实验室环境时,有关连接和其他使用说明,请参见Oracle Linux Lab Basics 。
-
打开终端并通过 ssh 连接到 ol-server 实例(如果尚未连接)。
ssh oracle@<ip_address_of_instance>
确认 Podman 工作
Oracle Linux 中的 container-tools 软件包提供最新版本的 Podman、Buildah、Skopeo 和关联的依赖项。
-
检查 Podman 的版本。
podman -v -
确认 Podman CLI 正常工作。
podman run quay.io/podman/hello输出示例:
[oracle@ol-server ~]$ podman run quay.io/podman/hello Trying to pull quay.io/podman/hello:latest... Getting image source signatures Copying blob f82b04e85914 done Copying config dbd85e09a1 done Writing manifest to image destination Storing signatures !... Hello Podman World ...! .--"--. / - - \ / (O) (O) \ ~~~| -=(,Y,)=- | .---. /` \ |~~ ~/ o o \~~~~.----. ~~ | =(X)= |~ / (O (O) \ ~~~~~~~ ~| =(Y_)=- | ~~~~ ~~~| U |~~ Project: https://github.com/containers/podman Website: https://podman.io Documents: https://docs.podman.io Twitter: @Podman_io
设置 Podman 以使用编写文件
在 Podman v3.0.0 中引入了有限的支持后,Podman 在 Podman v3.2.0 中引入了对 Docker 编写功能的支持,从而引入了从 Podman 中使用 Docker 编写 的功能。最近, Podman v4.1.0 扩展了 Docker 编写功能的支持,现在支持使用 Docker 编写 v2.2 及更高版本。
以下步骤介绍了如何安装和配置 podman-compose 和 docker-compose。
安装 Podman Docker 软件包
这使 Podman 能够本地使用 Docker 命令。
-
安装
podman-docker软件包。sudo dnf install -y podman-docker
安装 Docker 编写
注:
如下文所述,以独立方式安装编写需要使用
docker-compose,而不是使用docker compose的 Docker 实用程序时使用的标准语法。换句话说,将docker compose up语法替换为docker-compose up。
-
下载并安装 独立编写。
sudo curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose输出示例:
[oracle@ol-server ~]$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 42.8M 100 42.8M 0 0 158M 0 --:--:-- --:--:-- --:--:-- 158M -
将可执行权限应用于二进制文件。
sudo chmod +x /usr/local/bin/docker-compose -
确认“编写独立工作”。
docker-compose version输出示例:
[oracle@ol-server ~]$ docker-compose version Docker Compose version v2.15.1
启动 Podman 套接字
要通过创建 Unix 套接字来使“Docker 编写”功能正常运行,需要执行以下步骤。
-
使用以下步骤配置 Podman 套接字。
sudo systemctl enable --now podman.socket sudo systemctl status podman.socket输出示例:
[oracle@ol-server ~]$ sudo systemctl enable --now podman.socket Created symlink /etc/systemd/system/sockets.target.wants/podman.socket -> /usr/lib/systemd/system/podman.socket. [oracle@ol-server ~]$ sudo systemctl status podman.socket * podman.socket - Podman API Socket Loaded: loaded (/usr/lib/systemd/system/podman.socket; enabled; vendor preset) Active: active (listening) since Thu 2023-01-19 20:58:20 GMT; 16s ago Docs: man:podman-system-service(1) Listen: /run/podman/podman.sock (Stream) CGroup: /system.slice/podman.socket Jan 19 20:58:20 ol-server systemd[1]: Listening on Podman API Socket. -
使用 curl 验证套接字是否按预期工作。
sudo curl -w "\n" -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
输出示例:
[oracle@ol-server ~]$ sudo curl -w "\n" -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping OK [oracle@ol-server ~]$
如果此命令的输出返回 OK,则“编写”功能已成功配置为使用 docker-compose.yaml 文件。
安装 Podman 编写
Podman 编写是一个 Python 3 库,可实现使用 Podman 运行的编写规范。
-
在安装 Podman 编写之前,请确认管道已更新到最新版本。
sudo -H pip3 install --upgrade pip -
安装 Podman 编写软件包。
sudo pip3 install podman-compose以
sudo身份运行pip3 install时,可以忽略 WARNING 消息。 -
确认“Podman 编写”可以正常工作。
podman-compose version输出示例:
[oracle@ol-server ~]$ podman-compose version ['podman', '--version', ''] using podman version: 4.2.0 podman-composer version 1.0.3 podman --version podman version 4.2.0 exit code: 0
创建 Docker 编写文件
此 docker-compose.yaml 文件允许提取和启动指定的应用程序。
-
为测试创建目录。
mkdir -p Documents/examples/echo -
转至该目录。
cd Documents/examples/echo -
创建 docker-compose.yaml 文件。
cat >> docker-compose.yaml << EOF --- version: '3' services: web: image: k8s.gcr.io/echoserver:1.4 ports: - "${HOST_PORT:-8080}:8080" EOF -
查看刚刚创建的 docker-compose.yaml。
cat docker-compose.yaml输出示例:
[oracle@ol-server echo]$ cat docker-compose.yaml --- version: '3' services: web: image: k8s.gcr.io/echoserver:1.4 ports: - "8080:8080"
确认 Podman 撰写程序正在工作
-
转到 docker-compose 文件所在的目录。
重要提示:
podman-compose命令不会工作,除非您位于docker-compose.yaml文件所在的目录中。cd ~/Documents/examples/echo/ -
启动
echoserver应用程序。podman-compose up -d输出示例:
[oracle@ol-server echo]$ podman-compose up -d ['podman', '--version', ''] using podman version: 4.2.0 ** excluding: set() ['podman', 'network', 'exists', 'echo_default'] ['podman', 'network', 'create', '--label', 'io.podman.compose.project=echo', '--label', 'com.docker.compose.project=echo', 'echo_default'] ['podman', 'network', 'exists', 'echo_default'] podman create --name=echo_web_1 --label io.podman.compose.config-hash=123 --label io.podman.compose.project=echo --label io.podman.compose.version=0.0.1 --label com.docker.compose.project=echo --label com.docker.compose.project.working_dir=/home/oracle/examples/echo --label com.docker.compose.project.config_files=docker-compose.yaml --label com.docker.compose.container-number=1 --label com.docker.compose.service=web --net echo_default --network-alias web -p 8080:8080 k8s.gcr.io/echoserver:1.4 Trying to pull k8s.gcr.io/echoserver:1.4... Getting image source signatures Copying blob d3c51dabc842 done Copying blob a3ed95caeb02 done Copying blob 6d9e6e7d968b done Copying blob 412c0feed608 done Copying blob cd23f57692f8 done Copying blob dcd34d50d5ee done Copying blob a3ed95caeb02 skipped: already exists Copying blob a3ed95caeb02 skipped: already exists Copying blob a3ed95caeb02 skipped: already exists Copying blob b4241160ce0e done Copying blob 7abee76f69c0 done Writing manifest to image destination Storing signatures 1b54b75ca13786d33df6708da1d83ecce14b055e78b03007c3c4e1f441e7139c exit code: 0注:与 Podman 一样,仅当系统中尚未存在
docker-compose.yaml文件中引用的任何容器时,才会拉取该容器。 -
测试
echoserver应用程序是否已启动且正在运行。curl -X POST -d "foobar" http://localhost:8080/; echo输出示例:
[oracle@ol-server echo]$ curl -X POST -d "foobar" http://localhost:8080/; echo CLIENT VALUES: client_address=10.89.0.2 command=POST real path=/ query=nil request_version=1.1 request_uri=http://localhost:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* content-length=6 content-type=application/x-www-form-urlencoded host=localhost:8080 user-agent=curl/7.61.1 BODY: foobar -
此外,通过查看日志来确认成功。
podman-compose logs输出示例:
[oracle@ol-server echo]$ podman-compose logs ['podman', '--version', ''] using podman version: 4.2.0 podman logs echo_web_1 10.89.0.2 - - [17/Jan/2023:12:46:47 +0000] "POST / HTTP/1.1" 200 446 "-" "curl/7.61.1" exit code: 0 -
使用 Podman 编写实用程序查看正在运行的容器。
podman-compose ps输出示例:
[oracle@ol-server echo]$ podman-compose ps ['podman', '--version', ''] using podman version: 4.2.0 podman ps -a --filter label=io.podman.compose.project=echo CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f4053947c8c1 k8s.gcr.io/echoserver:1.4 nginx -g daemon o... 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->8080/tcp echo_web_1 exit code: 0注:请通过运行
podman-compose --help查看其他 Podman 编写实用程序命令。但是,这些附加命令超出了此实验室的范围。 -
现在是停止 echoweb 服务的时候了。
podman-compose down
确认 Docker 编写正在运行
-
(可选)转到 docker-compose 文件所在的目录。
重要提示:
docker-compose命令不会工作,除非您位于docker-compose.yaml文件所在的目录中。cd ~/Documents/examples/echo/ -
启动
echoserver应用程序。sudo /usr/local/bin/docker-compose up -d输出示例:
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose up -d [+] Running 0/0 [+] Running 0/1echo-web-1 Starting 0.0 [+] Running 0/1echo-web-1 Starting 0.1 [+] Running 0/1echo-web-1 Starting 0.2 [+] Running 0/1echo-web-1 Starting 0.3 [+] Running 0/1echo-web-1 Starting 0.4 [+] Running 0/1echo-web-1 Starting 0.5 [+] Running 0/1echo-web-1 Starting 0.6 [+] Running 0/1echo-web-1 Starting 0.7 [+] Running 1/1echo-web-1 Starting 0.8 ��� Container echo-web-1 Started 0.8s注:
如果在执行此命令时返回以下输出:
��� Container echo-web-1 Starting 0.9s Error response from daemon: cannot listen on the TCP port: listen tcp4 :8080: bind: address already in use不必担心,这仅意味着
podman-compose down命令未执行,先前使用podman-compose启动的 echoserver 容器仍在运行。按照前面的步骤停止它。 -
测试容器是否正在运行。
curl -X POST -d "foobar" http://localhost:8080/; echo输出示例:
[oracle@ol-server ~]$ curl -X POST -d "foobar" http://localhost:8080/; echo CLIENT VALUES: client_address=10.89.0.2 command=POST real path=/ query=nil request_version=1.1 request_uri=http://localhost:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* content-length=6 content-type=application/x-www-form-urlencoded host=localhost:8080 user-agent=curl/7.61.1 BODY: foobar -
与以前一样,使用 Docker 编写实用程序检查日志并确认此应用程序返回了成功请求。
sudo /usr/local/bin/docker-compose logs输出示例:
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose logs echo-web-1 | 10.89.0.1 - - [17/Jan/2023:14:48:56 +0000] "POST / HTTP/1.1" 200 446 "-" "curl/7.61.1" -
Docker 编写实用程序还提供了一种查看由编写文件启动的容器的方法。
sudo /usr/local/bin/docker-compose ps输出示例:
echo-web-1 k8s.gcr.io/echoserver:1.4 "nginx -g daemon off;" web 12 minutes ago Up 12 minutes 8080/tcp注:请通过运行
docker-compose --help查看其他 Docker 编写实用程序命令。但是,这些附加命令超出了此实验室的范围。 -
停止 echoweb 服务。
sudo /usr/local/bin/docker-compose down输出示例:
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose down [+] Running 0/0 [+] Running 0/1echo-web-1 Stopping 0.1 [+] Running 0/1echo-web-1 Stopping 0.2 [+] Running 0/1echo-web-1 Stopping 0.3 [+] Running 2/1echo-web-1 Removing 0.4 ��� Container echo-web-1 Removed 0.4s ��� Network echo_default Removed 0.0s
重要信息
如果 podman-compose 和 docker-compose 可执行文件都已安装在同一系统上,则必须注意无法互换调用它们。这意味着如果进程由 podman-docker 启动,则无法使用 docker-compose 实用程序查询或停止该进程,反之亦然,如下例所示:
-
转到编写文件所在的目录。
重要提示:
podman-compose或docker-compose命令不会工作,除非您位于docker-compose.yaml文件所在的目录中。cd ~/Documents/examples/echo/ -
首先使用 Podman 编写。
podman-compose up -d -
尝试使用“Docker 编写”列出正在运行的容器。
sudo /usr/local/bin/docker-compose ps输出示例
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS -
然而,使用 Podman Compose 确认容器正在运行。
podman-compose ps输出示例:
[oracle@ol-server echo]$ podman-compose ps ['podman', '--version', ''] using podman version: 4.2.0 podman ps -a --filter label=io.podman.compose.project=echo CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55335e797296 k8s.gcr.io/echoserver:1.4 nginx -g daemon o... 4 minutes ago Up 4 minutes ago 0.0.0.0:8080->8080/tcp echo_web_1 exit code: 0
汇总
这将确认如何使用 podman-compose 或 docker-compose 将编写文件与 Podman 一起使用。
详细信息
请参阅其他相关资源:
- Oracle 学习库
- Oracle Linux 文档:
更多学习资源
探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Using Compose Files with Podman
F76747-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.