Dockerの代わりにrootlessで使えるPodmanを触ってみる
こんにちは
家の野菜室はバージョニング無効
システムソリューション部のかわいです。
最近また寒いですね。
今回は Podman について、入門者向けに記事にしたいと思います。
1 2 3 4 5 6 7 8 9 | .--"--. / - - \ / (O) (O) \ ~~~| -=(,Y,)=- | .---. /` \ |~~ ~/ o o \~~~~.----. ~~ | =(X)= |~ / (O (O) \ ~~~~~~~ ~| =(Y_)=- | ~~~~ ~~~| U |~~ |
Podmanって?
Pod Managerの略。
Red Hat社製のOSSコンテナツールです。Dockerと互換性があり、使い方はほぼ同じです。詳しくは以下公式ドキュメントを参照。
https://www.redhat.com/ja/topics/containers/what-is-podman
え?じゃあDockerで良くない?って思ったかもしれませんが、
Podmanはデフォルトでrootless(root権限なし)で使えるのでセキュアな点に優位性があります。
(※Dockerでも可能だが、追加設定が必要)
なぜrootlessが安全なのかというと、
Dockerはrootが起動したデーモンとして動き、ホストマシンからREST API経由で通信を行います。
その際ドメインソケットを使用するため そこでroot権限が必要になる→コンテナからホストへの攻撃が可能になる、という理屈です。
では早速使ってみましょう。
インストール
■環境
1 | Ubuntu 24.04 LTS |
インストール自体は簡単。
※docker-composeを使う方は同等の「podman-compose」を一緒に入れても良いです。
1 2 3 4 5 | $ sudo apt update $ sudo apt install podman $ podman --version podman version 4.9.3 |
rootlessモードの確認(trueになっていればok)
1 2 | $ podman info | grep rootless rootless: true |
イメージのpull
インストールが済んだので、一般ユーザのまま試しにApacheイメージを引っ張ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 | $ podman pull docker.io /library/httpd Trying to pull docker.io /library/httpd :latest... Getting image source signatures Copying blob 79b49624e34b done | Copying blob d7ad38c6dd97 done | Copying blob 4f4fb700ef54 done | Copying blob 9bd25d4f7b77 done | Copying blob 7d9f97915db2 done | Copying blob bc0965b23a04 done | Copying config 494b2b45fd done | Writing manifest to image destination 494b2b45fd74cbf7eb7dc9cfeda02b26c9450e26719afaf1914635832217c4ce |
完了したので起動します。
今回はTCP/8888を使用します。
1 2 3 4 5 6 7 | $ podman run -dt -p 8888:80 /tcp docker.io /library/httpd 6e5578b6ab93e131593325aa61c8b78487d6d602a74c78b714aa8b089ac12d0f # 起動状態の確認 $ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e5578b6ab93 docker.io /library/httpd :latest httpd-foreground 5 seconds ago Up 5 seconds 0.0.0.0:8888->80 /tcp quizzical_tharp |
起動してきたので早速アクセスしてみます。
「It works!」と表示されればok
1 2 | $ curl http: //127 .0.0.1:8888 <html><body><h1>It works!< /h1 >< /body >< /html > |
ブラウザでも表示されました。
Dockerと同じように、ログとプロセス状態の確認も可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ podman logs -l [Thu Dec 12 02:48:15.892285 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache /2 .4.62 (Unix) configured -- resuming normal operations [Thu Dec 12 02:48:15.893410 2024] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND' 10.0.2.100 - - [12 /Dec/2024 :02:48:57 +0000] "GET / HTTP/1.1" 200 45 10.0.2.100 - - [12 /Dec/2024 :02:48:57 +0000] "GET /favicon.ico HTTP/1.1" 404 196 10.0.2.100 - - [12 /Dec/2024 :02:50:24 +0000] "GET / HTTP/1.1" 200 45 ~$ podman top -l USER PID PPID %CPU ELAPSED TTY TIME COMMAND root 1 0 0.000 4m36.020462289s pts /0 0s httpd -DFOREGROUND www-data 8 1 0.000 4m36.022522465s pts /0 0s httpd -DFOREGROUND www-data 9 1 0.000 4m36.02299156s pts /0 0s httpd -DFOREGROUND www-data 10 1 0.000 4m36.023751351s pts /0 0s httpd -DFOREGROUND |
もちろん若干の違いはあるものの、Dockerを触ってる人なら違和感なく扱えると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | $ podman run quay.io /podman/hello Trying to pull quay.io /podman/hello :latest... Getting image source signatures Copying blob 81df7ff16254 done | Copying config 5dd467fce5 done | Writing manifest to image destination !... Hello Podman World ...! .--"--. / - - \ / (O) (O) \ ~~~| -=(,Y,)=- | .---. /` \ |~~ ~/ o o \~~~~.----. ~~ | =(X)= |~ / (O (O) \ ~~~~~~~ ~| =(Y_)=- | ~~~~ ~~~| U |~~ Project: https: //github .com /containers/podman Website: https: //podman .io Desktop: https: //podman-desktop .io Documents: https: //docs .podman.io YouTube: https: //youtube .com/@Podman X /Twitter : @Podman_io Mastodon: @Podman_io@fosstodon.org |
ちなみにPodman公式キャラはアザラシではなく「Selkies(セルキー)」というスコットランドの神話上の生き物らしいです。
(セルキーの群れのことを「pods」と呼ぶことから来てるらしい。かわいい)
完