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`ディレクトリを永続化しているので、Compute仮想マシンの起動・停止を行ってもコンテンツの初期化は発生しないようになっていますが、MySQLへの接続情報がYAMLファイルにベタ打ちされているので注意が必要です。（開発・検証環境用途の想定です）

```Bash: 
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/019398da-1d00-3d31-81e5-6e84670cf341.png)




# podmanを利用することになった経緯
### 1. Oracle Linux 8にて
MySQL Databaseの検証用にWordPressのコンテナ環境をdocker-composeでサクッと導入しようとして焦りました。

```Bash:
$ 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って何だ？？

### 2. 各社のドキュメントなどを調べてみた

IBM (Red Hat) の[ドキュメント](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index)より引用
> Red Hat は、OpenShift から Docker エンジンを取り除いただけではありません。Red Hat Enterprise Linux 8 からも docker コマンドと Docker コンテナーエンジンを完全に取り除きました。RHEL 8 には Docker が含まれず、Red Hat のサポート対象外になります (ただし、他のソースから引き続き取得は可能です)

なんと・・・ORACLEの[リリースノート](https://docs.oracle.com/cd/F22978_01/8/relnotes8.0/ol8-features-changes.html#ol8-features-container)はというと、
> Oracle Linux 8リリースには、podman、buildahおよびskopeoコンテナ・ツールが用意されています。 これらのツールは、Open Container Initiative (OCI)と互換性があり、Dockerおよびその他の互換性のあるコンテナ・エンジンにより生成および管理される同じLinuxコンテナの管理に使用できます。 これらのツールは軽量であり、主に機能のサブセットに重点を置いているため、デーモン・プロセスの操作のオーバーヘッドを引いて実行できます。

podman、buildahおよびskopeoコンテナ・ツールこれを代わりに使えと前向きに諭してくれています。Docker HubからDockerイメージをpullして使いたかったので、dockerコマンドの代替となるpodmanを使ってみようと思いました。しかしながら、docker-composeに変わるツールが見当たりません。podmanでは、`podman play kube`コマンドでKubernetesのYAMLファイルから複数コンテナを起動できるらしいのですが、手元にあるのはdocker-compose形式のYAMLファイル。ネット上の情報を調べてみるとpodman-composeというOSSのツールでdocker-compose形式のYAMLファイルからpodmanを実行できるようです。

### 3. podman, podman-composeを使ってみた
podman-composeを使ってみると問題なくdocker-compose.yamlからpodmanでコンテナを構築することができたのですが、開発中のバージョンであることが不安として残ります。そこで、podman-composeで稼働中のPodとコンテナの情報から、Kubernetes YAMLファイルを生成して、`podman play kube`コマンドで動かすことにしました。（自動生成されたKubernetes YAMLファイルを動かすために修正していくうちに意図せずKubernetes YAMLの書き方を学べました・・・;）

# 検証手順詳細
## OCI上の検証環境の構築
### OCI上のVCN構成
[前回の検証](https://qiita.com/orakurara/items/e8e158eebad1295a9448)で利用した「インターネット接続性を持つ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解決：(任意) 選択

今回の検証ではパブリック・サブネットのみ利用し、プライベート・サブネットは利用しません。

### セキュリティ・グループの作成
クライアントのWebブラウザからWordPressの検証環境にアクセスするために、インターネットからのInbound通信で8080ポートを許可するようにセキュリティ・グループ WPを作成します。
OCIダッシュボードメニューから、**コア・インフラストラクチャ**>**ネットワーキング**>**仮想クラウド・ネットワーク**にアクセスし、作成したVCN (本記事内ではMySQLTest) を選択、画面左下のリソースメニューより**ネットワーク・セキュリティ・グループ**を選択、画面中央の**ネットワーク・セキュリティ・グループの作成**ボタンをクリックし、下記の設定を有したセキュリティ・グループ WPを作成してください。

|ステートレス|ソース・タイプ|ソースCIDR|IPプロトコル|ソース・ポート範囲|宛先ポート範囲|
|---|---|---|---|---|---|
|いいえ|CIDR|0.0.0.0/0|TCP|All|8080|


このセキュリティ・グループをWordpressが稼働するWPサーバにのみ割り当てることで、Bastionサーバと同じパブリック・サブネットに配置しても8080ポートを利用したアクセスはセキュリティ・グループWPが割り当てられたサーバのみ許可されます。

### Wordpressが稼働するCompute VMインスタンスの作成

OCIダッシュボードメニューから、**コア・インフラストラクチャ**>**コンピュート**>**インスタンス**にアクセスします。**インスタンスの作成**ボタンを押してComputeインスタンスの作成ウィザードを開始します。ウィザード内の入力例を下記に示します。

---
* 名前　: 任意名前　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をインストールします。

```Bash: 
$ cat /etc/oracle-release 
  Oracle Linux Server release 8.2
$ sudo dnf install -y podman
$ sudo dnf module install -y container-tools:ol8
```
### nginxコンテナを利用したpodmanの基本操作
はじめに`firewall-cmd`を利用して検証用の8080ポート経由のアクセスを許可するように設定します。

```Bash: 
$ sudo firewall-cmd --add-port=8080/tcp --zone=public --permanent
success
$ sudo firewall-cmd --reload
success
```
podmanを利用してnginxコンテナをpullした後、ホストの8080番ポートをコンテナ内の80番ポートにポートフォワーディングの設定を行ってnginxコンテナを起動します

```Bash: 
$ 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`を利用してアクセス可能なポート番号を確認しています。

```Bash: 
$ 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にアクセスできることを確認しました。

```html: 
$ 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>
```

また、`CONTAINER ID`を利用して`podman stop`コマンドでコンテナの停止、`podman rm`コマンドでコンテナの停止が可能です。

```Bash:
$ podman stop 755c5a633cbf
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639

$ podman rm 755c5a633cbf
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639
```

## podmanでWordPressを動かすための事前準備
### 永続化ディレクトリの準備
MySQLコンテナが利用するディレクトリにホストOSのディレクトリをマウントすることで永続化ディレクトリとし、コンテナの起動停止に係わらずコンテンツを永続的に保持することができます。また、WordPressコンテナが利用するディレクトリを永続化することで追加したテーマやPluginを永続化できます。作業ディレクトリ配下にそれぞれのディレクトリを作成し、適切なパーミッションを設定します。

```Bash:
$ mkdir -p mysql/data
$ chmod 777 mysql/data
$ mkdir -p wordpress
$ chmod 777 wordpress
```

### SELinuxの設定
Web上の多くのコンテンツではSELinuxを`Permissive`に設定して・・・とありますが、今回は`Enforcing`のままで頑張りたいと思います。1つ目の`httpd_can_network_connect`はhttpdがネットワークへの接続を許可する設定、2つ目の`setsebool -P httpd_can_network_connect_db`はhttpdがデータベースへの接続を許可する設定になります。

```Bash:
$ 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リポジトリから最新の実行ファイルをダウンロード、実行権限を付与するだけで準備完了です。

```Bash:
$ 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が稼働するdbコンテナとWordpressが稼働するwordpressコンテナに関する設定が記述されています。

```YAML:docker-compose.yaml 
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とdbそれぞれの各コンテナが稼働したことを確認してください。

```Bash:
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/019398da-1d00-3d31-81e5-6e84670cf341.png)

ここでwordpressコンテナは`opc_wordpress_1`という名前で、dbコンテナは`opc_db_1`という名前を付与されて`opc`コンテナで稼働しています。現在稼働中のPod名は下記コマンドで確認することができます。

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

なお、下記コマンドでPodごとコンテナを削除することができますが、今回は稼働中のPodの情報からKubernetes YAMLを生成するので稼働したままにしておきます。

```Bash: 
$ podman pod rm opc --force
2397e9f3a325eb7d0af66762b355025c9ccaf48245fa3a73326c4944f0b03580
```

## Kubernetes YAMLを利用したpodmanによるWordpressの構築
下記のように`podman generate kube`を実行して`opc`Podで稼働するコンテナ群のKubernetes YAMLを生成することができます。

```Bash:
podman generate kube opc > kubernetes-converted.yaml
```
ただし、生成された直後の状態では環境変数などデフォルト値がそのまま含まれているので、かなり見辛くなっています。

```YAML: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`コマンド等でダウンロードしてそのまま利用することができるようになっています。

```YAML:podman_k8s_WPMySQL.yaml
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で提起したコンテナを構築・実行することができますが、このままではコンテナ間の通信を行うことができません。[^1] そこでホストのhostsファイルにコンテナ内のホスト名を名前解決できるように追記を行います。

[^1]: [Red Hat ドキュメント 第8章 コンテナーのコマンドライン参照](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/container-command-line-reference_building-running-and-managing-containers) podman が対応していない dockerコマンドのオプションには、network、node、plugin (podman はプラグインをサポートしません)、rename (rm および create を使用して podman でコンテナーの名前を変更します)、secret、service、stack、swarm (podman は Docker Swarm をサポートしません) が含まれます。container および imageオプションは、podman で直接使用されるサブコマンドを実行するのに使用します。

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

それではいよいよ`podman play kube`を実行してWordPressを構築します。

```Bash:
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/019398da-1d00-3d31-81e5-6e84670cf341.png)

適当なトップページを作成してPod削除、再度`podman play kube`を実行して再構築を行います。コンテンツが永続化していることを確認できれば成功です。

![20-11-25-16-40-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/831381/112d618f-67ee-238d-2eb4-e05630d561d7.png)

# まとめ
お疲れさまでした。今回の検証を通して、dockerならびにdocker-composeからの移行イメージが付いたと思います。podman-composeの正式リリースを待つ、開発中のまま使うという選択肢もあると思いますが、`podman play kube`まで一気に移行してしまうことで様々なパブリック・クラウドで提供されているマネージドKubernetesサービスを利用するという選択肢が出てくると思います。また、Kubernetes YAMLはちょっと・・・という方の最初の一歩に本記事が役に立ってくれると幸いです。


# 関連情報
[Oracle® Linux Podmanユーザー・ガイド](https://docs.oracle.com/cd/F22978_01/podman/index.html)

[Red Hat Enterprise Linux 8 での Linux コンテナーの構築、実行、および管理](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/index)

[podman](https://podman.io/)

[Moving from docker-compose to Podman pods](https://www.redhat.com/sysadmin/compose-podman-pods)

[Podman Compose](https://github.com/containers/podman-compose)