今更ながら WSL2 の Alpine で Docker 環境構築2
の続きのになります.
VS Code のRemote - Containers に向けて
試していませんが,おそらく 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