AlmaLinux 8.6
AlmaLinux 8.6 セットアップメモ
Section 6.3 独自のコンテナイメージを作成
概要
誰かが作成してくれているコンテナイメージを使えばいいのですが、ちょっとそうもいかないなんて場合もあるので、作ってみようと思います。
Buildah と podman build
コンテナイメージを作成しようと思うと、Buildahとpodman buildどちらかの記事が良く見つかります。公式サイトのblogに関係性が説明されていますが、podman build は buildah bud コマンドを呼ぶだけと書かれているので、読み替えれば十分でしょう。とはいえ、役割が異なるっぽいので、コンテナイメージを作成するときは、buildahコマンドを使い、誰かが作ってくれた設計書を再生するだけならpodman buildという分け方が良いかも。
この辺りは自分なりにルールを決めてもらうということで……
Containerfile からコンテナイメージを作成
Containerfileは、DockerでいうところのDockerfileと互換性はあるということで、最新のコマンドまで追随しているかはさておき、流用することもできるそうです。
今回は、Section 3.2~Section 3.3で構築した PostgreSQL + PostGIS のコンテナイメージのためのContainerfileを作成していきます。 → サービス入りのをコンテナ化するのは難易度が高い。 ベースとなるコンテナイメージは、AlumaLinuxを使います。
UBIイメージ
Red Hat Universal Base Images というのもあります。RHEL以外にもデプロイできるように作られているそうです。再配布する事もライセンスに従う範囲内ではできるようなので、良さそうなのですが変なところでハマりそうだったのでここではパスしてます。
作業場所を作成して、ファイルを作成します。
[vagrant@localhost ~]$ mkdir ~/postgreSQL+PostGIS
[vagrant@localhost ~]$ cd postgreSQL+PostGIS
[vagrant@localhost ~]$
Containerfileは下記の内容で作成します。
FROM quay.io/almalinux/almalinux:8.6
RUN dnf -y module disable postgresql
RUN dnf -y install 'dnf-command(config-manager)'
RUN dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
RUN dnf -y config-manager --disable pgdg10 pgdg11 pgdg12 pgdg14 pgdg15
RUN dnf -y install postgresql13 postgresql13-server
RUN /usr/pgsql-13/bin/postgresql-13-setup initdb
RUN systemctl enable postgresql-13
RUN cp /var/lib/pgsql/13/data/postgresql.conf /var/lib/pgsql/13/data/postgresql.conf.org
RUN dnf -y remove 'dnf-command(config-manager)' dbus-glib python3-dateutil python3-dbus python3-dnf-plugins-core python3-six
nginx 入りのコンテナを使ってみる
podman run
でコンテナを実行できるのですが、今回はいろいろとオプションが必要になります。
まず、ウェブサイトのコンテンツはローカル PC 内に作成したのでコンテナ内のフォルダと紐付けが必要。もう一つは Web Server なのでネットワーク的につながらないとなりあせん。
という事で使うオプションは
option | オプションの値 | 説明 |
---|---|---|
-d, —detach | コンテナをバックグラウンドで実行し続ける | |
—rm | 終了したらコンテナを破棄する | |
-p,—publish | string | コンテナのポートと Windows 内のポートを紐づける |
—name | string | コンテナの名前 |
-v, —volume | stringArray | Windows のフォルダとコンテナ内のフォルダを紐づける |
という感じになる。
では実行してみよう。
[vagrant@localhost ~]$ podman run --rm -d -p 8080:80 --name web -v ~/html:/usr/share/nginx/html docker.io/library/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 600c24b8ba39 done
Copying blob 31b3f1ad4ce1 done
Copying blob fd42b079d0f8 done
Copying blob 30585fbbebc6 done
Copying blob 18f4ffdd25f4 done
Copying blob 9dc932c8fba2 done
Copying config 2d389e5459 done
Writing manifest to image destination
Storing signatures
a1b71a2ccb0e1018bd88751d6533571a08bbba587101fc60cad90d8f0486997a
[vagrant@localhost ~]$
これでコンテナが起動したはず……なのでブラウザで確認してみます。
基本的に 1024 番ポート以下は指定することができないので、8080 に転送しています。なので http://localhost:8080/ でアクセスできるはずです。
面倒な場合は curl で確認してみましょう。
[vagrant@localhost ~]$ curl http://localhost:8080/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>Podman Container</title>
</head>
<body>
<h1>Hello!</h1>
</body>
</html>
[vagrant@localhost ~]$
vagrant 上で動作させている場合
Vagrantfile 内に forwarded_port の設定があるので、転送ポートを入れ替えればブラウザからポート指定なしで見ることができます。
config.vm.network "forwarded_port", guest: 8080, host: 80
あとは仮想マシン上で firewall を開けておきましょう。
[vagrant@localhost ~]$ sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
port番号がついているかどうかが影響することは少ないと思うけれど……
コンテナの状態を確認する
実行/停止中のコンテナリストを表示してみます。
[vagrant@localhost ~]$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b71a2ccb0e docker.io/library/nginx:latest nginx -g daemon o... 15 minutes ago Up 15 minutes ago 0.0.0.0:8080->80/tcp web
[vagrant@localhost ~]$
動いていることはコレで確認できます。
コンテナを停止する
これもコマンドから実行します。止めた後、本当に消えたか確認もしてみましょう。
[vagrant@localhost ~]$ podman stop web
web
[vagrant@localhost ~]$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[vagrant@localhost ~]$
止めただけで image は残ったままなので、もう一度、コンテナを起動するときはダウンロードしない分早くなります。