【Docker Desktopの代替】Docker Daemonを自分で立ててみた
みなさんご存知だとは思うのですが、Docker Desktopが有料化されるようですね。
そこで代替できるツールがないか調べてみたところ・・・
など、色々候補が上がりましたが、結局やりたいことってdockerデーモンの代替をどこに立てるか?ということだけなんだよな・・・と思い、今回はシンプルに自分で立ててみました。
ちなみに、Docker Machine
は非推奨、hyperkit + minikube
はマウントしたファイルの書き込み・読み込みが遅く、私が使っているアプリケーションでは実用に耐えられるレベルではありませんでした。
Podman
、lima + docker
はまだ検証してません。
今回実現したいこと
- dockerコマンドでdockerの一通りの操作ができること
- Docker Composeが使えること
- 開発しているWebアプリケーション(Ruby, PHP)が設定変更なしにそのまま動作すること(権限周りなどは除く)
構成
ひとまず手元にあってシュッと使えそうなVagrant(Virtualbox)を使いました。
- ホストOS: MacOS
- ゲストOS: Ubuntu 20.10
- VM: Vagrant(Virtualbox)
設定
- 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マウントが必要なディレクトリについてはMacとVMとで同じディレクトリ構成でマウントすることで、ホスト側のファイルが直接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で構築する