Docker Desktop for Linux を使ってみたときに少し調べたこと

最近、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
同じタグの記事: Docker
同じタグの記事: Docker Desktop
同じタグの記事: Linux
同じカテゴリの記事: Linux