📝

今更ながら WSL2 の Alpine で Docker 環境構築2

2022/06/27に公開

https://zenn.dev/ignorant/articles/wsl2_alpine_docker

の続きのになります.

VS Code のRemote - Containers に向けて

試していませんが,おそらく VS Code の Remote - Containers で接続するには,Remote - WSL を介して接続するのだと思います.
Docker Client を Windows で動かし,Alipne の Docker Server に接続すると, Remote - Containers から直接接続できます.

0. 下準備

Docker Client を Windows にインストールします.

  1. スタートメニューから 環境変数 と入力して検索して,環境変数の編集 をクリックします.間違って、システムの環境変数の編集 を選択しないように注意します.

  2. ignorant のユーザー環境変数(U)Pathを選択して 編集 をクリックします(ignorant はユーザ名).

  3. 新規参照 から Path を追加するフォルダを選択します(ここでは,C:\Programs\bin にしています).マルチバイト文字(日本語など),空白,記号などは含まないように注意します.また,数字で始まるフォルダ・ファイル名は,トラブルの元になるので避けるのが無難です.

  4. Index of win/static/stable/x86_64/ から最新版をダウンロードします.今回ダウンロードしたのは,docker-20.10.17.zip になっていました.

  5. ダウンロードした docker-20.10.17.zip を解凍して出てきた,docker.exeC:\Programs\bin にコピーします.

  6. 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 つの方法で接続します.

  1. TCP を使用します.セキュリティは皆無ですがお手軽に接続できます.
  2. SSH を使用します.多少面倒です.

1.1. TCP を用いての接続

  1. Alpine 上で作業します.
# daemon.json を作成
sudo vi /etc/docker/daemon.json
# Docker デーモンの再起動
sudo rc-service docker restart
daemon.json
{
  "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}
  1. 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 を用いての接続

  1. 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
sshd_config
PasswordAuthentication no
# SSH デーモンの起動
sudo rc-update add sshd
sudo rc-service sshd start
# 起動しているサービスの確認
rc-status
  1. 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
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 の OpenSSHssh-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 で作業します

.bashrcPATH の設定を追加する.Windows の OpenSSH を使用するので,~/.ssh でなく %USERPROFILE%\.ssh を使用することになるので注意が必要です.

vi ~/.bashrc
.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 より上にあるのを確認する.

  1. 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 の設定が少し必要になります.

  1. VS Code の拡張機能 Remote - Containers をインストールします.
    (SSH,WSL,Containers のセットになった Remote Development でも構いません.

  2. 拡張機能にある Remote - Containers の歯車から,拡張機能の設定を選択します.

  3. Remote > Containers: Execute In WSL にチェックを入れる.

  4. Remote > Containers: Execute In WSLDistroAlpine と入力する.

3.1 VS Code Remote - Containers の動作確認

適当な場所に Test フォルダを作り その中に Dockerfile を作成します.

Dockerfile
FROM alpine
  1. VS Code で Test フォルダを開きます.

  2. 左下のリモートホストをクリックして,Reopen in Container をクリックして,次に From 'Dockerfile' を選択します.

  3. 左下のリモートホストが Dev Container: Existing Dockerfile と表示されます.

4. さいごに

適当に遊んでみます.上記の動作確認しかしていないので,不具合があるかもしれません. 試して見る方は,ご了承願います.

Discussion