tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

コンテナのライフサイクル(入門編)

この記事の目的

コンテナの入門時に割とよく使う概念と操作の意味をまとめる。

なお、対象はLinuxコンテナであり、コンテナを管理するツールとしてはpodman*1を使う。

用語の整理

レジストリ

コンテナイメージを格納する場所のこと。コンテナイメージのバージョン管理や配布を行うことができる。

Docker HubQuayなどの公開されているパブリックレジストリもあれば、自分でOSS等(Docker Registry等)を使って構築するプライベートレジストリもある。パブリックレジストリでは有名なOSS製品の公式イメージが公開されており、コンテナを使うときにそれらを活用できる。

リポジトリ、タグ

リポジトリは関連するコンテナイメージを集めたもののこと。通常、同じ製品で異なるバージョンの集合体である。

例えば、Docker Hubというレジストリnginxという製品のリポジトリnodeという製品のリポジトリがあるという関係性である。レジストリ内に製品ごとのフォルダが切られていて、同じ製品の異なるバージョンのコンテナイメージが各製品のフォルダ内に配置されているというイメージと考えればよい。

バージョンはタグと呼ばれるラベルで識別される。

pull / push

pullはコンテナイメージをレジストリからコンテナを実行するクライアントにダウンロードすること*2。pushはローカルのコンテナイメージをレジストリにアップロードすることである。

ライフサイクル

パブリックレジストリ上のコンテナをローカルのLinuxマシンにダウンロードして実行するシナリオでのライフサイクルを示す。

コンテナイメージのpull

クライアント上でpodman imagesコマンドでダウンロード済みのコンテナイメージを確認する。podman pull nginxコマンドでnginxのイメージをpullする。pull時にタグを指定していないが、この場合はデフォルトでlatestというタグを指定したことになる*3

[root@nuc-centos8 ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
[root@nuc-centos8 ~]# podman pull nginx
Trying to pull docker.io/library/nginx...
Getting image source signatures
Copying blob 6f28985ad184 skipped: already exists
Copying blob 879a7c160ac6 done
Copying blob be704f37b5f4 done
Copying blob 29f7ebf60efd done
Copying blob de58cd48a671 done
Copying blob 158aac73782c done
Copying config 6084105296 done
Writing manifest to image destination
Storing signatures
6084105296a952523c36eea261af38885f41e9d1d0001b4916fa426e45377ffe
[root@nuc-centos8 ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
docker.io/library/nginx     latest   6084105296a9   6 days ago    137 MB

コンテナイメージの実行

podman runコマンドでイメージ(例ではnginx)とコンテナ内で実行するコマンド(例では/bin/bash)を指定しコンテナを実行できる。-itは対話的にシェルで操作する場合を指定するオプションである。

[root@nuc-centos8 ~]# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
[root@nuc-centos8 ~]# podman run  -it docker.io/library/nginx /bin/bash
root@5fc8e66ca233:/# uname -r
4.18.0-193.el8.x86_64
root@5fc8e66ca233:/# exit
exit

ターミナルをもう一つ立ち上げて確認するとコンテナが存在している。名前を指定していないので自動で名前が付与される(inspiring_albattaniがそれ)。-itを指定した場合、コンテナからexitするとコンテナ自体も停止する。停止後のコンテナを確認する場合はpodman images -aとする。

(exit前)
[root@nuc-centos8 ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND    CREATED         STATUS             PORTS  NAMES
5fc8e66ca233  docker.io/library/nginx:latest  /bin/bash  39 seconds ago  Up 38 seconds ago         inspiring_albattani
(exit後)
[root@nuc-centos8 ~]# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
[root@nuc-centos8 ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND           CREATED        STATUS                      PORTS                 NAMES
5fc8e66ca233  docker.io/library/nginx:latest   /bin/bash         9 minutes ago  Exited (127) 7 minutes ago                        inspiring_albattani

対話が必要なく、デーモンとしてバックグラウンドで立ち上がっていればいいケースでは-dをつけて実行する。以下はhttpdコンテナを実行する例である。ホストの8000番ポートがコンテナの80番ポートに転送されるオプションを-pとして付与している。これでコンテナを実行後、localhostの8000番ポートにhttpアクセスをすると結果が返ってきていることがわかる。なお、見づらいので以降の例ではpodman ps -aしたときに話題の対象としているhttpd以外のコンテナについては記載を省略する(ひとつ前に試したnginxのコンテナが存在するため)。

[root@nuc-centos8 ~]# podman run -d -p 8000:80 docker.io/library/httpd
f5580c4f209e1df4648f2fe93009b9d5896b02b4f6bea527bffef7be29310774
[root@nuc-centos8 ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS                 NAMES
f5580c4f209e  docker.io/library/httpd:latest  httpd-foreground  30 seconds ago  Up 28 seconds ago  0.0.0.0:8000->80/tcp  pedantic_chaum
[root@nuc-centos8 ~]# curl http://localhost:8000
<html><body><h1>It works!</h1></body></html>

このhttpdの例ではコンテナイメージをpullする部分あらかじめ実行してあり、記載は省略している。なお、明示的にコンテナイメージをpullせずにrunした場合でも、podman run実行時に自動でpullしてくれる。

コンテナのstopとstart

前節で実行したhttpdのコンテナをpodman stopコマンドで停止してみる。停止する対象のコンテナはコンテナ名で指定する。

[root@nuc-centos8 ~]# podman stop pedantic_chaum
f5580c4f209e1df4648f2fe93009b9d5896b02b4f6bea527bffef7be29310774
[root@nuc-centos8 ~]# podman ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

停止後は当然http接続してもつながらない。

[root@nuc-centos8 ~]# curl http://localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

一度停止したコンテナを再度実行してみる。このときはrunではなくstartを使う。

[root@nuc-centos8 ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND           CREATED         STATUS                       PORTS                 NAMES
f5580c4f209e  docker.io/library/httpd:latest   httpd-foreground  9 minutes ago   Exited (0) 5 minutes ago     0.0.0.0:8000->80/tcp  pedantic_chaum
(対象のコンテナ以外は略)
[root@nuc-centos8 ~]# podman start pedantic_chaum
pedantic_chaum
[root@nuc-centos8 ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS                 NAMES
f5580c4f209e  docker.io/library/httpd:latest  httpd-foreground  10 minutes ago  Up 14 seconds ago  0.0.0.0:8000->80/tcp  pedantic_chaum
[root@nuc-centos8 ~]# curl http://localhost:8000
<html><body><h1>It works!</h1></body></html>

コンテナとコンテナイメージの削除

コンテナを停止ではなく削除する。削除するとstartで再実行できなくなる。コンテナを停止してから、podman rmコマンドで削除する*4

[root@nuc-centos8 ~]# podman stop pedantic_chaum
f5580c4f209e1df4648f2fe93009b9d5896b02b4f6bea527bffef7be29310774
[root@nuc-centos8 ~]# podman rm pedantic_chaum
f5580c4f209e1df4648f2fe93009b9d5896b02b4f6bea527bffef7be29310774
[root@nuc-centos8 ~]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND           CREATED         STATUS                       PORTS                 NAMES
(対象のコンテナ以外は略)

この段階では、pullしてあるイメージは削除されていない。

[root@nuc-centos8 ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
docker.io/library/nginx     latest   6084105296a9   6 days ago    137 MB
docker.io/library/httpd     latest   ae15ff2bdcb4   6 days ago    142 MB

イメージの削除にはpodman rmiコマンドを利用する。

[root@nuc-centos8 ~]# podman rmi httpd
Untagged: docker.io/library/httpd:latest
Deleted: ae15ff2bdcb44d66199dc364b273ab5b108fb120bb95f022cedabbfab3253701
[root@nuc-centos8 ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
docker.io/library/nginx     latest   6084105296a9   6 days ago    137 MB

参考にしたもの

用語

https://docs.docker.jp/engine/reference/glossary.html#repository

docs.microsoft.com

www.creationline.com

wiki.aquasec.com

searchitoperations.techtarget.com

www.rworks.jp

podman

access.redhat.com

コンテナライフサイクル

access.redhat.com

www.slideshare.net

その他

codezine.jp

*1:Dockerとほぼ互換のコンテナランタイムツール

*2:ダウンロードした際にクライアント上でコンテナイメージが配置される場所のこともレジストリと呼んでもよさそうだが、あまりそういう用例は見かけなかった。ローカルレジストリとでも呼べば区別できそうだが、調べる限りそれはプライベートレジストリと同じ意味で使われていた。コンテナの置き場所となるだけではなく配布する、という機能を担わない限りはレジストリとは呼ばないのかもしれない。

*3:つまり最新版がダウンロードされる

*4:実行中のコンテナを強制的に削除することもできる。