Podmanで独自コンテナイメージとボリュームを使うpodの作成
Fedora CoreOS上でpodを動かすのが目標だけど、その前にまず手動でpodを作って動かしてみる。
Podmanのコマンドリファレンスを参照しながら作業を進める。
まずは独自コンテナイメージを作成する。
今回はサンプルとしてWordPressに環境変数を設定しただけのコンテナにする。
最初にDockerfileを作成。
$ cat <<EOF > Dockerfile FROM docker.io/library/wordpress:latest ENV WORDPRESS_DB_NAME='wp' WORDPRESS_DB_HOST='127.0.0.1' \ WORDPRESS_DB_USER='wordpress' WORDPRESS_DB_PASSWORD='wordpress-password' EOF
続いてpodmanでpod-wordpress:latest
というタグを付けてビルド。
$ sudo podman build -t pod-wordpress:latest . STEP 1: FROM docker.io/library/wordpress:latest Getting image source signatures Copying blob 69692152171a done Copying blob ac1fe7c6d966 done Copying blob 9b4ca5ae9dfa done Copying blob 5b26fc9ce030 done Copying blob 2040822db325 done Copying blob 3492f4769444 done Copying blob 1dec05775a74 done Copying blob 77107a42338e done Copying blob f58e4093c52a done Copying blob d32715f578d3 done Copying blob 7a73fb2558ce done Copying blob 75e2da936ffe done Copying blob 759622df3a7b done Copying blob 667b573fcff7 done Copying blob c2f98ef02756 done Copying blob 50e11300b0a6 done Copying blob de37513870b9 done Copying blob f25501789abc done Copying blob 0cf8e3442952 done Copying blob d45ce270a7e6 done Copying blob 534cdc5a6ea6 done Copying config c2dd1984ad done Writing manifest to image destination Storing signatures STEP 2: ENV WORDPRESS_DB_NAME='wp' WORDPRESS_DB_HOST='127.0.0.1' WORDPRESS_DB_USER='wordpress' WORDPRESS_DB_PASSWORD='wordpress-password' STEP 3: COMMIT pod-wordpress:latest --> ed133c15e36 ed133c15e364cb72b5a93626a43e38316237eb291c5f9f18bec647db111ad58e
次に、wp-pod
という名前のpodを手動で作成する。
$ sudo podman pod create -n wp-pod -p 80:80 29004378ddfbf605c11e8a916066336627d14e8d9fd82d2ac7c6d898d3790503 $ sudo podman pod ps POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 29004378ddfb wp-pod Created 16 seconds ago 8bc8772c5324 1
MariaDBの/var/lib/mysql
を永続化するためのボリュームを作成。
$ sudo podman volume create wp-mysql wp-mysql
MariaDBコンテナwp-pod-db
をwp-pod
内で実行。
$ sudo podman run -d --restart=always --pod=wp-pod -e MYSQL_ROOT_PASSWORD='mysql-root-password' -e MYSQL_DATABASE='wp' -e MYSQL_USER='wordpress' -e MYSQL_PASSWORD='wordpress-password' -v wp-mysql:/var/lib/mysql --name wp-pod-db docker.io/library/mariadb Trying to pull docker.io/library/mariadb:latest... Getting image source signatures Copying blob 345e3491a907 done Copying blob 5e9250ddb7d0 done Copying blob 57671312ef6f done Copying blob 2d512e2ff778 done Copying blob b846f4f4774a done Copying blob 57c1a7dc2af9 done Copying blob 55edbf0f673e done Copying blob 82d8723e99d8 done Copying blob 66409f940bd2 done Copying blob c34793730ad6 done Copying blob 8f1925a0d734 done Copying blob 72904fb5fd0b done Copying config eff6290896 done Writing manifest to image destination Storing signatures 824fdae25e81491d0b04f0d30cde7131cd986d47e522e6078f0c84c65ac505ac
続いて、先ほどビルドしたコンテナイメージpod-wordpress:latest
をwp-pod-web
コンテナとしてwp-pod
内で実行。
$ sudo podman run -d --restart=always --pod=wp-pod --name wp-pod-web localhost/pod-wordpress:latest 31f5d2b2a9c16d6a945242c363c5209ddea7c8563c2f720265f0a7bc4c95c6a2
wp-pod
でWordPressが稼働したはず。
podとコンテナの状態を確認。
$ sudo podman pod ps POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 29004378ddfb wp-pod Running 4 minutes ago 8bc8772c5324 3 $ sudo podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8bc8772c5324 k8s.gcr.io/pause:3.5 4 minutes ago Up 50 seconds ago 0.0.0.0:80->80/tcp 29004378ddfb-infra 824fdae25e81 docker.io/library/mariadb:latest mysqld 50 seconds ago Up 50 seconds ago 0.0.0.0:80->80/tcp wp-pod-db 31f5d2b2a9c1 localhost/pod-wordpress:latest apache2-foregroun... 32 seconds ago Up 33 seconds ago 0.0.0.0:80->80/tcp wp-pod-web
期待通りに動いている。
実際に別ホストから接続してみる。
remote$ curl -v http://192.168.152.2:80/ * Trying 192.168.152.2:80... * TCP_NODELAY set * Connected to 192.168.152.2 (192.168.152.2) port 80 (#0) > GET / HTTP/1.1 > Host: 192.168.152.2 > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 302 Found < Date: Tue, 15 Jun 2021 08:23:13 GMT < Server: Apache/2.4.38 (Debian) < X-Powered-By: PHP/7.4.20 < Expires: Wed, 11 Jan 1984 05:00:00 GMT < Cache-Control: no-cache, must-revalidate, max-age=0 < X-Redirect-By: WordPress < Location: http://192.168.152.2/wp-admin/install.php < Content-Length: 0 < Content-Type: text/html; charset=UTF-8 < * Connection #0 to host 192.168.152.2 left intact
問題なく動いているみたい。 実際にブラウザでアクセスするとちゃんとWordPressの初期設定画面が表示された!
ここまででpodを手動で動かすことはできたけど、Ignitionでインストールすることを考えると、明示的に実行するコマンドはなるべく減らしてシンプルにしたい。
そこで、Kubernetesのマニフェストファイルを作ってpodを自動構成するようにしてみる。
マニフェストファイルはゼロから自力で作るのは手間なので、先ほど作ったpodの構成をpodmanで出力させる。
$ sudo podman generate kube wp-pod > wp-pod.yaml
こうやって出力されたファイルには、コンテナのデフォルト設定なども含まれているので、編集して不要な設定を削ってやる。
整理した後のマニフェストファイルwp-pod.yaml
がこれ。
apiVersion: v1 kind: Pod metadata: labels: app: wp-pod name: wp-pod spec: containers: - name: web image: localhost/pod-wordpress:latest ports: - containerPort: 80 hostPort: 80 protocol: TCP securityContext: allowPrivilegeEscalation: true capabilities: drop: - CAP_MKNOD - CAP_NET_RAW - CAP_AUDIT_WRITE privileged: false readOnlyRootFilesystem: false seLinuxOptions: {} - name: db image: docker.io/library/mariadb:latest env: - name: MYSQL_ROOT_PASSWORD value: mysql-root-password - name: MYSQL_DATABASE value: wp - name: MYSQL_USER value: wordpress - name: MYSQL_PASSWORD value: wordpress-password securityContext: allowPrivilegeEscalation: true capabilities: drop: - CAP_MKNOD - CAP_NET_RAW - CAP_AUDIT_WRITE privileged: false readOnlyRootFilesystem: false seLinuxOptions: {} volumeMounts: - mountPath: /var/lib/mysql name: wp-mysql-pvc restartPolicy: Always volumes: - name: wp-mysql-pvc persistentVolumeClaim: claimName: wp-mysql
マニフェストファイルでのpod作成を試すために、さっき作ったwp-pod
を一旦消す。
$ sudo podman pod stop wp-pod 29004378ddfbf605c11e8a916066336627d14e8d9fd82d2ac7c6d898d3790503 $ sudo podman pod rm wp-pod 29004378ddfbf605c11e8a916066336627d14e8d9fd82d2ac7c6d898d3790503 $ sudo podman pod ps POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS $ sudo podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ sudo podman volume rm wp-mysql wp-mysql $ sudo podman volume ls
そして、マニフェストファイルwp-pod.yaml
を使ってpodを再生。
$ sudo podman play kube ./wp-pod.yaml Trying to pull docker.io/library/mariadb:latest... Getting image source signatures Copying blob b846f4f4774a skipped: already exists Copying blob 345e3491a907 skipped: already exists Copying blob 57671312ef6f skipped: already exists Copying blob 5e9250ddb7d0 skipped: already exists Copying blob 2d512e2ff778 skipped: already exists Copying blob 57c1a7dc2af9 skipped: already exists Copying blob 66409f940bd2 skipped: already exists Copying blob 82d8723e99d8 skipped: already exists Copying blob 55edbf0f673e skipped: already exists Copying blob c34793730ad6 skipped: already exists Copying blob 8f1925a0d734 [--------------------------------------] 0.0b / 0.0b Copying blob 72904fb5fd0b [--------------------------------------] 0.0b / 0.0b Copying config eff6290896 done Writing manifest to image destination Storing signatures Pod: 5c7741db9e2e4c8ae2a253f6568aa61b018de93d032be7c4377ce91f2dca30f4 Containers: f83e8b9be5fec747f59a86e5a9d1fae0ac4b6fc3e44f18e1c79d35f9dc8dae55 44914870bab7da18a1cbd87e7adcc2169a88ea2d1b83f580d41440b30d92976e
きちんと実行されているか確認。
$ sudo podman pod ps POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 5c7741db9e2e wp-pod Running 20 seconds ago c0b859f1cf3e 3 $ sudo podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0b859f1cf3e k8s.gcr.io/pause:3.5 27 seconds ago Up 23 seconds ago 0.0.0.0:80->80/tcp 5c7741db9e2e-infra f83e8b9be5fe localhost/pod-wordpress:latest apache2-foregroun... 27 seconds ago Up 22 seconds ago 0.0.0.0:80->80/tcp wp-pod-web 44914870bab7 docker.io/library/mariadb:latest mysqld 23 seconds ago Up 23 seconds ago 0.0.0.0:80->80/tcp wp-pod-db $ sudo podman volume ls DRIVER VOLUME NAME local 59378a373f5dcd7e01a03425bfeec23c6632c203918ead50a4d81eb1b49054bc local wp-mysql
ブラウザでもWordPressが動いていることを確認した。
Podmanで独自コンテナとボリュームを使うpodを構成できた!