触ってみたかったので導入して動作するところまでやってみます。
podmanってなに?
Podman(Pod Manager)とは、docker互換のコンテナエンジンです。コマンドがdockerと置き換わるだけでほぼ同じように利用することができます。
名前のとおりPodを管理するのでKubernetesのyamlなどもそのまま使える。
とはいえ、podmanはpodman、dockerはdocker、kubernetesはkubernetesというツールとしてみるのがよいかも。
今回はmacos上で利用できるようにしてみます。
準備
macはまだアップグレードしていないので、M1ではなくてIntelのBig Sur(11.6)になります。
$ brew install podman
同時にQEMUもインストールされています。
$ podman -v
podman version 3.4.0
VMのダウンロード
$ podman machine init
Downloading VM image: fedora-coreos-34.20211004.2.0-qemu.x86_64.qcow2.xz
Fedora CoreOSは、CoreOSが手掛けていたコンテナ向けOSをRed Hatが買収し、Fedoraと統合して登場したOSです。
cpu、メモリ等のサイズを変更するにはオプションを指定することもできます。
$ podman machine init --cpus 2 --memory 2048 --disk-size 30
podman起動
$ podman machine start
podman起動確認
$ podman machine ls
NAME VM TYPE CREATED LAST UP CPUS MEMORY DISK SIZE
podman-machine-default* qemu 5 minutes ago Currently running 1 2.147GB 10.74GB
VMなのでsshすることもできます。
$ podman machine ssh
[core@localhost ~]$
試す
簡単なコンテナを実行してみます。
$ podman run -it -p 8080:80 nginx:alpine
chromeでhttp://localhost:8080
にアクセス
Welcome to nginx!
...
自動でポートフォワードされているのでそのままブラウザでアクセスできました。
もし以下のようなエラーが発生した場合、
Error: failed to parse "X-Registry-Auth" header for...
~/.docker/config.jsonの
"auths" : {
"https://index.docker.io/v1/" : { }
を
"auths" : {
"index.docker.io/v1/" : { }
と書き換えます。
$ podman run -it --rm hello-world
Hello from Docker!
...
普通に動作できていますね。
コマンドをalias docker=podman
のようにして、もともとのdockerコマンドを置き換えても大丈夫のようです。
docker-composeを試す
docker-composeは内部でdockerを使っているのでコマンドのエイリアスとDOCKER_HOSTを設定すればそのままいけそう。
podman-composeというツールがあるのですが、そちらは利用しません。
$ podman system connection list
Name Identity URI
podman-machine-default* /Users/develop/.ssh/podman-machine-default ssh://core@localhost:65228/run/user/1000/podman/podman.sock
podman-machine-default-root /Users/develop/.ssh/podman-machine-default ssh://root@localhost:65228/run/podman/podman.sock
# linuxなら
$ export DOCKER_HOST=unix:/run/podman/podman.sock
# macosなら
$ export DOCKER_HOST=ssh://root@localhost:65228/run/podman/podman.sock
sshの部分は.ssh/configに記述してexportしてもよさそう。
$vi .ssh/config
Host podman
HostName localhost
Port 65228
User core
IdentityFile /Users/develop/.ssh/podman-machine-default
$ export DOCKER_HOST=ssh://podman
pod機能を試す
$ podman pod create -p 8080:80 --name sample-pod
$ podman run -d --pod sample-pod -e POSTGRES_PASSWORD=mysecretpassword postgres
$ podman run -d --pod sample-pod nginx
$ podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
1991381b0088 sample-pod Running 8 minutes ago 1c3c2bffa37c 3
$ podman ps --pod
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME
1c3c2bffa37c k8s.gcr.io/pause:3.5 9 minutes ago Up About a minute ago 0.0.0.0:8080->80/tcp 1991381b0088-infra 1991381b0088 sample-pod
e370977bd0c0 docker.io/library/postgres:latest postgres About a minute ago Up About a minute ago 0.0.0.0:8080->80/tcp compassionate_leavitt 1991381b0088 sample-pod
e4e48dba870e docker.io/library/nginx:alpine nginx -g daemon o... About a minute ago Up About a minute ago 0.0.0.0:8080->80/tcp lucid_jemison 1991381b0088 sample-pod
# 構成をYAMLに出力
$ podman generate kube sample-pod > sample-pod.yaml
# podの停止
$ podman pod stop sample-pod
# podの起動
$ podman pod start sample-pod
# podの削除
$ podman pod rm sample-pod
# kubeのyamlから作成・起動
$ podman play kube sample-pod.yaml
ひととおり動作できています。
最後に
手元のすべての開発環境を入れ替えるには少し時間がかかりそうな気がしています。
もともとdocker for macのvolume周りの問題があって代替となりそうな環境を探していたのですが、QEMUのVM上とVagrantでdockerするのもそれほど変わらないので、docker for macが重いよ〜という方は試してみてもいいかなと思います。
ちなみに導入難易度はVagrantにdockerを導入するほうが楽です。