最近、Docker Desktop for Linux を使ってみました。あまりきちんと見てませんが、Install Docker Desktop on Linux | Docker Documentation によると、専用の Virtual Machine を用意して動作させるようです。
System requirements に「KVM virtualization support.」が記載されているので、ハードウェア的には少しハードルが高いのと、設定も少し面倒な印象があります。CPU に i5 とか i7 を使っているなら大したことはありませんけど。KVM が必要ない分、Docker Engine の方が何かと応用性が高そうです。
ちなみに、Ubuntu 22.04 を使っているときは、cpu-checker パッケージをインストールすると kvm-ok コマンドが使えます。これで KVM が有効になっているか確認できます。
$ sudo apt -y install cpu-checker $ kvm-ok INFO: /dev/kvm exists KVM acceleration can be used
FAQs for Linux | Docker Documentation は一度読んでおくと良いでしょう。
Docker Desktop は、Systemd 対応していて、user 用の systemd 設定にエントリーされています。最初、その設定がどこにあるのかわからなかったのですが、dpkg -L コマンドで謎が解けました。
$ dpkg -L docker-desktop (略) /usr/lib/systemd/user/docker-desktop.service (略) /usr/share/applications/docker-desktop-uri-handler.desktop /usr/share/applications/docker-desktop.desktop
/usr/lib/systemd/user/docker-desktop.service に設定ファイルがあります。また、デスクトップ用のランチャー用に、/usr/share/applications/docker-desktop.desktop に設定ファイルがあります。
/usr/lib/systemd/user/docker-desktop.service の内容は次の通り。
$ cat /usr/lib/systemd/user/docker-desktop.service [Unit] Description=Docker Desktop Requires=graphical-session.target After=graphical-session.target [Service] ExecStart=/opt/docker-desktop/bin/com.docker.backend Type=exec TimeoutSec=60 [Install] Alias=docker-desktop.service WantedBy=graphical-session.target
もともとは、インストール済みの Docker Engine に対して Docker Desktop から接続する方法を調べていたのですが、起動時に使用する Docker Engine を指定することはできないようでした。Docker Desktop の拡張機能が結構便利なので、使いたかったのですが、Portainer: Docker and Kubernetes Management Platform を使うのが良さそうでした。ちなみに、単独で Portainer を用意するより、Docker Desktop の拡張機能にある Portainer を使ったほうが手軽です。
ローカルマシンの Docker Engine へ接続するには、portainer-agent イメージを使います。portainer/agent – Docker Image | Docker Hub に Docker イメージがあるので、これを使うと簡単です。
DOCKER_HOST=unix:///var/run/docker.sock \ docker container run -d \ -p 9001:9001 \ --name portainer_agent \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/lib/docker/volumes:/var/lib/docker/volumes \ portainer/agent:2.18.4
これを起動した状態で、Docker Desktop の Portainer の Environment へ localhost:9001 の環境を追加すれば、ローカルマシンの Docker Engine に接続ができます。ちなみに、シェルの docker context を default にしてある場合は、DOCKER_HOST=unix:///var/run/docker.sock の指定は不要です。
$ docker context use default $ docker container run -d \ -p 9001:9001 \ --name portainer_agent \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/lib/docker/volumes:/var/lib/docker/volumes \ portainer/agent:2.18.4
一応、推奨では Docker Desktop を動作させている場合は、リソースの競合などが起きないように、Docker Engine の方は停止しておいた方が良いようですが、こういった方法で両方とも利用することはできます。
ちなみに、停止時は次のようにします。起動時に `–restart=always` を指定しているので、起動時に `–rm` の指定ができません。なので、停止した後に削除する手順になります。
DOCKER_HOST=unix:///var/run/docker.sock \ docker container stop portainer_agent until DOCKER_HOST=unix:///var/run/docker.sock \ docker container ls -a --filter name=portainer_agent | grep Exited; do >&2 echo "portainer_agent is available - sleeping" sleep 5 done DOCKER_HOST=unix:///var/run/docker.sock \ docker container rm portainer_agent