VS Code(Visual Studio Code)の Remote - Containers でのコンテナ環境は Docker Desktop を使うのが一般的だと思いますが、リモートの Docker ホストに接続することも可能です。
ここでは、Docker Desktop を使わずに、VirtualBox + Vagrant の環境に Docker をインストールして、Remote - Containers を使用する方法を解説します。
Windows で WSL2 を使用している場合、Vagrant が正しく動かないので無効にする必要があります。
Windows の機能の有効化または無効化の「仮想マシン プラットフォーム」のチェックを外して再起動を行うと WSL2 は無効になります。
Remote Container Docker on Vagrant
準備
ローカルに必要なアプリケーションは以下になります。
- VirtualBox
- Vagrant
- docker-cli
- docker-compose
リモートの Docker ホストを操作する場合、Docker Desktop は不要ですがdocker-cli
とdocker-compose
をローカルにインストールする必要があります。
Docker Desktop がインストールされていれば単体でインストールは不要です。
Windows の場合、Chocolatey という Window 用のパッケージマネージャを使うと、docker-cli
とdocker-compose
の単体インストールが容易にできます。
-
Chocolatey
https://chocolatey.org/ -
インストール例
PS> choco install -y virtualbox vagrant vscode docker-cli docker-compose
※インストール後は再起動
あと、SSH エージェントの実行が必要です。
ssh-agent
ssh-agent 起動
管理者権限で PowerShell を起動。
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
設定
Vagrant で Docker の環境を構築します。
mkdir docker
cd docker
Vagrant Plugin をインストール。
vagrant plugin install vagrant-vbguest
vagrant plugin install dotenv
vagrant plugin install vagrant-hostmanager
vagrant plugin install vagrant-docker-compose
## VAGRANT
VAGRANT_HOST="docker.test"
Dotenv.load
Vagrant.configure(2) do |config|
config.vm.box = "debian/buster64"
config.vm.provider :virtualbox do |v|
v.memory = 2048
v.cpus = 2
v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root","1"]
end
config.vm.network "private_network", type: "dhcp", ip: "192.168.33.0"
config.vm.hostname = ENV['VAGRANT_HOST']
config.hostmanager.enabled = true
config.hostmanager.manage_host = true
config.hostmanager.ip_resolver = proc do |vm, resolving_vm|
ip_address = ''
if hostname = (vm.ssh_info && vm.ssh_info[:host])
vm.communicate.execute("/bin/ip addr show dev eth1 | grep 'inet ' | tail -n 1 | egrep -o '[0-9\.]+' | head -n 1 2>&1") do |type, contents|
ip_address = contents.split("\n").first
end
end
ip_address
end
config.vm.synced_folder ".", "/vagrant", type:"virtualbox", create: true
config.vm.provision :docker
config.vm.provision :docker_compose
# Docker SSH Connection
config.vm.provision "shell", privileged: true, inline: <<-SHELL
sed -i -e 's|^#\\?MaxSessions.*|MaxSessions 100|' /etc/ssh/sshd_config
/etc/init.d/ssh restart
SHELL
end
プラグインvagrant-docker-compose
でホストに Docker と Docker Compose をインストールします。
プラグインdotenv
で.env
に設定したホスト名を設定します。
DHCP で動的に IP アドレス割り当てるようにします。
プラグインvagrant-hostmanager
の機能を使い、動的に割り当てられた IP アドレスにホスト名でアクセスできるようにします。
※SSH 経由で Docker ホストを操作するのですが、操作するコンテナ数が多くなると、SSH のセッションが足りなくなるので、SSH の設定を変更しています。
Vagrant を起動します。
vagrant up
起動後、SSH でのログイン設定を行います。
鍵が RSA だとつながらないので ECDSA or ED25519 を使います。
ssh-keygen -t ed25519 -C ""
cp ~/.ssh/id_ed25519.pub ./
vagrant ssh
> cat /vagrant/id_ed25519.pub >> ~/.ssh/authorized_keys
> rm /vagrant/id_ed25519.pub
> exit
ssh-keygen -R docker.test
ssh-keyscan -H docker.test >> ~/.ssh/known_hosts
ssh vagrant@docker.test
> exit
SSH キーを ssh-agent に追加します。
ssh-add ~/.ssh/id_ed25519
VS Code に Docker ホストの場所を設定します。
{
"docker.host": "ssh://vagrant@docker.test",
}
これで Remote - Containers から Vagrant 上の Docker との接続が可能になります。
これを参考に、外部のリモートの Docker を操作することも可能です。
SSHでの接続設定は自分の環境に合わせて設定してください。
注意点として、
・鍵にRSAを使用しない。
・docker.host に鍵認証で接続できるようにする。(known_hosts登録済みにする)
Tips
Tips1
リモートの Docker ホストを使用する場合、ローカルとコンテナのファイルを共有することはできませんが、Vagrant を使用している場合は間接的に共有可能です。
ローカル ←→ Vagrant ←→ コンテナ
Compose ファイルで volumes に相対パスを指定をすると、ローカルのパスが渡されてしまい正しく動作しないのですが、絶対パスを渡すと Docker ホスト(Vagrant)のパスを指定することになります。
Vagrant の共有が以下の場合・・・
config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
Docker Compose は以下にするとプロジェクトルートが共有されます。
/vagrant:/var/www
.env
に Vagrant のパスを設定しておけば、下記のように設定できるので、Docker Desktop と Vagrant をどちらを使っても対応できる環境の構築が可能です。
VAGRANT_DEVCONTAINER_PATH=/vagrant/.devcontainer/
volumes:
- ${VAGRANT_DEVCONTAINER_PATH}../:/var/www
※Compose ファイルが.devcontainer
にある場合。
※Docker Desktop を使う場合は、.env
のパスを空に。
Vagrant を使う場合は、.env
のパスを設定。
Tips2
Remote - WSL
(WSL1)からRemote Container
を立ち上げる場合、エラーになりますが、WSL 側にdocker-cli
をインストールすることによりエラーを回避できます。
コメント