Visual Studio Code Remote Container Docker on Vagrant

コンピュータ
コンピュータ

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-clidocker-composeをローカルにインストールする必要があります。
Docker Desktop がインストールされていれば単体でインストールは不要です。

Windows の場合、Chocolatey という Window 用のパッケージマネージャを使うと、docker-clidocker-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をインストールすることによりエラーを回避できます。

コメント

タイトルとURLをコピーしました