概要
公式で配布されているDDW(Docker Desktop for Windows)・DTB(Docker ToolBox on windows)、そしてDocker対応のWSL2も使わず、
WindowsのVSCodeからDockerプラグイン、Remote - Containersプラグインを使ってコンテナ操作をするためのメモです。
Linux側の設定
まず、Linux側で外部のDockerクライアントの要求に対応できるようにしないと使えませんので設定しておく必要があります。
/etc/docker/daemon.jsonで以下のように設定します。ファイルが存在しなければ新規に作成します。2375の部分は任意のポート番号に設定できます
{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}
Docker本体にはユーザー制御的なものは存在しないようなので、ファイアウォールや接続ipの限定でアクセス制限をしないと外部からやりたい放題されるリスクがあります。
同一マシンの仮想PCの場合、通常はWindowsファイアウォールで許可しない限りは外部から接続できませんが、不安なら仮想化ソフトのポートフォワーディング設定でホスト側の対象のアドレスをlocalhostに制限すれば外部からの接続を遮断できます。
Docker CLI / Docker-Composeのダウンロード
Windows側にDocker CLI、Docker-Composeをダウンロードします。
Docker CLIは公式では自身でビルドする必要があるようなので、面倒ならビルド済みバイナリを公開している人がいるのでそこからdocker.exeをダウンロードします
Docker-Composeは公式でバイナリ配布されているので、そこからdocker-compose-Windows-x86_64.exeをダウンロードしてdocker-compose.exeにリネームしておきます。
コマンドラインから使ってみる
ダウンロード(ビルド)したdocker.exe、docker-compose.exeがあるフォルダにパスを通します。
DOCKER_HOST環境変数で接続先のDockerのアドレスとポートを設定します。同一マシン内の仮想PCのDockerに接続する場合は次のようにします。
set DOCKER_HOST=localhost:2375
設定に問題なければこれで使えるようになっているはずです。docker ps
してみたりdocker run hello-world
してみたりしてください。
VSCodeのDockerプラグインを使う
Linux側のDockerが起動しており、PATHとDOCKER_HOST環境変数が適切に設定されていればプラグインをインストールするだけで使えるようになるはずです。
バッチファイルやWindowsの設定で環境変数を設定せず、VSCode内で完結させたい場合は前項のDOCKER_HOSTと同じ内容(localhost:2375)をVSCode設定のdocker.hostに、Docker.exeがあるフォルダをterminal.integrated.env.windowsに設定しておきます。
VSCodeのRemote - Containersプラグインを使う
Remote - Containersプラグインはどうもdocker.exeにパスが通っていても実行しないようなので、remote.containers.dockerPathにdocker.exeのフルパスを設定する必要があります。
Dockerプラグインが正常に動作している場合は設定されているはずですが、使わない場合はDOCKER_HOST環境変数またはVSCode設定のdocker.hostに接続先のアドレスとポートを指定しておく必要があります。
感想
今のところ個人的にはWindowsからDocker環境を整えるメリットはVSCodeのRemote - ContainersプラグインでWindowsからリモートコンテナ開発ができることくらいだと思います。
コマンドラインはSSH接続で直接Linuxから実行すればいいわけですし、GUIツールも特別必要な機能がなければ導入がdockerコマンド2行で済みWebブラウザで操作できるportainerなんかで十分だと思います。
コンテナにSSHサーバーを入れてSSH接続できるようにすればRemote - SSHプラグインで同じことができるのですが、リモート開発したいコンテナが複数に渡ると対象のコンテナ全てにSSHサーバーを入れてポートを割り当てないといけないのでSSHサーバーを都度コンテナに導入する手間とWindowsにDocker環境を整える手間のどっちが少ないかの問題になるんじゃないかと思います。