今更ながら WSL2 の Alpine で Docker 環境構築2
の続きのになります.
Remote - Containers
に向けて
VS Code の試していませんが,おそらく VS Code の Remote - Containers
で接続するには,Remote - WSL
を介して接続するのだと思います.
Docker Client を Windows で動かし,Alipne の Docker Server に接続すると, Remote - Containers
から直接接続できます.
0. 下準備
Docker Client を Windows にインストールします.
-
スタートメニューから 環境変数 と入力して検索して,
環境変数の編集
をクリックします.間違って、システムの環境変数の編集 を選択しないように注意します. -
ignorant のユーザー環境変数(U)
のPath
を選択して 編集 をクリックします(ignorant はユーザ名). -
新規 → 参照 から
Path
を追加するフォルダを選択します(ここでは,C:\Programs\bin
にしています).マルチバイト文字(日本語など),空白,記号などは含まないように注意します.また,数字で始まるフォルダ・ファイル名は,トラブルの元になるので避けるのが無難です. -
Index of win/static/stable/x86_64/ から最新版をダウンロードします.今回ダウンロードしたのは,
docker-20.10.17.zip
になっていました. -
ダウンロードした
docker-20.10.17.zip
を解凍して出てきた,docker.exe
をC:\Programs\bin
にコピーします. -
PowerShell
からdocker
と入力してコマンドが実行できることを確認します.下記のような表示がされた場合は,Path
の設定が間違っているかもしれません。
PS C:\> docker
docker: The term 'docker' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
1. Docker Client と Docker Server との接続
今回は,下記に 2 つの方法で接続します.
- TCP を使用します.セキュリティは皆無ですがお手軽に接続できます.
- SSH を使用します.多少面倒です.
1.1. TCP を用いての接続
- Alpine 上で作業します.
# daemon.json を作成
sudo vi /etc/docker/daemon.json
# Docker デーモンの再起動
sudo rc-service docker restart
{
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}
- PowerShell で動作を確認(Windows)
docker -H tcp://127.0.0.1:2375 version
Client: の OS/Arch:
が windows,Server: の OS/Arch:
が linux になっているのを確認します.
TCP で接続する場合は,Docker Context に進みます.
1.2. SSH を用いての接続
- Alpine で作業します.
プロキシ環境
前回の記事で,/etc/profile.d/proxy.sh
の設定が終わっているので,ログイン時にプロキシの設定を読み込んでくれます.
しかし,sudo
のときは,環境変数が引き継がれないため,apk
など外部と通信するときには,sudo -E apk update
のように -E
を付けます.
# OpenSSH のインストール
sudo -E apk add --no-cache openssh
# OpenSSH のインストール
sudo apk add --no-cache openssh
# SSH デーモンの設定変更
sudo vi /etc/ssh/sshd_config
PasswordAuthentication no
# SSH デーモンの起動
sudo rc-update add sshd
sudo rc-service sshd start
# 起動しているサービスの確認
rc-status
- Windows で ssh の鍵を生成
Remote - Containers
と接続するのに,ssh-agent
が要求されるので,パスフレーズを設定します.ssh-agent
に覚えさすので,普段使用しない適当なパスフレーズにします.
- PowerShell で作業します.
# %USERPROFILE% に移動 (cd で移動しなければ,cd $USERPROFILE)
cd
# .ssh フォルダの作成と移動
mkdir .ssh
cd .ssh
# SSH 鍵の生成
ssh-keygen.exe -t ed25519 -C 'docker' -f id_ed25519_docker
# config ファイルの作成(VS Code を使用)
code config
HOST localhost
Port 22
IdentityFile ~/.ssh/id_ed25519_docker
ServerAliveInterval 60
- Alpine で作業します.
生成した公開鍵を Alpine
にもっていきます.
# ホームディレクトリに移動
cd
# .ssh ディレクトリの作成
mkdir ~/.ssh
chmod 700 ~/.ssh
# 公開鍵の転送
cd ~/ssh
cat /mnt/c/Users/ignorant/.ssh/id_ed25519_dockerd.pub >> ~/.ssh/authorized_keys # ignorant は Windows のアカウント名
chmod 600 authorized_keys
- PowerShell で作業します.
SSH の接続テストを行います
ssh ignorant@localhost # ignorant は Alpine のユーザ名
ssh-agent の設定
- PowerShell で作業します.
Windows の OpenSSH の ssh-agent
を起動します.
Setting up the SSH Agent の手順で行います.
管理者権限の PowerShell
で作業します.
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
管理者権限の PowerShell
は必要ないので閉じておきます.
秘密鍵の登録を行います.
PowerShell
で作業します.
# %USERPROFILE% に移動
cd
# 秘密鍵の登録
ssh-add .ssh\id_ed25519_docker
# 登録された鍵の確認
ssh-add -l
# ssh の接続テスト(パスフレーズなしで接続)
ssh ignorant@localhost
Git が使用する SSH を Windows の OpenSSH を使用するように変更します.
- Git Bash で作業します
git config --global core.sshCommand "\"C:\\Windows\\System32\\OpenSSH\\ssh.exe\""
Git Bash の SSH
Git Bash(Git for Windows) の SSH から Windows の OpenSSH を使用するように変更します.
- Git Bash で作業します
.bashrc
で PATH の設定を追加する.Windows の OpenSSH を使用するので,~/.ssh
でなく %USERPROFILE%\.ssh
を使用することになるので注意が必要です.
vi ~/.bashrc
# PATH の登録
export PATH=/c/WINDOWS/System32/OpenSSH:$PATH
# 重複する PATH の削除
export PATH=$(printf %s "$PATH" | awk -v RS=: '!arr[$0]++' | paste -s -d :)
Git Bash を閉じて,再度立ち上げる.
# PATH の確認
echo -e ${PATH//:/\\n}
/c/WINDOWS/System32/OpenSSH
が /usr/bin
より上にあるのを確認する.
- PowerShell で動作を確認(Windows)
docker -H ssh://ignorant@localhost version
2. Docker Context
コンテキストを切り替えて,docker
コマンド実行時の -H ssh://ignorant@localhost
などの入力を省略します.
PowerShell
で作業します.
# TCP で接続
docker context create alpine-tcp --docker host=tcp://127.0.0.1:2375 --default-stack-orchestrator=swarm
# SSH で接続
docker context create alpine-ssh --docker host=ssh://ignorant@localhost --default-stack-orchestrator=swarm
# context の確認
docker context ls
# context の切り替え(TCP)
docker context use alpine-tcp
# server との接続確認
docker version
# context の切り替え(SSH)
docker context use alpine-ssh
# server との接続確認
docker version
--default-stack-orchestrator=swarm
は,default
の設定にあるので指定しいますが,Swarm
を使わなけらばいらないと思います.
VS Code の拡張機能 Docker
が動作すると思います.
3. VS Code Remote - Containers
VS Code の拡張機能 Remote - Containers
の設定が少し必要になります.
-
VS Code の拡張機能
Remote - Containers
をインストールします.
(SSH,WSL,Containers のセットになったRemote Development
でも構いません. -
拡張機能にある
Remote - Containers
の歯車から,拡張機能の設定を選択します. -
Remote > Containers: Execute In WSL
にチェックを入れる. -
Remote > Containers: Execute In WSLDistro
にAlpine
と入力する.
3.1 VS Code Remote - Containers の動作確認
適当な場所に Test
フォルダを作り その中に Dockerfile
を作成します.
FROM alpine
-
VS Code で
Test
フォルダを開きます. -
左下のリモートホストをクリックして,
Reopen in Container
をクリックして,次にFrom 'Dockerfile'
を選択します. -
左下のリモートホストが
Dev Container: Existing Dockerfile
と表示されます.
4. さいごに
適当に遊んでみます.上記の動作確認しかしていないので,不具合があるかもしれません. 試して見る方は,ご了承願います.
Discussion