Proxy配下でWSL2 + Ubuntu + Docker環境構築

Proxy配下でWSL2 + Docker(Docker Engine)環境を構築する手順です。

## 対象読者
* 企業や組織等において、Proxy配下でWindowsを使ってる人
* Docker Desktopを買ってもらえない人※
* Linuxの基本操作ができる人

※Docker Desktopは従業員数250名を超える企業の商用利用では有料サブスクリプションが必要です。

## 環境
* Windows10 Pro 22H2（Windows10 HomeでもOK）

:::note
WSL2+Ubuntuを1コマンドで一括インストールする方法もあります。
https://learn.microsoft.com/ja-jp/windows/wsl/install

本記事では、Ubuntu 24.04LTSをインストールするため、以下を参考に一つ一つ手動で行います。
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual
:::

## 「ターミナル プレビュー」をインストールする
上記のmicrosoftのwslのインストール手順にも「省略可能」として記載されている「Windows ターミナル」をインストールすると便利です。
インストールする場合は、スタートメニューからMicrosoft Storeを開きで「terminal」と検索します。
「Windows Terminal Preview」をインストールします。
インストール後、スタートメニューから「ターミナル プレビュー」(以降　`ターミナル` )を起動してください。

## Windows の機能の有効化
スタートボタン横の検索枠に、「windows の機能の」まで入力すると、「Windows の機能の有効化または無効化」メニューが表示されるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/809fe164-85bb-3fb3-0bc2-7e691d9ceca1.png)

次の２つのチェックボックスをオンにします。
* Linux 用 Windowsサブシステム
* 仮想マシン プラットフォーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/7f3ad390-4ee1-9dae-84c9-a1abd55fd5bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/4ae74140-f357-4868-2487-59734d2aa925.png)

## WSL2 を最新バージョンにする
`ターミナル`から次のコマンドを入力します。
```:Windows PowerShell
wsl --update
```
エラーが出て進まない場合は以下を試してみてください。
```:Windows PowerShell
wsl --update --web-download
```
`--web-download`は、Microsoft Store ではなくインターネットからディストリビューションをダウンロードするオプションです。
wslのコマンドやそのオプションについては、`--help`で確認できます。
```:Windows PowerShell
wsl --help
```


## WSL2にUbuntu 24.04をインストール
インストール可能なディストリビューションは次のコマンドで確認できます。
```:Windows PowerShell
wsl --list --online
```

本記事では、次のように`Ubuntu-24.04`をインストールします。
```:Windows PowerShell
wsl --install Ubuntu-24.04
```
インストールの最後でユーザー名/パスワードの入力を求められるので、任意に入力してください。

:::note
ここではユーザ名を`user`としています。
以降、Ubuntuのユーザ名は`user`として記述します
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/55ce4210-1bec-7c76-990e-dd7b2cfe9c06.png)

`ターミナル` がUbuntuにログインした状態になったら、`exit` と入力してUbuntからログアウトし、`ターミナル` もいったん閉じてください。

## Ubuntuにプロキシを設定する
`ターミナル` を再起動することで、自動的にメニューに `Ubuntu 24.04 LTS` が追加されるはずです。
選択してUbuntuを起動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/7edf981b-3aa0-2f58-83b4-9aee0be63f3e.png)

任意のエディタ（ここではnano）でホームディレクトリ（/home/user）の`.bashrc`を編集します。
```bash:Ubuntu
nano .bashrc
```
カーソルをファイルの一番下まで移動して…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/968d9f9e-d24f-c75f-54b6-7f9e10239a7e.png)

次のようにプロキシ設定を追加してください。

```bash:Ubuntu /home/user/.bashrc
# 以下の3行をご自身の環境に合わせて変更してください
export PROXY_SVR_PORT=proxy.company.com:port
export HTTP_PROXY_USER=your_proxy_username
export HTTP_PROXY_PASS=yourp%40ssword

# for Curl
export HTTP_PROXY=http://${HTTP_PROXY_USER}:${HTTP_PROXY_PASS}@${PROXY_SVR_PORT}/
export HTTPS_PROXY=${HTTP_PROXY}
# for wget
export http_proxy=${HTTP_PROXY}
export https_proxy=${HTTP_PROXY}
# for git
git config --global http.proxy ${HTTP_PROXY}
git config --global https.proxy ${HTTPS_PROXY}
git config --global url."https://".insteadOf git://
```
Ctrl+Sで保存、Ctrl+Xでnanoを閉じてください。

:::note warn
パスワードで記号を使用している場合はURLエンコードする必要があります
下の例では、本来のパスワード「yourp@ssword」の「@」部分をURLエンコードして「yourp%40ssword」にしています
[ASCII文字とURLエンコードの対応表](https://www.seil.jp/doc/index.html#tool/url-encode.html)
:::

## aptのProxy設定
[「aptのプロキシ対応」](https://qiita.com/m-tmatma/items/e3d9de76be50763ac01c) の「方法2」で設定します。
(「方法5-2」で設定すれば.bashrcの変更だけでイケるかなと思ったのですがダメそうでした)

「方法2」の通り、/etc/apt/apt.conf.d以下に`proxy.conf`を作成します。
```bash:Ubuntu
sudo nano /etc/apt/apt.conf.d/proxy.conf
```

`proxy.conf` に以下のようにProxy設定を書き込んでください。
ここでもパスワードにはURLエンコードが必要です。
```bash:Ubuntu /etc/apt/apt.conf.d/proxy.conf
Acquire::http::Proxy "http://your_username:yourp%40ssword@proxy.company.com:port/";
Acquire::https::Proxy "http://your_username:yourp%40ssword@proxy.company.com:port/";
```

### [任意] Host名の変更
UbuntuのHost名を変更したい場合は、以下のようにwsl.confに設定を追記してください。
ファイルを開き、
```bash:Ubuntu
sudo nano /etc/wsl.conf
```
以下の２行を追記
```bash:Ubuntu /etc/wsl.conf
[network]
hostname = myhostname
```

## 再起動または再ログイン
現在までの設定を反映させるため、Host名を変更した場合は「再起動」、していない場合は「再ログイン」してください。

### 「再起動」方法
WSL2では以下の手順でUbuntuを再起動します。

1\. `ターミナル` の「Windows Powershell」タブに移動し、次のコマンドでUbuntuを停止させる

```:Windows
wsl --shutdown
```

2\. `ターミナル` でUbuntu側のタブを選択し、`Enter`キーを押下する

:::note warn
Ubuntu側で `sudo shutdown -r` としても再起動しません
:::

### 「再ログイン」方法
再ログインするには、`exit` と入力してログアウトし、`ターミナル` から再度Ubuntuを起動してください。

```bash:Ubuntu
exit
```

## Ubuntuのパッケージを最新に更新する
Ubuntuに再ログイン後、次のコマンドでアップデートすべきパッケージを最新に更新します。

```bash:Ubuntu
sudo apt update
sudo apt upgrade
```

```
Do you want to continue? [Y/n]
```
と表示されたら「y」キーを押下して [Enter] してください。

## Docker Engineのインストール

#### リポジトリをセットアップ ([参考](https://www.kagoya.jp/howto/cloud/container/dockerubuntu/)) ([公式](https://docs.docker.com/engine/install/ubuntu/))

※パッケージリストの更新とインストールは、直前にapt updateを行っているため省略します。

1\. 公式のGPGキーを保存するディレクトリを作成する
```bash:Ubuntu
sudo mkdir -p /etc/apt/keyrings
```

2\. 公式のGPGキーを取得する
```bash:Ubuntu
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

3\. 公式のDockerリポジトリを追加する
```bash:Ubuntu
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

4\. 改めてパッケージリストを更新する
```bash:Ubuntu
sudo apt-get update
```

#### Docker Engineをインストール
1\. Docker Engine、containerd、Docker Compose をインストール
```bash:Ubuntu
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

2\. インストールされたdockerのバージョンを確認
バージョン確認することで正常にdockerがインストールされたことを確認します。
```bash:Ubuntu
docker -v
```

3\. dockerコマンドをsudoなしで実行できるようにする
`docker`グループにUbuntuインストール時に作成したユーザーを追加します。
(今回のケースでは `$USER` 部分は `user`)
```bash:Ubuntu
sudo usermod -aG docker $USER
```

4\. 以下のコマンドで変更を反映させる
(上記と同じく、今回のケースでは `$USER` 部分は `user`)
```bash:Ubuntu
su - $USER
```

## DockerのProxy設定
[本家ドキュメント](https://docs.docker.jp/config/daemon/systemd.html#http-https) に従って以下のように設定してください。

1\. Docker サービスに対応した systemd のドロップイン・ディレクトリを生成する
```bash:Ubuntu
sudo mkdir -p /etc/systemd/system/docker.service.d
```

2\. `/etc/systemd/system/docker.service.d/http-proxy.conf` というファイルを生成して、次の手順で環境変数 HTTP_PROXY の設定を書き込む
```bash:Ubuntu
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
```

:::note warn
【重要】
Dockerのパスワード設定だけは、URLエンコードに加えて「%」をダブルにする必要があります！
:::

```bash:/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://your_username:yourp%%40ssword@proxy.company.com:port/"
Environment="HTTPS_PROXY=http://your_username:yourp%%40ssword@proxy.company.com:port/"
Environment="NO_PROXY=localhost,127.0.0.1"
```

3\. 変更を反映するため、Docker を再起動する

```bash:Ubuntu
sudo systemctl daemon-reload
sudo systemctl restart docker
```

4\. 設定が読み込まれ、変更が反映したかどうかを確認する

```bash:Ubuntu
sudo systemctl show --property=Environment docker
```
（`Ctrl+C`で抜ける）
## hello-worldで最終確認

```bash:Ubuntu
docker run hello-world
```

「Hello from Docker!」を表示されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/bdf73365-a467-11cd-db96-7c50b2523326.png)

## 参考：Ubuntuのアンインストール
WSLでインストールしたディストリビューションをアンインストールするには、以下の書式でコマンドを実行します。
```:Windows
wsl --unregister <ディストリビューション>
```
したがって、Ubuntu-24.04をアンインストール（削除）したい場合は次のようにコマンドを実行します。
```:Windows
wsl --unregister Ubuntu-24.04
```
また、設定の「アプリと機能」に当該ディストリビューションが残っているため、「アンインストール」して削除しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794426/8fdc00e6-a3f5-1dd3-af5e-b5598d8138ed.png)

### 参考サイト

https://qiita.com/haveAbook/items/0d0ae20a19214f65e7cd

https://qiita.com/sachioksg/items/289e40d69382b1d09811

https://qiita.com/m-tmatma/items/e3d9de76be50763ac01c

https://qiita.com/KenFujita/items/ed5a73f83273b4ef81cf