🐳

WindowsでPodmanの環境を構築してみる

2022/12/18に公開

こんにちは。株式会社SunAsterisk、エンジニアのkoheiです。
この記事はSun* Advent Calendar 2022の18日目の記事です。

はじめに


Docker Desktop、有料化されてしまいました。(2021/09)
昨今ゲームでもなんでも基本無料のものが増えてきています。
個人的には"良いものにはちゃんとお金を払うべき"という意識があるためDocker Desktopの有料化も「まぁ妥当だな」と思っています。
ですが、それは個人の場合です。
個人で何かをやっている時や準備している時に多少お金がかかろうが自分の財布が痛むだけなので、特に気にしません。
でも、それが会社・クライアントワーク等で使うものとなると一気に慎重さを持たなければならないと思っています。
「代替できるものはないのか」「コストに見合ったメリットがあるのか」など気にしなければならない点が増え、クライアントワークとなると「有料サービスは申請が必要」(発行まで時間がかかる)などといった場面も考えられます。

そのため、ある程度の規模で使用する場合は有料となってしまったDocker Desktopは少し使用を躊躇していました。
そして気づかされました

「なんでDocker Desktopなんだっけ?他に使えるものはないんだっけ?」

今までは何も考えずに、無料で使いやすく実家のような安心感のあるDocker Desktopママにお世話になっていればよかったですが、今となってはそうはいきません。

Mac環境にはColimaというものもあるみたいですが、Windowsでの利用は想定されていません。

そこで今回は第二の実家を探し求め、母を訪ねて三千里、ようやく見つけた「Podmanの存在とその導入方法」を書いてみようと思います。
そして今現在、Docker Desktop以外に知見がなく、頼りきりになってしまっているエンジニアの道標になることで、振り向いてもらえればなと考えています。

前提

目的は「Podmanを動作させること」にあり、その過程の細かな部分は理解しきれていません。
でも自分が構築できた方法を書いていくことで、少しでも導入のきっかけになればと思いこの記事を書いています。

自己紹介

中~高校時代お笑い芸人として活動、その後アルバイトを転々、正直ぐーたらのぷー太郎でした。
2018年頃に何を思ったかアルバイトでの貯金を切り崩し、プログラミングのオンラインスクール「テックアカデミー」に入校、必死で勉強しその年に就職。現在4年目か5年目です。
主な使用言語はPHP/Laravelで、案件によってたまーにJavaをやったり。普段は趣味でゲーム開発を行っているので、独学でC++やC#をやったりしています。
この記事を書いてる約1ヵ月前に株式会社SunAsteriskに転職し、新しい環境をめちゃくちゃ楽しんでいるところです。

対象読者

  • Docker Desktopの温もりから離れられない方
  • 新たなコンテナエンジンの影を探し求めている方
  • Podmanの具体的な導入方法を知りたい方
  • Docker DesktopもPodmanも導入したことないが、導入検討している方

新たなる母「Podman」

Podmanとは


某ポケ〇モンのダグ〇トリオみたいな愛くるしい見た目をしていますが、Podmanとは一体何者なのでしょうか。
結論から言うと「Docker」です。具体的に言うと"Docker互換のコンテナエンジン"です。
では、現状Docker Desktopを利用しているエンジニアに呼びかけてみましょう。


PodmanってDocker互換のコンテナエンジンらしいよ!!

さすがにそれだけでは振り向いてくれそうにありませんね。親の愛は偉大です。
実際僕も"Docker互換のコンテナエンジン"という点だけ知ったところで「じゃあ使ってみるか」とはなりませんでした。
具体的にどんな利点があり、DockerとPodmanのどこが違うのかを見てからじゃないと重い腰は上げられません。
そのため、次は具体的な違いを見ていきます。

DockerとPodmanの違い

Docker Desktopが有料化してしまったからといって、格段にクオリティの低い環境に移行するのは得策ではないと思います。
Podmanの性能によっては多少お金が掛かってもDocker Desktopを使い続けるというのも考えていました。
具体的な違いを探していると、とても有用な記事を見つける事が出来ました。
DockerとPodmanの比較

すごくためになる調査記事、ありがとうございます。
結論として、DockerとPodmanには以下のような違いがあります。

より詳細な違いは記事をご覧いただくとして、上記で挙げた違いについて説明していきます。

デーモンの利用が極めて小さい

Dockerは"dockerd"と呼ばれるデーモンと、"docker CLI"というクライアントに分かれ、REST APIで通信を行っています。

一方でPodmanはコンテナ毎(Pod毎)に小さいデーモン(conmon)をバックグラウンドで起動し、ユーザーはconmonの存在を意識しなくて済むように設計されています。

また、Podmanやconmonのプロセスはコンテナ毎に独立しているため、担当するプロセスがクラッシュしたり、メモリリークを起こした場合でも他のコンテナには影響が出にくい利点があります。

機能面や性能面での重要な違いは少ない

機能面での重要な違いが少ないというのは、一見デメリットに思えますが、「コスト」という軸だけで考えるならメリットとも言えます。
有料サービスと遜色ない性能というのは魅力的です。

一方でデメリットも

良い面もあれば、悪い面もあります。
まず、この記事を書くにあたり自分で調べて環境を構築してみましたが、Docker Desktopに比べて明らかにユーザーが少ないので、参考になる記事の数が限られており、情報収集に苦労しました。
ユーザー数の多さというのは強力なメリットで、その点では現在Docker Desktopが圧倒的に有利な印象です。
またWSLに標準で入っているUbuntuのバージョンでは正式に対応されていなかったりと、まだまだ環境自体が整備されていない印象を受けました。

上記の利点・欠点をDocker Desktopを利用しているエンジニアに呼びかけてみましょう。


Podmanってデーモンの利用が極めて小さくて、機能面・性能面でも重要な違いは少ないからコスパが良いんだよ!!でもユーザー数、環境構築のやり易さではDocker Desktopに分があるよ!

あら、、、こちらを見ていますね。
この調子で続ければ仲間にできるかもしれません。
やはり利点だけではなかなか判断しずらいので、欠点もしっかり理解しておくことで重い腰があがりやすくなったのかもしれないですね。
私もどちらかというと利点よりも欠点を重要視しているので、この点がまとまった記事があったのはすごく助かりました。
次は具体的にどのように導入するのか紹介していきたいと思います。

Podmanの導入方法

ここからは早速Podman環境を用意してみます。
WSLの環境を用意できてない方向けにWSLのインストールから説明していきます。
すでに環境が用意されている場合は「Podmanのインストール」からご覧ください。

①WSL2のインストール

まずはWSL2をインストールする必要があります。
WSL2の詳細についてはこの記事が分かりやすかったです。
早速方法を紹介していきます。

・PowerShellを管理者権限で開き、WSLをインストールする

Windowsに元々入っているCUIの"PowerShell"を管理者権限で開きます。
開かれた画面で以下のコマンドを実行してください。

PowerShell
> wsl --set-default-version 2 ← WSL2にするコマンド
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    この操作を正しく終了しました。
> wsl --install ← WSLをインストールするコマンド
    インストール中: Virtual Machine Platform
    Virtual Machine Platformはインストールされました。
    インストール中: Windows Subsystem for Linux
    Windows Subsystem for Linuxはインストールされました。
    ダウンロード中: WSL Kernel
    インストール中: WSL Kernel
    WSL Kernel はインストールされました。
    ダウンロード中: Ubuntu
    要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。

これにより、WSLがインストールされます。デフォルトのディストリビューションは"Ubuntu 20.04"です。

このような画面になったら指示通りPCを再起動してください。
再起動後、自動的にUbuntuが立ち上がり、インストールが開始されます。気長に待ちましょう。

しばらく待つと以下のように「UNIXのユーザー名を入力してください」と表示されます。
適当に名前を決めて、入力しましょう。

Ubuntu
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: 名前を入力

名前の入力後、同じくパスワードの入力を求められます。
こちらも適当に決めて、入力しましょう。
ちなみにパスワードは入力しても画面に表示されませんので、自分の脳内のみで入力してください。

Ubuntu
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: kohei
New password: パスワードを入力
Retype new password: もう一度入力

以下のようになったら、ウィンドウは一旦閉じても大丈夫です。

Ubuntu
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: kohei
New password:
Retype new password:
passwd: password updated successfully
Instalattion successful!

Tips!: Ubuntu以外のディストリビューションを使用したい場合

> wsl -l -o
上記コマンドで利用可能なディストリビューションの一覧が表示されるため、以下オプションを追加する。
> wsl --install -d 使用したいディストリビューション名
例)> wsl --install -d Ubuntu-20.04

・Ubuntuのアップデート

先ほど、WSLをインストールした際、ディストリビューションを設定していない場合は、Ubuntu 20.04がインストールされています。
ですが、残念ながら20.04のパッケージにPodmanはありません。
つまり

PowerShell
$ sudo apt install podman

をしても、Podmanはインストールできないんです。(これに気づかずだいぶハマった)
調べてみると22.04ではパッケージがあるようだったのでWSL2のUbuntuを22.04にする方法を探しました。

その方法はこの記事にすごく事細かにまとまっていました。ありがとうございます。
ここではPodmanの環境構築で必要ない部分を端折りながら紹介していきます。

まずはWSLを開きましょう。

PowerShell
> wsl
$

次に以下のコマンドでAPTのアップデートをダウンロードします。

PowerShell
$ sudo apt update

するとパスワードを求められますので、先ほど設定したパスワードを入力してください。
こちらも先ほどと同様、入力されたパスワードは表示されません。
完了したら次は以下のコマンドを実行し、実際にAPTのアップデートを実行します。
先ほどのコマンドと似ていますが、"update"が"upgrade"になっている事に注意してください。

PowerShell
$ sudo apt upgrade

アップデートが完了したら以下コマンドでWSLを再起動します。

PowerShell
$ exit ← WSLから抜ける
logout
> wsl --shutdown ← WSLをシャットダウン
> wsl ← 再度起動
$

いよいよ22.04へアップデートします。
以下コマンドを実行してください。(少々時間がかかりますので、コーヒーでもシバきましょう)
途中、処理続行の確認、使わないパッケージの削除確認が入りますが、Podmanを動かすのを優先したい場合は全てyで動かせると思います。

PowerShell
$ sudo do-release-upgrade

完了したら、もう一度再起動しましょう。

PowerShell
$ exit
logout
> wsl --shutdown
> wsl
$

これで終わりかと思いきや、WSLの22.04でPodmanを動かすためには追加で以下の対応が必要でした。

iptables

WSLではnftablesをサポートしていないので、iptablesをlegacyモードに変更します。

PowerShell
$ sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).

  Selection   Path                       Priority   Status
-----------------------------------------------------------
* 0           /usr/sbin/iptables-nft      20        auto mode
  1           /usr/sbin/iptables-legacy   10        manual mode
  2           /usr/sbin/iptables-nft      20        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1  ← 1を入力
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode

systemdの起動スクリプト作成

WSLでは、Windowsとの相互運用を行うためのプロセスがPID=1で動作しているため、systemctlを実行するためのsystemdが作動していません。
Ubuntu 22.04ではWSLでsystemdを動作させるためのスクリプトwsl-systemdが用意されており、これを起動時に実行させます。
以下のようにスクリプトを作成してください。

PowerShell
$ sudo nano /etc/profile.d/00-wsl-systemd.sh
00-wsl-systemd.sh
SYSTEMD_PID=$(ps -fe | grep '/lib/systemd/systemd --unit=multi-user.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
	sudo /usr/libexec/wsl-systemd
fi

スクリプト内のwsl-systemdを実行されるときに管理パスワードを尋ねられないようにwsl-systemdをsudoersに記述します

PowerShell
$ sudo nano /etc/sudoers.d/wsl-systemd
/etc/sudoers.d/wsl-systemd
%adm ALL=(ALL:ALL) NOPASSWD: /usr/libexec/wsl-systemd

他にもより良いWSLのUbuntu22.04環境をつくる方法が紹介されていましたが、それを行わなくともPodman環境は構築できたので今回は割愛します。
一旦以上でアップデートは完了です。

②Podmanのインストール

では早速、Podmanをイントールしていきます。

・APTでPodmanをインストール

いよいよPodmanのインストールをしていきます。
そのため、まずは以下のコマンドを実行して、Podmanをインストールしてください。

PowerShell
$ sudo apt install -y podman

Dockerと同じ使用感で使えたらいいなと思っていたので.bashrcに「dockerと入力したらpodmanと解釈してね」というエイリアスを追加しました。
そうすることでdockerと入れても問題なく動いてくれるようになります。

PowerShell
$ sudo nano ~/.bashrc
.bashrc
alias docker=podman ← これを追加

その後

PowerShell
$ source ~/.bashrc

を実行し変更を反映しておきます。
では、以下のコマンドを実行してバージョンを確認してみましょう。

PowerShell
$ docker -v
podman version 3.4.4

しっかりバージョンが表示されました。要は"podman -v"を実行したと同義になります。
それではついにdocker-compose.ymlを作成してbuildしてみます。
ここではとりあえずimageをbuild出来ればよかったので、alpineにしてみました。

$ vi docker-compose.yml
version: "3.9"
services:
  test:
    image: "alpine:3.16"
    tty: true

さあ、ついにdocker-composeをupしちゃいましょう。

PowerShell
$ docker-compose up -d
PowerShell
Pulling test (alpine:3.16)...
ca7dd9ec2225: Download complete
bfe296a52501: Download complete
Creating test_test_1 ... done

うおおおおお!
とこんな感じでPodmanでも問題なく環境構築をすることができました。

まとめ

技術選定などで使用するツールなどを判断するときに「利点」「欠点」「利用方法」が分かっていればすごく心強いです。
今回の記事でそういったPodmanの勘所を押さえることによって、移行の不安解消や移行作業に少しでも役に立てれば嬉しいです。
また、デメリットとしてユーザー数の少なさを挙げましたが、有料化に伴ってPodmanなど代替サービスの普及率も少なからず増えていくと思うので、これからの活躍にも期待できます。

記事も書き終わったところで、また呼びかけてみましょう。


環境構築のやり方書いておいたから、これ見れば構築出来るよ!!

これにはニッコリですね。

参考記事

DockerとPodmanの比較 [Container Runtime Meetup #3]
デーモンとは
WSL 2(Windows Subsystem for Linux 2)の違いとインストール方法
Ubuntu22.04 on WSL2(Windows10) 環境構築
Windows 10でPodmanを動かす覚書 WSL2+Ubuntu 20.04版
WSL2のインストールと分かりやすく解説【Windows10/11】

Discussion