作業ログ源泉垂れ流し

しがないIT技術者の作業ログを垂れ流す

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-dbwp-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:latestwp-pod-webコンテナとしてwp-pod内で実行。

$ sudo podman run -d --restart=always --pod=wp-pod --name wp-pod-web localhost/pod-wordpress:latest
31f5d2b2a9c16d6a945242c363c5209ddea7c8563c2f720265f0a7bc4c95c6a2

wp-podWordPressが稼働したはず。

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を構成できた!