【Docker Desktopの代替】Docker Daemonを自分で立ててみた

みなさんご存知だとは思うのですが、Docker Desktopが有料化されるようですね。

www.itmedia.co.jp

そこで代替できるツールがないか調べてみたところ・・・

など、色々候補が上がりましたが、結局やりたいことってdockerデーモンの代替をどこに立てるか?ということだけなんだよな・・・と思い、今回はシンプルに自分で立ててみました。

ちなみに、Docker Machine は非推奨、hyperkit + minikube はマウントしたファイルの書き込み・読み込みが遅く、私が使っているアプリケーションでは実用に耐えられるレベルではありませんでした。

Podmanlima + docker はまだ検証してません。

今回実現したいこと

  • dockerコマンドでdockerの一通りの操作ができること
  • Docker Composeが使えること
  • 開発しているWebアプリケーション(Ruby, PHP)が設定変更なしにそのまま動作すること(権限周りなどは除く)

構成

ひとまず手元にあってシュッと使えそうなVagrantVirtualbox)を使いました。

設定

  • Vagrantfile

Dockerデーモンの乗ったサーバを作る

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-20.10"
  config.vm.box_version = "202103.19.0"

  config.vm.network "private_network", ip: "192.168.56.100"
  
  config.vm.provision "file", source: "./override.conf", destination: "/tmp/override.conf"

  repo_names.each do |repo_name|
    config.vm.synced_folder "#{ENV['HOME']}", "#{ENV['HOME']}",create:"true"
  end


  config.vm.provision "shell", inline: <<-SHELL
    apt update
    apt -y upgrade

    apt install -y docker.io

    mkdir -p /etc/systemd/system/docker.service.d/
    cp /tmp/override.conf /etc/systemd/system/docker.service.d/override.conf

    systemctl daemon-reload
    systemctl restart docker.service
  SHELL
end
  • override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://192.168.56.100:2375 --tls=false
  • Dockerデーモンへのアクセス

環境変数 DOCKER_HOST にDockerデーモンの乗っているサーバのIPアドレスを指定すると使えるようになります。

export DOCKER_HOST="tcp://192.168.56.100:2375"

常時使う際は、これを .bash_profile などに設定しておくと良いかと思います。

設定のポイント

dockerクライアントとTCPで疎通させる

デフォルトではSocketを使った通信となりますが、起動時の設定を変えることでTCPでのやりとりができるようになります。

設定方法は次の項目で

Systemdの設定をオーバーライドした

/etc/systemd/system/docker.service.d/ 以下に設定でファイルを置くとsystemdの設定を上書きすることができます。 今回はTCPで起動したかったので、ExecStart=/usr/bin/dockerd -H tcp://192.168.56.100:2375 --tls=false で上書きしました。

TLSは今回はfalseにしていますが、必要に応じて設定すると良いかと思います。

ホスト側と同じディレクトリ構成でVMマウントした

Dockerマウントが必要なディレクトリについてはMacVMとで同じディレクトリ構成でマウントすることで、ホスト側のファイルが直接Dockerマウントされているように見せています。

使ってみた所感

Docker Desktopより速い

これまでDocker Desktopで立ち上げていたWebアプリケーションで試してみましたが、 今までより動きが速くなったことが体感レベルで感じられました。Docker Desktopはマウント周りが遅めなようなので、それが要因な気がします。

※アプリケーションのソースコードをマウントして使っていました。

パーミッションの設定を見直す必要がある

Docker Desktopはマウントしたファイルのパーミッションををいい感じにホスト側に合わせてくれます。 今回試したアプリケーションはDocker Desktop前提で作られており、アプリケーションから書き込みする権限がなかったので、適宜パーミッションの変更や空ボリュームを設定するなどの対応が必要でした。

ただ、NativeなDockerと同じ挙動となるので、個人的にはこれで良いかと。

まとめ

ファイルマウントやパーミッションについてはやや設定が面倒になりましたが、十分実用できそうで個人的には合格レベルでした。 もっと良い方法などあれば教えてください。

参考

MacでDocker Desktopを入れずにDocker CLI+Multipassで代替してみる

GitHub - 1021ky/self_dockermachine: 自前のdocker serverをVagrant+VirtualBoxで構築する