在OCI上,使用Oracle Linux 8 + podman来运行WordPress

    • Oracle MySQL Database Serviceの使い方メモ〜番外編その4

 

    • podmanを使ってみた忘備録

 

    Oracle Linux 8 + SELinux + podman (ストレージ永続化設定も行っています)

首先

在使用Oracle Cloud Infrastructure (OCI) Compute Service中提供的Oracle Linux 8上,尝试快速运行Docker容器时,由于无法获取到docker-compose甚至是标准的docker-engine,我感到困惑不解。以下是我尝试使用podman并记录下来的经验。

验证环境

    • Oracle Linux Server release 8.2

 

    • docker.io/library/wordpress:latest (WordPress 5.5.3, PHP 7.4.12)

 

    • docker.io/library/mysql:latest (MySQL 8.0.22)

 

    • podman 2.0.5

 

    podman-compose 0.1.7dev

【忙碌的人專用】使用Podman建構WordPress的指令

我已经准备了一个构建WordPress容器和MySQL容器的Kubernetes YAML文件,通过执行以下命令,您可以构建环境。WordPress的/var/www/html目录和MySQL的/var/lib/mysql目录已经被持久化,这意味着即使启动或停止计算虚拟机,内容的初始化也不会发生。但是请注意,MySQL的连接信息是硬编码在YAML文件中的,所以要小心。(仅适用于开发和验证环境)

$ sudo dnf install -y podman
$ sudo dnf module install -y container-tools:ol8
$ sudo firewall-cmd --add-port=8080/tcp --zone=public --permanent
$ sudo firewall-cmd --reload
$ mkdir -p mysql/data
$ chmod 777 mysql/data
$ mkdir -p wordpress
$ chmod 777 wordpress
$ sudo setsebool -P httpd_can_network_connect_db=1
$ sudo setsebool -P httpd_can_network_connect=1
$ sudo sed -i -e '$a 127.0.0.1 db\n127.0.0.1 wordpress' /etc/hosts
$ curl -o podman_k8s_WPMySQL.yaml https://raw.githubusercontent.com/orakurara/WPonOCI/main/podman_k8s_WPMySQL/podman_k8s_WPMySQL.yaml
$ podman play kube podman_k8s_WPMySQL.yaml

每个容器启动后,您可以通过以下URL访问到WordPress的初始设置页面。

http://仮想机的公共IP:8080/wp-admin/

20-11-24-22-27-44.png

决定使用Podman的原因。

在Oracle Linux 8上

我正在尝试使用docker-compose快速引入WordPress容器环境以用于MySQL数据库验证,但感到有些匆忙。

$ dnf repolist
repo id            repo name
ol8_UEKR6          Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64)
ol8_addons         Oracle Linux 8 Addons (x86_64)
ol8_appstream      Oracle Linux 8 Application Stream (x86_64)
ol8_baseos_latest  Oracle Linux 8 BaseOS Latest (x86_64)
ol8_ksplice        Ksplice for Oracle Linux 8 (x86_64)
ol8_oci            Oracle Linux 8 OCI Packages (x86_64)
ol8_oci_included   Oracle Software for OCI users on Oracle Linux 8 (x86_64)

$ dnf search *docker*
Last metadata expiration check: 0:00:12 ago on Tue Nov 24 12:16:47 2020.
============================== Name & Summary Matched: *docker* ===============================
podman-docker.noarch : Emulate Docker CLI using podman
pcp-pmda-docker.x86_64 : Performance Co-Pilot (PCP) metrics from the Docker daemon
================================== Summary Matched: *docker* ==================================
oci-umount.x86_64 : OCI umount hook for docker
oci-systemd-hook.x86_64 : OCI systemd hook for docker
skopeo.x86_64 : Inspect Docker images and repositories on registries

那没有吗?Podman-Docker是什么?

我查阅了各个公司的文件等。

从IBM(Red Hat)的文件中引用

Red Hat不仅仅在OpenShift中移除了Docker引擎,而且在Red Hat Enterprise Linux 8中彻底删除了docker命令和Docker容器引擎。RHEL 8不包含Docker,并且不再得到Red Hat的支持(尽管可以继续从其他来源获取)。

想不到…ORACLE的发布说明呢,

Oracle Linux 8发布的版本中包含了podman、buildah和skopeo容器工具。这些工具与Open Container Initiative (OCI)兼容,并可用于管理由Docker和其他兼容的容器引擎生成和管理的相同Linux容器。这些工具轻巧,并且主要侧重于功能的子集,因此可以减少守护进程操作的开销并运行。

Podman、Buildah和Skopeo容器工具都积极地建议我们使用它们作为替代品。由于我希望从Docker Hub中拉取Docker映像并使用它们,所以我决定尝试使用Podman作为替代docker命令的工具。然而,我找不到替代docker-compose的工具。据说在Podman中可以使用podman play kube命令从Kubernetes的YAML文件中启动多个容器,但我手头只有以docker-compose形式的YAML文件。在查找网络信息时,我发现了一个叫做podman-compose的开源工具,可以从docker-compose形式的YAML文件中执行Podman。

我试着使用podman和podman-compose。

我试用了podman-compose,并且顺利地可以根据docker-compose.yaml文件使用podman构建容器,但由于它是开发中的版本,我仍然感到不安。因此,我决定利用podman-compose从正在运行的Pod和容器信息中生成Kubernetes YAML文件,并使用podman play kube命令运行它。(在修改自动生成的Kubernetes YAML文件以运行时,无意中学习到了Kubernetes YAML的写法…;)

檢驗程序的詳細步驟

在OCI上建立验证环境

OCI中的VCN结构

我们将重复利用在先前验证中使用的“具有互联网连接性的VCN创建向导”创建的VCN。以下是向导中的输入示例。

    • 基本情報

VCN名 : 任意のVCN名 MySQLTest
コンパートメント : 任意のコンパートメント名  /dev

VCNとサブネットの構成

VCN CIDRブロック 10.0.0.0/16
パブリック・サブネットCIDRブロック 10.0.30.0/24
プライベート・サブネットCIDRブロック 10.0.31/0/24
DNS解決:(任意) 選択

在本次验证中,仅使用公共子网,不使用私有子网。

创建安全组 (CSP)

为了从客户端的Web浏览器访问WordPress的验证环境,需要在互联网的入站通信中允许8080端口,因此需要创建一个安全组WP。从OCI仪表板菜单中选择核心基础设施>网络>虚拟云网络,选择创建的VCN(在本文中为MySQLTest),从屏幕左下角的资源菜单中选择网络安全组,在屏幕中央点击创建网络安全组按钮,并创建一个具有以下设置的安全组WP。

ステートレスソース・タイプソースCIDRIPプロトコルソース・ポート範囲宛先ポート範囲いいえCIDR0.0.0.0/0TCPAll8080

通过将此安全组仅分配给运行WordPress的WP服务器,即使将Bastion服务器放置在相同的公共子网中,只有被分配安全组WP的服务器才被允许使用8080端口进行访问。

创建一台运行WordPress的Compute VM实例

从OCI仪表板菜单中,访问核心基础设施 > 计算 > 实例。点击创建实例按钮以开始创建计算实例的向导。以下是向导中的输入示例。


    • 名前 : 任意名前 WP

 

    • コンパートメントの選択 : 任意のコンパートメント名  /dev

配置とハードウェアの構成

可用性ドメインの選択 :デフォルト Fubk:AP-TOKYO-1-AD-1
フォルト・ドメインの選択 :デフォルト  FAULT-DOMAIN-1
イメージ:Oracle Linux 8
シェイプの選択:デフォルト  VM.Standard.E2.1

ネットワーキングの構成

仮想クラウド・ネットワーク: MySQLTest
サブネット: パブリック・サブネット-MySQLTest
ネットワーク・セキュリティ・グループを使用してトラフィックを制御: WP
パブリックIPv4アドレスの割当て: はい

SSHキーの追加:公開キー・ファイルの選択
ブート・ボリュームの構成 :デフォルト設定

Podman的安装和测试

安装Podman

请执行以下命令,安装podman以及相关的container-tools。

$ cat /etc/oracle-release 
  Oracle Linux Server release 8.2
$ sudo dnf install -y podman
$ sudo dnf module install -y container-tools:ol8

使用podman基本操作使用nginx容器。

首先,使用firewall-cmd工具设置允许通过8080端口进行访问的验证。

$ sudo firewall-cmd --add-port=8080/tcp --zone=public --permanent
success
$ sudo firewall-cmd --reload
success

使用Podman拉取nginx容器后,对主机的8080端口进行端口转发设置,将其转发至容器内的80端口,并启动nginx容器。

$ podman pull nginx
Trying to pull container-registry.oracle.com/nginx...
  unable to retrieve auth token: invalid username/password: unauthorized: authentication required
Trying to pull docker.io/library/nginx...
Getting image source signatures
Copying blob 852e50cd189d skipped: already exists  
Copying blob c5df295936d3 done  
Copying blob b3ddf1fa5595 done  
Copying blob a29b129f4109 done  
Copying blob 232bf38931fc done  
Copying config daee903b4e done  
Writing manifest to image destination
Storing signatures
daee903b4e436178418e41d8dc223b73632144847e5fe81d061296e667f16ef2

$ podman run -d -p 8080:80/tcp docker.io/library/nginx
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639

使用以下命令获取正在运行的容器列表。然后,使用获取到的CONTAINER ID来确认可以访问的端口号。

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                 NAMES
755c5a633cbf  docker.io/library/nginx:latest  nginx -g daemon o...  18 seconds ago  Up 18 seconds ago  0.0.0.0:8080->80/tcp  thirsty_chandrasekhar

$ podman port 755c5a633cbf                  
80/tcp -> 0.0.0.0:8080

我已经参考确认了端口号,使用curl命令访问并确认能够访问在容器中运行的nginx。

$ curl http://0.0.0.0:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

同时,您可以使用容器ID在podman stop命令中停止容器,并使用podman rm命令停止容器。

$ podman stop 755c5a633cbf
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639

$ podman rm 755c5a633cbf
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639

为了在Podman上运行WordPress,需要进行预先准备工作。

准备持久化目录。

通过将主机操作系统的目录挂载到MySQL容器使用的目录,可以将其作为持久化目录,从而无论容器的启停,都可以持久地保存内容。此外,通过持久化WordPress容器使用的目录,可以持久化添加的主题和插件。在工作目录下创建各自的目录,并设置适当的权限。

$ mkdir -p mysql/data
$ chmod 777 mysql/data
$ mkdir -p wordpress
$ chmod 777 wordpress

SELinux的设置

在网络上的许多内容中,提到要将SELinux配置为Permissive,但我想在这次中还是保持Enforcing模式。第一个httpd_can_network_connect是用来允许httpd连接网络的设置,第二个setsebool -P httpd_can_network_connect_db是允许httpd连接数据库的设置。

$ sudo setsebool -P httpd_can_network_connect=1
$ sudo setsebool -P httpd_can_network_connect_db=1

顺便提一下,关于容器内进程的权限,我们在docker-compose.yaml文件中设置privileged: true,或者在Kubernetes的YAML文件中设置allowPrivilegeEscalation: true和seLinuxOptions: type: spc_t来进行配置。

使用podman-compose构建WordPress

Podman-Compose的安装

创建一个存储目录来存放执行文件等内容,并从podman-compose的Github仓库中下载最新的执行文件,然后给予执行权限,这样就完成了准备工作。

$ mkdir -p ~/.local/bin
$ curl -o ~/.local/bin/podman-compose https://raw.githubusercontent.com/containers/podman-compose/devel/podman_compose.py
$ chmod +x ~/.local/bin/podman-compose

使用Podman-compose执行

请执行以下命令,下载事先准备好的docker-compose.yaml文件。请务必将其保存为docker-compose.yaml,并放置在工作目录的最顶层位置。

$ curl -o docker-compose.yaml https://raw.githubusercontent.com/orakurara/WPonOCI/main/podman_compose_WPMySQL/docker-compose.yaml

在已下载的YAML文件中,描述了关于运行数据库容器的MySQL和运行WordPress容器的WordPress的配置。

version: "3.7"
services:
  db:
    image: mysql:latest
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    volumes:
      - ./mysql/data:/var/lib/mysql
    privileged: true

  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
    volumes:
       - ./wordpress:/var/www/html
    privileged: true
    depends_on:
      - db

请在工作目录中执行 “podman-compose” 命令,以确认WordPress和数据库各个容器都已成功启动。

$ podman-compose up -d
using podman version: podman version 2.0.5
podman pod create --name=opc --share net -p 3306:3306 -p 8080:80
2397e9f3a325eb7d0af66762b355025c9ccaf48245fa3a73326c4944f0b03580
0
podman run --name=opc_db_1 -d --pod=opc --label io.podman.compose.config-hash=123 --label io.podman.compose.project=opc --label io.podman.compose.version=0.0.1 --label com.docker.compose.container-number=1 --label com.docker.compose.service=db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -v /home/opc/./mysql/data:/var/lib/mysql --add-host db:127.0.0.1 --add-host opc_db_1:127.0.0.1 --add-host wordpress:127.0.0.1 --add-host opc_wordpress_1:127.0.0.1 --privileged --restart always mysql:latest
2c4205293a0221300b2129d97a5b796b52c41c687b6a63eb3b1df9527032dfec
0
podman run --name=opc_wordpress_1 -d --pod=opc --label io.podman.compose.config-hash=123 --label io.podman.compose.project=opc --label io.podman.compose.version=0.0.1 --label com.docker.compose.container-number=1 --label com.docker.compose.service=wordpress -e WORDPRESS_DB_HOST=db:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress -v /home/opc/./wordpress:/var/www/html --add-host db:127.0.0.1 --add-host opc_db_1:127.0.0.1 --add-host wordpress:127.0.0.1 --add-host opc_wordpress_1:127.0.0.1 --privileged --restart always wordpress:latest
1e82a612ca25510ff2508149e85101ff94e4630a4121078709fea11f22d8712d
0

如果您访问下面的URL,您可以进入WordPress的初始设置界面。

http://虚拟机的公共IP:8080/wp-admin/

20-11-24-22-27-44.png

在这里,WordPress容器被命名为opc_wordpress_1,数据库容器被命名为opc_db_1,并在opc容器中运行。您可以使用下面的命令来确认当前运行的Pod名称。

$ podman pod ls
POD ID        NAME    STATUS   CREATED        # OF CONTAINERS  INFRA ID
2397e9f3a325  opc     Running  9 minutes ago  3                1d7be965fa1e

此外,您可以使用以下命令删除每个Pod的容器,但由于我们要根据正在运行的Pod信息生成Kubernetes YAML,在此次操作中我们将保持它继续运行。

$ podman pod rm opc --force
2397e9f3a325eb7d0af66762b355025c9ccaf48245fa3a73326c4944f0b03580

使用Kubernetes YAML,在podman上构建WordPress。

您可以通过执行以下命令”podman generate kube”在opcPod上生成一个容器群的Kubernetes YAML。

podman generate kube opc > kubernetes-converted.yaml

然而,在生成后的初始状态中,包含了环境变量等默认值,因此看起来相当混乱。

# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-2.0.5
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-11-25T05:38:55Z"
  labels:
    app: opc
  name: opc
spec:
  containers:
  - command:
    - mysqld
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_PASSWORD
      value: wordpress
    - name: container
      value: podman
    - name: MYSQL_VERSION
      value: 8.0.22-1debian10
    - name: GOSU_VERSION
      value: "1.12"
    - name: MYSQL_ROOT_PASSWORD
      value: password
    - name: MYSQL_MAJOR
      value: "8.0"
    - name: MYSQL_USER
      value: wordpress
    - name: HOSTNAME
    image: docker.io/library/mysql:latest
    name: opcdb1
    ports:
    - containerPort: 3306
      hostPort: 3306
      protocol: TCP
    - containerPort: 80
      hostPort: 8080
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities:
        add:
        - CAP_DAC_READ_SEARCH
        - CAP_LINUX_IMMUTABLE
        - CAP_NET_BROADCAST
        - CAP_NET_ADMIN
        - CAP_IPC_LOCK
        - CAP_IPC_OWNER
        - CAP_SYS_MODULE
        - CAP_SYS_RAWIO
        - CAP_SYS_PTRACE
        - CAP_SYS_PACCT
        - CAP_SYS_ADMIN
        - CAP_SYS_BOOT
        - CAP_SYS_NICE
        - CAP_SYS_RESOURCE
        - CAP_SYS_TIME
        - CAP_SYS_TTY_CONFIG
        - CAP_LEASE
        - CAP_AUDIT_CONTROL
        - CAP_MAC_OVERRIDE
        - CAP_MAC_ADMIN
        - CAP_SYSLOG
        - CAP_WAKE_ALARM
        - CAP_BLOCK_SUSPEND
        - CAP_AUDIT_READ
      privileged: true
      readOnlyRootFilesystem: false
      seLinuxOptions: {}
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: home-opc-mysql-data
    workingDir: /
  - command:
    - apache2-foreground
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: PHP_LDFLAGS
      value: -Wl,-O1 -pie
    - name: PHP_VERSION
      value: 7.4.12
    - name: PHP_SHA256
      value: e82d2bcead05255f6b7d2ff4e2561bc334204955820cabc2457b5239fde96b76
    - name: PHP_ASC_URL
      value: https://www.php.net/distributions/php-7.4.12.tar.xz.asc
    - name: APACHE_ENVVARS
      value: /etc/apache2/envvars
    - name: WORDPRESS_DB_HOST
      value: db:3306
    - name: WORDPRESS_VERSION
      value: 5.5.3
    - name: APACHE_CONFDIR
      value: /etc/apache2
    - name: PHP_CFLAGS
      value: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    - name: PHPIZE_DEPS
      value: "autoconf \t\tdpkg-dev \t\tfile \t\tg++ \t\tgcc \t\tlibc-dev \t\tmake \t\tpkg-config \t\tre2c"
    - name: WORDPRESS_DB_PASSWORD
      value: wordpress
    - name: WORDPRESS_DB_NAME
      value: wordpress
    - name: WORDPRESS_DB_USER
      value: wordpress
    - name: PHP_EXTRA_CONFIGURE_ARGS
      value: --with-apxs2 --disable-cgi
    - name: PHP_URL
      value: https://www.php.net/distributions/php-7.4.12.tar.xz
    - name: PHP_INI_DIR
      value: /usr/local/etc/php
    - name: PHP_EXTRA_BUILD_DEPS
      value: apache2-dev
    - name: GPG_KEYS
      value: 42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312
    - name: container
      value: podman
    - name: PHP_CPPFLAGS
      value: -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    - name: WORDPRESS_SHA1
      value: 61015720c679a6cbf9ad51701f0f3fedb51b3273
    - name: HOSTNAME
    image: docker.io/library/wordpress:latest
    name: opcwordpress1
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities:
        add:
        - CAP_DAC_READ_SEARCH
        - CAP_LINUX_IMMUTABLE
        - CAP_NET_BROADCAST
        - CAP_NET_ADMIN
        - CAP_IPC_LOCK
        - CAP_IPC_OWNER
        - CAP_SYS_MODULE
        - CAP_SYS_RAWIO
        - CAP_SYS_PTRACE
        - CAP_SYS_PACCT
        - CAP_SYS_ADMIN
        - CAP_SYS_BOOT
        - CAP_SYS_NICE
        - CAP_SYS_RESOURCE
        - CAP_SYS_TIME
        - CAP_SYS_TTY_CONFIG
        - CAP_LEASE
        - CAP_AUDIT_CONTROL
        - CAP_MAC_OVERRIDE
        - CAP_MAC_ADMIN
        - CAP_SYSLOG
        - CAP_WAKE_ALARM
        - CAP_BLOCK_SUSPEND
        - CAP_AUDIT_READ
      privileged: true
      readOnlyRootFilesystem: false
      seLinuxOptions: {}
    volumeMounts:
    - mountPath: /var/www/html
      name: home-opc-wordpress
    workingDir: /var/www/html
  volumes:
  - hostPath:
      path: /home/opc/mysql/data
      type: Directory
    name: home-opc-mysql-data
  - hostPath:
      path: /home/opc/wordpress
      type: Directory
    name: home-opc-wordpress
status: {}
---
metadata:
  creationTimestamp: null
spec: {}
status:
  loadBalancer: {}

编辑并对生成的YAML文件进行了修改,使得它更容易被重复使用。我们将podman_k8s_WPMySQL.yaml文件放置在GitHub仓库中,因此您可以使用curl命令等直接下载并使用它。

apiVersion: v1
kind: Pod
metadata:
  name: opc_wp
  labels:
    app: opc_wp
spec:
  containers:
  - name: wordpress
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: WORDPRESS_DB_PASSWORD
      value: wordpress
    - name: APACHE_CONFDIR
      value: /etc/apache2
    - name: WORDPRESS_DB_USER
      value: wordpress
    - name: WORDPRESS_DB_NAME
      value: wordpress
    - name: APACHE_ENVVARS
      value: /etc/apache2/envvars
    - name: WORDPRESS_DB_HOST
      value: db:3306
    - name: PHP_INI_DIR
      value: /usr/local/etc/php
    - name: HOSTNAME
    image: docker.io/library/wordpress:latest
    name: opcwordpress1
    ports:
    - containerPort: 80
      hostPort: 8080
      protocol: TCP
    securityContext:
      allowPrivilegeEscalation: true
      readOnlyRootFilesystem: false
      seLinuxOptions: 
        type: spc_t
    volumeMounts:
    - mountPath: /var/www/html
      name: home-opc-wordpress
      workingDir: /var/www/html
  - name: mysqld
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: MYSQL_PASSWORD
      value: wordpress
    - name: MYSQL_ROOT_PASSWORD
      value: password
    - name: MYSQL_DATABASE
      value: wordpress
    - name: MYSQL_USER
      value: wordpress
    - name: HOSTNAME
    image: docker.io/library/mysql:latest
    name: opcdb1
    securityContext:
      allowPrivilegeEscalation: true
      readOnlyRootFilesystem: false
      seLinuxOptions: 
        type: spc_t
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: home-opc-mysql-data
      workingDir: /
  volumes:
  - name: home-opc-wordpress
    hostPath:
      path: /home/opc/wordpress
      type: Directory
  - name: home-opc-mysql-data
    hostPath:
        path: /home/opc/mysql/data
        type: Directory

如果执行 podman play kube ,则可以在 Kubernetes YAML 中构建和运行容器,但目前尚无法进行容器间通信。因此,需要在主机的 hosts 文件中添加记录,以便解析容器内的主机名。

$ sudo sed -i -e '$a 127.0.0.1 db\n127.0.0.1 wordpress' /etc/hosts

那么,现在可以开始执行 podman play kube 来搭建 WordPress 了。

$ curl -o podman_k8s_WPMySQL.yaml https://raw.githubusercontent.com/orakurara/WPonOCI/main/podman_k8s_WPMySQL/podman_k8s_WPMySQL.yaml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1863  100  1863    0     0   6824      0 --:--:-- --:--:-- --:--:--  6799

$ podman play kube podman_k8s_WPMySQL.yaml
Trying to pull docker.io/library/wordpress:latest...
Getting image source signatures
Copying blob 345b578c1a78 skipped: already exists  
Copying blob 852e50cd189d skipped: already exists  
Copying blob 0266fc315b01 skipped: already exists  
Copying blob 4c8a5fa787a1 skipped: already exists  
Copying blob 46fc127c1884 skipped: already exists  
Copying blob f768b7fadf16 skipped: already exists  
Copying blob 90aafe41e78d skipped: already exists  
Copying blob af01fae4e5fc skipped: already exists  
Copying blob 9e463236c8bc skipped: already exists  
Copying blob cd12b0a220f2 skipped: already exists  
Copying blob d9f76220cef4 skipped: already exists  
Copying blob c09cf9a96ea9 skipped: already exists  
Copying blob 6dda8bec068c skipped: already exists  
Copying blob fd36a10c28fe skipped: already exists  
Copying blob e11e483ab28e skipped: already exists  
Copying blob ab40cb22800e skipped: already exists  
Copying blob b08636db59dd skipped: already exists  
Copying blob d2c7678bc02b skipped: already exists  
Copying blob f903e014412a skipped: already exists  
Copying blob 114ff1eb7cb0 [--------------------------------------] 0.0b / 0.0b
Copying config cfb931188d done  
Writing manifest to image destination
Storing signatures
Trying to pull docker.io/library/mysql:latest...
Getting image source signatures
Copying blob 938c64119969 skipped: already exists  
Copying blob 852e50cd189d skipped: already exists  
Copying blob a43f41a44c48 skipped: already exists  
Copying blob 29969ddb0ffb skipped: already exists  
Copying blob 5cdd802543a3 skipped: already exists  
Copying blob b79b040de953 skipped: already exists  
Copying blob 7689ec51a0d9 skipped: already exists  
Copying blob a880ba7c411f skipped: already exists  
Copying blob 984f656ec6ca skipped: already exists  
Copying blob 9f497bce458a skipped: already exists  
Copying blob b9940f97694b skipped: already exists  
Copying blob 2f069358dc96 [--------------------------------------] 0.0b / 0.0b
Copying config dd7265748b done  
Writing manifest to image destination
Storing signatures
Pod:
e872e98923c6135f83e685804d77bb239ed9ea5c23d87557afbe25e016f1a0f4
Containers:
f507c83777327644e8cd3f32aa0e595bb53986673e7dc90bb2ad5dcf78792938
557ee2109cee2c4dc51d4a1b44c217f512b46eff3074a2c311199dee9c1a179d

只需访问以下URL,您就可以访问到WordPress的初始设置界面。

http://仮想机的公共IP:8080/wp-admin/

20-11-24-22-27-44.png

创建适当的首页,删除Pod,然后再次运行podman play kube来进行重建。如果能确认内容已经持久化,则表示成功。

20-11-25-16-40-21.png

总结

辛苦了。通过本次验证,我认为已经有了从Docker和Docker Compose迁移到Podman Compose的图像。虽然还可以选择等待Podman Compose的正式发布,继续在开发中使用,但是如果一下子全部转移到Podman Play Kube,就会有利用各种公共云提供的托管Kubernetes服务的选择。另外,对于觉得Kubernetes YAML有点复杂的人来说,希望本文对你迈出第一步有所帮助。

相关信息

Oracle® Linux Podman用户指南

使用Red Hat Enterprise Linux 8构建、运行和管理Linux容器。

Podman是一个用于管理和操作容器的开源工具。

从Docker-Compose过渡到Podman的Pods。

Podman Compose简介

红帽文档第8章提到,Podman不支持Docker命令的某些选项,如network、node、plugin(Podman不支持插件)、rename(使用rm和create命令来在Podman中更改容器名称)、secret、service、stack、swarm(Podman不支持Docker Swarm)。在Podman中,container和image选项用于直接执行子命令。
广告
将在 10 秒后关闭
bannerAds