わからないなりに理解したい Podman ② ~ コンテナを書き換える

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回は前回に引き続き、Podman を動かしながらなんとなくコンテナを使えるようになりたい…という趣旨で、コンテナ内を操作する方法をいくつか見ていきたいと思います。

■Podman でコンテナの中身を変えてみる

ここからは quay.io の httpd コンテナイメージを使って作成したコンテナに新しくページを追加する方法を例に、Podman でコンテナの中身を変更する方法を見ていきましょう。

今回は、以下のようなコマンドで起動したコンテナを例にしています。

[ ~]$ podman run -dt -p 8080:8443/tcp --name test-container quay.io/centos7/httpd-24-centos7
a1ce7e00274770ceccca2a410b69d40d37950d0fed46ec30a6d0a098ade8f986
[ ~]$ podman ps
CONTAINER ID  IMAGE                                    COMMAND               CREATED        STATUS            PORTS                   NAMES
a1ce7e002747  quay.io/centos7/httpd-24-centos7:latest  /usr/bin/run-http...  3 minutes ago  Up 3 minutes ago  0.0.0.0:8080->8443/tcp  test-container
[ ~]$

・コンテナの bash を起動して直接操作する

まずはコンテナ内で直接コマンドを実行する方法です。
Podman では以下のコマンドで、指定したコンテナでコンテナ内で実行可能な任意のコマンドを実行することができます。

podman exec [オプション] コンテナ名/ID [実行したいコマンド]

この podman exec コマンドでコンテナ内を操作していくことももちろん可能ですが、
これを利用して、以下のようなコマンドによってコンテナ内の bash を起動することで、
入力がコンテナを操作する bash に切り替わり、より自由にコンテナ内を操作できるようになります。

[ ~]$ podman exec -it test-container /bin/bash
bash-4.2$

では試しに、コンテナ内の bash から新しいページを追加してみましょう。
cat コマンドで httpd の設定ファイルからコンテンツのパスを確認して、新しいファイルを作成します。

bash-4.2$ cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/opt/rh/httpd24/root/var/www/html"
    # access content that does not live under the DocumentRoot.
bash-4.2$
bash-4.2$ echo -e "This is test content DESU.\n Made with bash in Container." > /opt/rh/httpd24/root/var/www/html/test_exec.html
bash-4.2$
bash-4.2$ cat /opt/rh/httpd24/root/var/www/html/test_exec.html
This is test content DESU.
 Made with bash in Container.
bash-4.2$

ファイルを作成したら exit コマンドでコンテナの bash を終了し、コンテナ内から抜けましょう。
更に、curl で先ほど作成されたページが追加されているかを確認します。
なお、quay.io の公式 httpd コンテナはデフォルトで https を使用する設定になっています。この例では “-k” オプションで証明書エラーを無視して確認していますが、こういった検証目的以外の場合はちゃんと設定するようにしてください。

bash-4.2$ exit
exit
[ ~]$ curl -k https://localhost:8080/test_exec.html
This is test content DESU.
 Made with bash in Container.
[ ~]$

無事、追加されていますね。

このように podman exec コマンドを使うことで、コンテナ内で様々な操作を行うことができます。

・コンテナにローカルファイルをコピーする

続いて、コンテナ内にファイルをコピーする方法を見ていきます。
Podman では以下のコマンドで、ローカルとコンテナ内でのファイルのやりとりができます。

podman cp [オプション] コピー元パス コピー先パス
※"コピー元パス" および "コピー先パス" にコンテナ内を指定する場合、"コンテナ名:パス"

このコマンドを利用して、適当なファイルをローカルで作成して先のコンテナへコピーし、コンテナの httpd に新しいページを追加してみます。

[ ~]$ echo -e "これはテストファイル。\n podman cp で配置しました。" > /tmp/test_cp.html
[ ~]$ cat /tmp/test_cp.html
これはテストファイル。
 podman cp で配置しました。
[ ~]$ podman cp /tmp/test_cp.html test-container:/opt/rh/httpd24/root/var/www/html/
[ ~]$

これで OK です。
curl で先ほどコピーしたページが追加されているかを確認します。

[ ~]$ curl -k https://localhost:8080/test_cp.html
これはテストファイル。
 podman cp で配置しました。
[ ~]$

このように、コンテナ内とのファイルのやりとりは簡単にできます。

・ContainerFile (DockerFile) を使用して、新しいコンテナイメージを作る

先の 2つの方法は起動中のコンテナに対して変更を行う方法でしたが、
コンテナの設計書とも言えるコンテナイメージに変更を加え、新しい別のコンテナイメージを作成する方法もあります。

この方法では “podman build” コマンドを使用しますが、別途 ContainerFile という名前のファイルが必要になります。
ContainerFile にはどのコンテナイメージを元にするか、どういった変更を加えるかなどの情報を、既定の書式に従って記述します。
ContainerFile の書式の詳細につきましては、こちらのドキュメントなどを参照してください。

今回は先に使用した quay.io の httpd コンテナイメージに、コマンドとローカルファイルからのコピーによって新しく2つのページを追加したイメージを作成する ContainerFile を作りました。
この ContainerFile に合わせた、コピー元のファイルも用意します。

[ ~]$ cat Containerfile
FROM quay.io/centos7/httpd-24-centos7
RUN echo "new file with ContainerFile" > /opt/rh/httpd24/root/var/www/html/test.html
COPY ./test_containerfile.html /opt/rh/httpd24/root/var/www/html/COPY.html
[ ~]$
[ ~]$ echo -e "podman build test file. \n copy from local file" > ./test_containerfile.html
[ ~]$

ContainerFile を作成したら、以下のようなコマンドを実行します。
(“-t” でコンテナイメージ名を指定します。今回は “test_image” という名前をつけています)

[ ~]$ podman build -t test_image .
STEP 1/3: FROM quay.io/centos7/httpd-24-centos7
STEP 2/3: RUN echo "new file with ContainerFile" > /opt/rh/httpd24/root/var/www/html/test.html
--> Using cache ba0561f39501d49383544a41a9533567cd9134a0a84c48ac455057ce1481327b
--> ba0561f3950
STEP 3/3: COPY ./test_containerfile.html /opt/rh/httpd24/root/var/www/html/COPY.html
COMMIT test_image
--> 893099d6157
Successfully tagged localhost/test_image:latest
893099d61579e84c3bcccc40d26a22cc3d3eb1df58006fb947a004bbba3ff0fe
[ ~]$

これで新しいコンテナイメージの作成ができました。
以下のコマンドでローカルに保存されたコンテナイメージを確認すると、先ほど指定した “test_image” という名前のコンテナイメージが保存されているはずです。

[ ~]$ podman images
REPOSITORY                        TAG         IMAGE ID      CREATED         SIZE
localhost/test_image              latest      893099d61579  33 seconds ago  360 MB
quay.io/centos7/httpd-24-centos7  latest      d9a40e187609  2 weeks ago     360 MB
[ ~]$

このコンテナイメージからコンテナを作成すると、先に ContainerFile で指定した操作、つまり今回で言えば新しいページ2種類の作成が行われていることが確認できるはずです。

[ ~]$ podman run -dt -p 8082:8443/tcp --name containerfile-test localhost/test_image
06ba13e861748aad272ff457e41c1679a73798eb1cc528285232bfee9351f46d
[ ~]$ curl -k https://localhost:8082/test.html
new file with ContainerFile
[ ~]$ curl -k https://localhost:8082/COPY.html
podman build test file.
 copy from local file
[ ~]$

■ところで、docker.io や quay.io って何だ?

今回使用したコンテナイメージにある quay.io や前回の docker.io についても少し触れておきます。

前回お話ししたとおり、コンテナを使うにはコンテナイメージが必要になります。
しかし、試してみるとわかると思いますが、特に事前に準備をしなくても podman でコンテナを動作させることができます。
これは、インターネット上に公開されているコンテナイメージをダウンロードして使用することができるからです。

このようにコンテナイメージの配布・保管などを行うものをコンテナレジストリと呼びます。
quay.io や docker.io などはこのコンテナレジストリを提供するサービスの一種です。
コンテナレジストリを提供するサービスは他にも Docker Hub や AWS の Amazon Elastic Container Registry (ECR)、Microsoft Azure の Azure Container Registry (ACR) などを始め、多数存在しています。

各コンテナレジストリは、管理する団体や方針、有償・無償の別やアカウント登録の要否などそれぞれ特徴が異なります。
また、当然ながら同じソフトウェアのコンテナイメージでも、コンテナレジストリやものによっては内容が大きく異なる場合があります。
例えば、前回と今回で使用した httpd のコンテナイメージを例に見てみると、動かし方も少し違いましたが…

 ・docker.io
Debian / Ubuntu によって管理・提供されている、とされるレジストリで、提供されているコンテナイメージも基本的には Debian / Ubuntu ベースのものが多いと考えられます。

[ ~]$ podman run -dt -p 8081:80/tcp --name dockerio-httpd docker.io/library/httpd
156f0a452cb324407c886a10898cbe8932c11a55e812f9407b1e237eec3a1f92
[ ~]$ podman exec -it dockerio-httpd cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
[ ~]$

 ・quay.io
現在は RedHat によって管理・提供されているレジストリで、提供されるコンテナイメージも基本的には RedHat 系 OS ベースのものが多いものと思われます。

[ ~]$ podman run -dt -p 8080:8443/tcp --name quayio-httpd quay.io/centos7/httpd-24-centos7
a165972ce91e8315fa1d39e71b5e7fed7b3b99198721df5cd00324d9d5ae9724
[ ~]$ podman exec -it quayio-httpd cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[ ~]$

このようにベース OS 自体が異なり、コンテナ内でデフォルトで使用できるコマンドにも大きく差があります。

■最後に

今回はコンテナの中身を書き換える方法について見てきました。
前回分と合わせれば、とりあえずはコンテナを動かして中身を書き換える…ということはできるはずです。
なんとなーく、一応コンテナ使うことはできるかなー、という気分になれていれば

しかし、冷静に考えるとここまでの話は「別にコンテナでやらなくてもよくない?」という内容です。
また次回、これぐらいのざっくり感でもう少し podman に関してお話していきたいと思います。

(他の回)
わからないなりに理解したい Podman ① ~ 何をするもの?
(今回)わからないなりに理解したい Podman ② ~ コンテナを書き換える
わからないなりに理解したい Podman ③ ~ 可搬性とは?
わからないなりに理解したい Podman ④ ~ 可搬性とは?その2
わからないなりに理解したい Podman ⑤ ~ レジストリと TAG
わからないなりに理解したい Podman ⑥ ~ Pod って何だ?
わからないなりに理解したい Podman ⑦ ~ Pod の可搬性

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です