Docker Desktopの代替方法 - Windows and Mac編
はじめに
新方針でDocker Desktopが大企業での利用の場合は商用ライセンスの使用が必要になるようです。新料金体系は8/31から実施ですが、2022年1月31日まで猶予期間があります。
個人やスモールビジネス、あるいは教育やOSSプロダクトなどは継続して無料版のPersonalを利用できるようですが、従業員数250人以上/年間売り上げ10億円以上の会社が対象になるようです。今見てる限りだと部署とかチームみたいな契約の単位では無く会社規模なので、大きな組織に所属してるともれなく対象になりそうですね。
$5/userからなので基本的には運用性も含めて払う方が楽だと思いますが、金額の大小にかかわらず予算を取るのが大変な組織や会社自体はデカくても部署がインキュベーションなので予算が基本無い、とか色んなパターンもあるかと思います。
ちょうど、手元のPCでここ最近 Docker Desktop for Windowsが上手く動いてなくて困ってたので、ついでにオルタネイティブを調べてみました。
追記
- コメントやTwitterでWSL2でもデーモン動かせば普通にDocker動くよ、と指摘を頂く。言われてみればそれはそう。なぜかデーモンは動かないと勘違いしてた。
sudo service docker start
を打とう! - コメントでMacでもPodman machineを使う事で簡単に動かせるよ、とアドバイス頂く。その方法も確かに良さそう。
Windows: WSL2 + Podman
Podmanは恐らくDockerに次いで有名なコンテナのビルド/実行のツールです。Dockerに次いでと言っても知名度やシェアも二分してるとかでは全くなく、RHELを入れると入っている、というくらいの印象です。ただrootlessやmanager daemonを用いない事でセキュリティに注力していることが特徴の一つです。
Macでpodmanを試している記事を見かけたので試しにWSL2にインストールしてみました。
WSL2を使ってもWindowsでDockerを動かすにはDocker Desktop for Windowsが必要になりますがdaemon不要のpodmanならいけそうだな、と。
❯ docker run -it --rm -p 8080:80 httpd
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
以下を参考にインストールします。
以下がインストール部分の抜粋。RedhatのブログなのにRH系じゃなくてUbuntuで書いてあるのはちょっと面白いですね。助かりますけどw
. /etc/os-release
sudo sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"
wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt-get update -qq
sudo apt-get -qq -y install podman
sudo mkdir -p /etc/containers
echo -e "[registries.search]\nregistries = ['docker.io', 'quay.io']" | sudo tee /etc/containers/registries.conf
実行する場合は以下のようにdocker
をpodman
に置き換えれば基本出来ます。
❯ podman info
❯ podman run -it --rm -p 8080:80 httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.2.100. Set the 'ServerName' directive globally to suppress this message
[Thu Sep 02 07:14:02.675979 2021] [mpm_event:notice] [pid 1:tid 139638144578688] AH00489: Apache/2.4.48 (Unix) configured -- resuming normal operations
[Thu Sep 02 07:14:02.677259 2021] [core:notice] [pid 1:tid 139638144578688] AH00094: Command line: 'httpd -D FOREGROUND'
無事立ち上がりましたね。WSL2の機能により動かしてもWindowsのブラウザ等でシームレスにlocalhostでアクセスすることが出来ます。上手くいかない場合は$USER/.wslconfig
にlocalhostForwarding=True
が含まれているかを確認してください。
なお、rootlessモードで動かしてるので特権ポートは権限エラーになります。
❯ podman run -it --rm -p 80:80 httpd
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied
上記のブログにはprivileged userで動かす方法も記載があるので、そちらを設定すれば問題なく動作すると思われます。(未検証)
自分はDocker Desktopの機能は基本使ってないしk8sも動かすならクラウド側でやるので、最近調子悪かったから自分は個人用途をこちらに切り替えるかもです。基本的にコマンドの互換性はあるようだし、aliasとか変えて置けばいいかも?
Mac: Lima + nerdctl (containerd)
さて次はMacです。こちらもPodmanでも入れるか。。。と言いたいところなのですがMacの場合はWindowsのWSL2に相当する機能は無いので、まずLinuxを動かす必要があります。
Docker for ToolboxのようにVirtualboxをvagrant当たりで動かしても良いのですが、どうやら、MacでWSL2のようにLinuxを動かすLimaというプロジェクトがあるようなのでそちらを入れてみました。
以下のようにbrew
でlima
をインストールします。
$ brew install lima
続いて以下のコマンドでlimaを立ち上げます。
$ limactl start
こちらの実行結構かかって何故か私のMacBookだと処理が途中で止まったので3回くらい再実行しました。
無事にデーモンの起動が完了したら以下のようにlimaコマンドで動作を確認できます。
$ lima uname -a
Linux lima-default 5.11.0-31-generic #33-Ubuntu SMP Wed Aug 11 13:19:04 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
ちなみにlima
コマンドを直接打つとVMにダイレクトにログインできるようです。
$ lima
> koduki@lima-default:/$
さて、それではここからPodmanをインストールしよう! という話なのですが朗報です。元々、lima自体がMacでcontainerdを動かすことをモチベーションとして作られているらしくcontainerdのCLIであるnerdctlが組込まれています。なので以下のようにコンテナのbuildや実行が出来ます。
$ lima nerdctl build -t foo/bar .
$ lima nerdctl run -it alpine
$ lima nerdctl run -it 8080:80 httpd
正直、lima自体の完成度の程は良く分からないのですがnerdctlはcontainedをベースにしているという事なのでPodmanよりはDockerとの互換性は良さそうな気がします。
では、Docker Desktopはいらないのか?
Docker Desktopの機能をあまり使ってなかった人は上記の方法等で置き換えれる可能性はあります。
ただ、docker composeは上手く動くのか? とか、その他の連携を考えると余計な苦労や検証が必要になりそうなので、ガッツリ業務で使っているような体制であればシンプルに支払ってしまった方が良いと思います。特に、M1 Macを使ってる場合はlimaでx86イメージの実行とかまでサポートしてるか分からないですし、今後1年でどうなるかは分かりませんが成熟したりノウハウが溜まるとより良い選択肢になるかもです。
もう1点、$5のProを利用した場合でもprivateリポジトリやCI/CD機能が、$7のTeamであればユーザ管理機能や監査機能も付くようなので、おそらく別製品で実現しているそのあたりの機能を置き換えればコスト的に 「追加になる」 という感じでも無い気がします。
BusinessはSAML SSOが付いたりセキュリティ周りが強化されてエンタープライズグレードって感じがするのですが$21といっきに高くなるので既存のprivate レポジトリやCI/CDを置き換えることを実施出来ないと少し割高に感じそうですね。
まとめ
今回の有料化の件は、Docker社にはDockerというかコンテナがここまで広まったのにビジネス的には成功出来てない不遇の位置にいるので、きちんとこういう方法で儲けて欲しいという気持ちと、今までは無料で使えてたものが有料になると困る、という二つの気持ちがぶつかり合っています。正直。
上手くprivateリポジトリやCI/CD周りを移行してTeamやBusinessで契約するのがモヤっとしなくて良いですね。privateリポジトリ等のためにお金を払うのは違和感は全くないので。
それに競合があるのは基本的には良い事なので、今回の事を起点として今日紹介したツールや他のツールが今後成熟して来ると面白くはありますねー。
それではHappy Hacking!
Discussion
macOSではPodman v3.2以降で使えるサブコマンド
podman machine
があります。Limaと同様にQEMUで立ち上げたVMにリモート接続してmacOS上からPodmanコマンドが使用できます。簡単なコマンドでVMを立ち上げることができるので、よければこちらもお試しください。
おー、なるほどですね! VitrualBox とかを別途入れるのが必須だと勘違いしてました。確かに参照した記事もそうしてますね。ありがとうございます!