先日構築しました、USB HDD起動のRaspberry Pi 4 Ubuntu 20.04.1 LTSサーバ。
その後、Podmanをインストールしました。PodmanはDockerのようなコンテナ管理システムで、Docker Hubのコンテナ・イメージを実行できるようです。
以前、docker-compose.yamlファイルを作成、Dcker Hubからコンテナイメージをダウンロードして、wordpressを起動しました。データがずっと保存されるように、volumesを使用して、ボリュームの永続化も行いました。
今回も同じ様に、ボリュームを永続化しつつ、PodmanでWordPressを起動したいと思いますが。Podman composeは何か違う感じがしますので、基本的に使用しません。composeはおそらくDockerの流儀かと思います。
今回はPodamanの流儀に従い、Kubernetesのyamlファイルを作成して起動してみます。構築手順を記録しておこうと思います。
目次
使用するDockerコンテナイメージ
コンテナイメージは、Docker Hubの公式イメージを使用させて頂こうと思います。
通常のDockerの場合ですが。こちらの情報からdocker-compose.yamlファイルを作成し、起動する流れになります。
一方、Podmanの場合はどうなるのでしょうか?同じ流れで良いのでしょうか?
Kubernetes用のyamlファイル作成
ポッドの中でコンテナを起動
一方、Podmanの場合は順序が逆。ポッド(Pods)の中で必要なコンテナを起動してから、yamlファイルを生成する感じでしょうか。そのあたりの情報は、こちらを参考にさせて頂きました。
確かにpodman-composeを使用すれば、docker-compose.yamlファイルを流用できるようですが。そもそもyamlファイルに記述された内容は、dockerの内容になります。つまり機能的にdocker-composeに縛られる感じです。(後で嵌りそう
新しいPodmanを使うのなら、新しいKubernetes(クバネティス)の流儀に従ったほうが、細かい制御や機能の拡張が容易な感じがします。(後で嵌らずに済む感じ?
このため、私はなるべくcomposeは使用せず、新しい流儀に従おうかなと思っています。
では、実際にポッドをpodを作成して、mariadbデータベースコンテナと、wordpressコンテナを実行しようと思います。
Raspberry Pi、それも64ビットでちゃんと動くのでしょうか?
sudo podman pod create --name my-pod -p 8080:80
# pod確認
sudo podman pod ls
# mariadbコンテナ実行
sudo podman run \
-d --restart=always --pod=my-pod \
-e MYSQL_ROOT_PASSWORD="myrootpass" \
-e MYSQL_DATABASE="wp" \
-e MYSQL_USER="wordpress" \
-e MYSQL_PASSWORD="w0rdpr3ss" \
--name=wptest-db mariadb
# wordpressコンテナ実行
sudo podman run \
-d --restart=always --pod=my-pod \
-e WORDPRESS_DB_NAME="wp" \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD="w0rdpr3ss" \
-e WORDPRESS_DB_HOST="127.0.0.1" \
--name wptest-web wordpress
# podとコンテナ確認
sudo podman pod ls
sudo podman ps
my-podという名前のポッドの中で、コンテナが3つ動いています。
mariadbとwordpress(web)でコンテナは2つ実行しましたが。3つ目はローカルホストに紐づくポッドマジック(ポッドの魔法)のようです。ふむふむ。
無事起動している感じですので、Webブラウザでポッドにアクセスしてみます。
http://<Raspberry PiのIPアドレス>:8080
・・・
Raspberry Piで64ビットなUbuntu 20.04.1 LTSですが。
PodmanでDockerイメージが何の問題もなく動作していますね。
素晴らしい!
このままWordPressの初期設定を進める事も可能ですが、ボリュームを永続化しないとコンテナを止めると初期状態に戻ってしまいますので、後で永続化してから行おうと思います。
Kubernetes用Yamlファイル出力
sudo podman generate kube my-pod >> my-pod.yaml
「Moving from docker-compose to Podman pods」の手順に従い、yamlファイルを生成してみました。Dockerの場合のdocker-compose.yamlのように、こちらがPodmanでコンテナを連携させるために必要な設定ファイル(pod.yaml)になるようです。
WordPress用Pod Yamlファイル
podから出力したyamlファイルから、次回Podを起動する際に使用するyamlファイルを作成します。
ポイントは2点。不要な情報が入っているため、それらを削除すること。またDockerでWordPressを起動した場合と同様に、ストレージをマウントして永続化したいと思います。
mkdir wordpress
cd wordpress
vi wordpress-pod.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-1.9.3
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-09-19T23:15:42Z"
labels:
app: wordpress-pod
name: wordpress-pod
spec:
containers:
- name: wp-web
env:
- name: WORDPRESS_DB_NAME
value: wp
- name: WORDPRESS_DB_HOST
value: 127.0.0.1
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: w0rdpr3ss
image: docker.io/library/wordpress:latest
ports:
- containerPort: 80
hostPort: 8080
protocol: TCP
resources: {}
securityContext:
allowPrivilegeEscalation: true
capabilities: {}
privileged: false
readOnlyRootFilesystem: false
seLinuxOptions: {}
workingDir: /var/www/html
volumeMounts:
- mountPath: /var/www/html
name: wp-volume
- name: wp-db
env:
- name: MYSQL_ROOT_PASSWORD
value: myrootpass
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: w0rdpr3ss
- name: MYSQL_DATABASE
value: wp
image: docker.io/library/mariadb:latest
resources: {}
securityContext:
allowPrivilegeEscalation: true
capabilities: {}
privileged: false
readOnlyRootFilesystem: false
seLinuxOptions: {}
workingDir: /
volumeMounts:
- mountPath: /var/lib/mysql
name: db-volume
volumes:
- name: wp-volume
hostPath:
path: /home/ubuntu/wordpress/html
type: Directory
- name: db-volume
hostPath:
path: /home/ubuntu/wordpress/mysql
type: Directory
status: {}
YAMLの内容は、基本的に「Moving from docker-compose to Podman pods」のYAMLの内容を使用させて頂いております。
パスワードやDB名等の設定値は必要に応じて変更しておいたほうが良いかと思います。
独自の工夫として、永続化のため、volumes:セクションを追加しました。このため、Podを実行する前にhtmlとmysqlディレクトリを作成しておく必要があります。
YamlファイルでPod実行
永続化に使うディレクトリを作成後、PodmanでPodを実行(Kubenretesを再生(play))したいと思います。
# 実行中のPodを停止
sudo podman pod stop my-pod
sudo podman pod rm my-pod
# yamlファイルからpodを実行
mkdir html mysql
sudo podman play kube ./wordpress-pod.yaml
エラーも特に無く、問題なく実行された感じです。
# コピペ用
sudo podman pod ls
sudo podman ps
sudo podman pod stop wordpress-pod
sudo podman pod rm wordpress-pod
先程作成したディレクトリがコンテナからマウントされ、ファイルが生成されているようです。
これでPodを停止・削除しても、WordPressのデータは保存されると思います。肝心のWordPressの動作も特に問題無いようです。
Raspberry PiをHDD起動したため、microSDカードが突然壊れる心配もありませんし、ストレージの容量も問題ありません。
このまま構築を進めて、使用できるかと思います。
以上、Aarch64版のRaspberry Pi 4 Ubuntu 20.04.1 LTSで、WordPressを動かしてみました。
Docker Hubのイメージを使わせて頂きましたが、デーモンが必要なDockerではなく、より軽量なPodmanで実行することができました。
composeで動かす事もできるのかもしれませんが。なるべく新しい流儀を覚えながら進めたいなと思いますので、使用しませんでした。新しいKubernetesのYAMLファイルで、Podを再生(play)することができました。
そういえば、dockerのコンテナはプロセス(メモリー空間)の扱いでしたが。
Podmanでもコンテナはpsですが、Podはファイル扱い(ls)で、runで実行。そしてKubernetesは、playで再生。
このあたりのPodman関係をぼちぼち勉強しつつ。
Raspberry Pi 4を起動したときに、Podを自動的にPlayするにはどうすればよいのかな?
WordPressの他に、便利なサービスが動かせるかな?
といった疑問を勉強しつつ、記事を追加させて頂こうと思います。
ああそうだ、Podをいっぱい動かそうとすると、Raspberry Pi 4 4Gでメモリー足りるかなぁ???