- 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ファイルにベタ打ちされているので注意が必要です。(開発・検証環境用途の想定です)
$ 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の初期セットアップ画面にアクセスできます。
podmanを利用することになった経緯
1. Oracle Linux 8にて
MySQL Databaseの検証用にWordPressのコンテナ環境をdocker-composeでサクッと導入しようとして焦りました。
$ 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) のドキュメントより引用
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イメージを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構成
前回の検証で利用した「インターネット接続性を持つ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をインストールします。
$ 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ポート経由のアクセスを許可するように設定します。
$ sudo firewall-cmd --add-port=8080/tcp --zone=public --permanent
success
$ sudo firewall-cmd --reload
success
podmanを利用してnginxコンテナをpullした後、ホストの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>
また、CONTAINER ID
を利用してpodman stop
コマンドでコンテナの停止、podman rm
コマンドでコンテナの停止が可能です。
$ podman stop 755c5a633cbf
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639
$ podman rm 755c5a633cbf
755c5a633cbf3cfb71aae71122622a423d00a2d5b35dd00aace38fab687f8639
podmanでWordPressを動かすための事前準備
永続化ディレクトリの準備
MySQLコンテナが利用するディレクトリにホストOSのディレクトリをマウントすることで永続化ディレクトリとし、コンテナの起動停止に係わらずコンテンツを永続的に保持することができます。また、WordPressコンテナが利用するディレクトリを永続化することで追加したテーマやPluginを永続化できます。作業ディレクトリ配下にそれぞれのディレクトリを作成し、適切なパーミッションを設定します。
$ 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がデータベースへの接続を許可する設定になります。
$ 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が稼働するdbコンテナと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とdbそれぞれの各コンテナが稼働したことを確認してください。
$ 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の初期セットアップ画面にアクセスできます。
ここでwordpressコンテナはopc_wordpress_1
という名前で、dbコンテナは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
を実行してopc
Podで稼働するコンテナ群の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で提起したコンテナを構築・実行することができますが、このままではコンテナ間の通信を行うことができません。1 そこでホストの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の初期セットアップ画面にアクセスできます。
適当なトップページを作成してPod削除、再度podman play kube
を実行して再構築を行います。コンテンツが永続化していることを確認できれば成功です。
まとめ
お疲れさまでした。今回の検証を通して、dockerならびにdocker-composeからの移行イメージが付いたと思います。podman-composeの正式リリースを待つ、開発中のまま使うという選択肢もあると思いますが、podman play kube
まで一気に移行してしまうことで様々なパブリック・クラウドで提供されているマネージドKubernetesサービスを利用するという選択肢が出てくると思います。また、Kubernetes YAMLはちょっと・・・という方の最初の一歩に本記事が役に立ってくれると幸いです。
関連情報
Red Hat Enterprise Linux 8 での Linux コンテナーの構築、実行、および管理
Moving from docker-compose to Podman pods
-
Red Hat ドキュメント 第8章 コンテナーのコマンドライン参照 podman が対応していない dockerコマンドのオプションには、network、node、plugin (podman はプラグインをサポートしません)、rename (rm および create を使用して podman でコンテナーの名前を変更します)、secret、service、stack、swarm (podman は Docker Swarm をサポートしません) が含まれます。container および imageオプションは、podman で直接使用されるサブコマンドを実行するのに使用します。 ↩