注:

使用 Podman 编写文件

简介

Docker 编写是一个命令行工具,它使用格式特别的 YAML 文件作为输入来汇编,然后将单个或多个容器作为应用程序运行。这样开发人员可以开发、测试其应用程序,然后将单个 YAML 文件提供给用户,并且仅使用一个命令来启动和停止,从而可靠地运行。这种可移植性和可靠性使 Docker 编写不仅在用户和开发人员中非常受欢迎,而且越来越需要它。

目标

此实验展示了如何安装 podman-composedocker-compose 并将其与 Podman 一起使用,并验证它们是否使用简单的 docker-compose.yaml 文件。

先决条件

Oracle 支持免责声明

Oracle 不会为以下说明中提供的步骤序列提供技术支持,因为这些步骤指的是 Oracle 未提供的软件程序和操作系统。本教程提供了可选的说明,仅供参考。

有关 Oracle 支持的基于 Podman 的服务开发和使用的方法的更多信息,请参见 https://docs.oracle.com/en/operating-systems/oracle-linux/podman/。

设置实验室环境

注:使用免费实验室环境时,有关连接和其他使用说明,请参见Oracle Linux Lab Basics

  1. 打开终端并通过 ssh 连接到 ol-server 实例(如果尚未连接)。

    ssh oracle@<ip_address_of_instance>
    

确认 Podman 工作

Oracle Linux 中的 container-tools 软件包提供最新版本的 Podman、Buildah、Skopeo 和关联的依赖项。

  1. 检查 Podman 的版本。

    podman -v
    
  2. 确认 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-composedocker-compose

安装 Podman Docker 软件包

这使 Podman 能够本地使用 Docker 命令。

  1. 安装 podman-docker 软件包。

    sudo dnf install -y podman-docker
    

安装 Docker 编写

注:

如下文所述,以独立方式安装编写需要使用 docker-compose,而不是使用 docker composeDocker 实用程序时使用的标准语法。换句话说,将 docker compose up 语法替换为 docker-compose up

  1. 下载并安装 独立编写。

    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
    
    
  2. 将可执行权限应用于二进制文件。

    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 确认“编写独立工作”。

    docker-compose version
    

    输出示例:

    [oracle@ol-server ~]$ docker-compose version
    Docker Compose version v2.15.1
    
    

启动 Podman 套接字

要通过创建 Unix 套接字来使“Docker 编写”功能正常运行,需要执行以下步骤。

  1. 使用以下步骤配置 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.
    
  2. 使用 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 运行的编写规范

  1. 在安装 Podman 编写之前,请确认管道已更新到最新版本。

    sudo -H pip3 install --upgrade pip
    
  2. 安装 Podman 编写软件包。

    sudo pip3 install podman-compose 
    

    sudo 身份运行 pip3 install 时,可以忽略 WARNING 消息。

  3. 确认“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 文件允许提取和启动指定的应用程序。

  1. 为测试创建目录。

    mkdir -p Documents/examples/echo
    
  2. 转至该目录。

    cd Documents/examples/echo
    
  3. 创建 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
    
  4. 查看刚刚创建的 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 撰写程序正在工作

  1. 转到 docker-compose 文件所在的目录。

    重要提示:podman-compose 命令不会工作,除非您位于 docker-compose.yaml 文件所在的目录中。

    cd ~/Documents/examples/echo/
    
  2. 启动 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 文件中引用的任何容器时,才会拉取该容器。

  3. 测试 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
    
  4. 此外,通过查看日志来确认成功。

    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
    
    
  5. 使用 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 编写实用程序命令。但是,这些附加命令超出了此实验室的范围。

  6. 现在是停止 echoweb 服务的时候了。

    podman-compose down
    

确认 Docker 编写正在运行

  1. (可选)转到 docker-compose 文件所在的目录。

    重要提示:docker-compose 命令不会工作,除非您位于 docker-compose.yaml 文件所在的目录中。

    cd ~/Documents/examples/echo/
    
  2. 启动 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 容器仍在运行。按照前面的步骤停止它。

  3. 测试容器是否正在运行。

    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
    
  4. 与以前一样,使用 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"
    
    
  5. 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 编写实用程序命令。但是,这些附加命令超出了此实验室的范围。

  6. 停止 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 实用程序查询或停止该进程,反之亦然,如下例所示:

  1. 转到编写文件所在的目录。

    重要提示:podman-composedocker-compose 命令不会工作,除非您位于 docker-compose.yaml 文件所在的目录中。

    cd ~/Documents/examples/echo/
    
  2. 首先使用 Podman 编写。

    podman-compose up -d
    
  3. 尝试使用“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
    
  4. 然而,使用 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-composedocker-compose 将编写文件与 Podman 一起使用。

详细信息

请参阅其他相关资源:

更多学习资源

探索 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 频道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心