WindowsServer2019 Proxy環境でWSL＋Dockerを使う

# 目次
<!-- TOC -->

- [動作環境](#%E5%8B%95%E4%BD%9C%E7%92%B0%E5%A2%83)
- [きっかけ](#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91)
- [WSLでUbuntu18.04を使えるようにする](#wsl%E3%81%A7ubuntu1804%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
- [Ubuntu18.04でDockerを実行できるようにする](#ubuntu1804%E3%81%A7docker%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)

<!-- /TOC -->

# 動作環境

OS Name: Microsoft Windows Server 2019 Standard
OS Version: 10.0.17763 N/A Build 17763

Domain参加していてProxy環境です。

# きっかけ
WindowsServer2019にはWindowsContainerという機能がありますが、Dockerhubにはpullできるものが少なく勝手が悪い。
Hyper-VでLinaxの仮想を立てても良いですが、ドメイン参加や手続きが面倒です。
そんな中でWSLという機能を見つけたのでそれを使ってやってみようと思いました。
※以前はWSLではDockerは動かなかったようですが、今は動くようです。


# WSLでUbuntu18.04を使えるようにする

Ubuntu18.04で`sudo apt update`ができるところまでやります。
参考　https://docs.microsoft.com/ja-jp/windows/wsl/install-on-server

※WSLだとUbuntu20.04はDockerがうまく動かなかったので、Ubuntu18.04のディストリビューションを選択
参考 https://qiita.com/AumyF/items/eaf42dd3345a2285ff9e
※GUIでポチポチやる場合は以下が参考になります。
https://pswork.jp/wsl/windows-2019-wsl-install/

```powershell:PowerShell
# 機能有効化
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
# ディストリビューションのDL
$url = "https://wslstorestorage.blob.core.windows.net/wslblob/Ubuntu_1804.2019.522.0_x64.appx"
Invoke-WebRequest $url -OutFile Ubuntu1804.zip
# 展開
Expand-Archive .\Ubuntu1804.zip .\Ubuntu1804
# Ubuntu18.04の実行
.\Ubuntu1804\ubuntu1804.exe

```
上記を実行して4,5分待つとusername、passwordを聞かれるので適当に入力します。
次にUbuntu側でProxyの設定を行って、`sudo apt update`します。

以下のshファイルを作成して、上記で作成したユーザのホームディレクトリに配置します。
エクスプローラーから配置できます。(Ubuntuから`exit`しておかないとエラーになる場合がある)
参考　https://qiita.com/quzq/items/1096c638c0d86795be13

```sh:proxysetting.sh
#!/bin/bash

# setting bash proxy
cat <<'EOF' >> /etc/profile.d/proxy.sh
export http_proxy="http://[proxy_ip]:[proxy_port]"
export https_proxy="http://[proxy_ip]:[proxy_port]"
EOF

# setting apt proxy
cat <<'EOF' >> /etc/apt/apt.conf
Acquire::http::proxy "http://[proxy_ip]:[proxy_port]";
Acquire::https::proxy "http://[proxy_ip]:[proxy_port]";
EOF
```
作成したファイルを実行して、一度`exit`します。

```bash:Bash
cd ~/
sudo sh proxysetting.sh
exit
```
もう一度ubuntuに入りなおすときは`wsl`または`ubuntu1804.exe`を実行します。
参考　https://qiita.com/mizutoki79/items/f6ba08b7f73133102c91

```powershell:PowerShell
wsl 
```
`sudo apt update`して、エラーなく動けば完了です。

```bash:Bash
sudo apt update && sudo apt upgrade
```
   
# Ubuntu18.04でDockerを実行できるようにする

以下のshファイルを作成して、上記で作成したユーザのホームディレクトリに配置します。

* dockerをインストールするshファイルの作成  
参考　https://qiita.com/jamjamjaaaaaam_/items/93e147ca6106c49265f4

※Dockerは最新のバージョンだとエラーがでて動きませんでした。
※以下のスクリプトでは18.06.1でインストールしています。

```sh:installdockerce.sh
#!/bin/bash

# 必要なもののインストール
sudo apt install -y \
   apt-transport-https \
   ca-certificates \
   gnupg-agent \
   software-properties-common
# gpgキーの追加 sudoでcurlは-E付けないとProxyでとまる
sudo -E curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# リポジトリの追加
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
# version指定してインストール
sudo apt install docker-ce=18.06.1~ce~3-0~ubuntu
# sudo付けないでdockerコマンド使えるようにする
sudo usermod -aG docker $USER
```
* 環境変数を引き継いでdockerdをバックグラウンドで起動させるshファイルの作成  
※サービスのところにProxyのコンフィグファイルを追加するやり方だとproxy設定が反映されませんでした。  
参考　https://qiita.com/dkoide/items/ca1f4549dc426eaf3735

```sh:startdockerd.sh
#!/bin/bash

# proxy用の環境変数
export http_proxy=http://[proxy_ip]:[proxy_port]
export https_proxy=http://[proxy_ip]:[proxy_port]
# これないとdockerdの起動でエラー
sudo cgroupfs-mount
# バックグラウンドで上記の環境変数引き継いで実行
sudo -bE dockerd
```
Ubuntuでinstalldockerce.shを実行してDockerをインストールします。

```bash:Bash
cd ~/
sudo sh installdockerce.sh
# ~~~
# 出力をみて、エラーなくインストールできていることを確認
# ~~~
exit
```
wslコマンドでstartdockerd.shを実行し、Ubuntuに入ります。

```powershell:PowerShell
wsl sudo sh startdockerd.sh
wsl
```
dockerコマンドを実行して、エラーなどがなければ完了です。

```bash:Bash
docker info
# これでエラーの表示がでず、設定したproxyの環境変数が表示されていればok
docker run hello-world
# 実行して下記がでれば完了
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```