コンテナのライフサイクル(入門編)
この記事の目的
コンテナの入門時に割とよく使う概念と操作の意味をまとめる。
なお、対象はLinuxコンテナであり、コンテナを管理するツールとしてはpodman*1を使う。
用語の整理
レジストリ
コンテナイメージを格納する場所のこと。コンテナイメージのバージョン管理や配布を行うことができる。
Docker HubやQuayなどの公開されているパブリックレジストリもあれば、自分で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
searchitoperations.techtarget.com
podman
コンテナライフサイクル
www.slideshare.net