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エージェントの実行が必要です。

設定

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_DEVCONTAINER_PATH=/vagrant/.devcontainer/
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をコピーしました