WSL上のubuntuにDockerを入れてみる

WSL2上のUbuntu18.04にDockerをインストールし触ってみたので、メモを残しておきます。

#作業環境
###Ubuntuセットアップ
WSL2上のUbuntu構築は以下の記事にまとめています。
[WSL上にUbuntu18.04を構築してみた](https://qiita.com/nnydtmg157/items/901099843fe89eb1ff42)

###Dockerバージョン
19.03.13

#流れ
1. Dockerインストール
2. Dockerコマンド諸々


#1.Dockerインストール
以下サイトを参考にインストールを行います。
[Ubuntu 18.04 LTS に Docker をインストールする](https://www.softek.co.jp/SID/support/sidfmvm/guide/install-docker-ubuntu1804.html)

###Dockerのリポジトリを設定する
パッケージのアップデート、必要なパッケージのインストールを実行し、Docker 公式の GPG 公開鍵をインストールします。

```bash
$ sudo apt update
$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
```


###Dockerインストール
最新版のDockerをインストールします。

```bash
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
```

インストールの確認をします。

```bash
$ sudo docker --version
$ sudo systemctl status docker
```


###以下はProxy設定を行う場合に実施してください。
proxy設定用ファイルを作成し、必要な設定を書き込みます。

```bash
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
```

```bash:http-proxy.conf
[Service]
  Environment="HTTP_PROXY=http://proxy.example.com:8080/"
  Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
```
変更を適用し、設定を反映させる。最後に設定できていることを確認します。

```bash
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ systemctl show --property=Environment docker
```
設定ファイルに記載した情報が表示されれば完了です。


###Dockerコマンドをsudo無しで実行するための設定を行います。
まずは現状の確認をします。

```bash
$ docker images
```
Permission Deniedでエラーになります。

Dockerグループに対象ユーザーを入れます。
一度対象ユーザーにログインしなおしてください。

```bash
$ sudo usermod -aG docker ${USER}
$ su - ${USER}
```
設定できたことを確認します。

```bash
$ docker images
```
エラーが起きなくなっていれば完了です。



#2.Dockerコマンド諸々
###Docker起動・停止・ステータスチェック

```bash
$ sudo systemctl start docker
$ sudo systemctl stop docker
$ sudo systemctl status docker
```

###イメージ検索

```bash
$ docker search [OPTIONS] TERM
```
TERMには、httpd、mysqlなどを入れることで、提供されているレポジトリが表示されます。

例えばhttpdで検索してみます。

```bash
$ docker search httpd
```
以下のような結果が返ってきました。

```
NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                                   The Apache HTTP Server Project                  3261                [OK]
centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or bui…   36
centos/httpd                                                                            33                                      [OK]
arm32v7/httpd                           The Apache HTTP Server Project                  9
polinux/httpd-php                       Apache with PHP in Docker (Supervisor, CentO…   4                                       [OK]
salim1983hoop/httpd24                   Dockerfile running apache config                2                                       [OK]
solsson/httpd-openidc                   mod_auth_openidc on official httpd image, ve…   1                                       [OK]
publici/httpd                           httpd:latest                                    1                                       [OK]
clearlinux/httpd                        httpd HyperText Transfer Protocol (HTTP) ser…   1
hypoport/httpd-cgi                      httpd-cgi                                       1                                       [OK]
jonathanheilmann/httpd-alpine-rewrite   httpd:alpine with enabled mod_rewrite           1                                       [OK]
dariko/httpd-rproxy-ldap                Apache httpd reverse proxy with LDAP authent…   1                                       [OK]
lead4good/httpd-fpm                     httpd server which connects via fcgi proxy h…   1                                       [OK]
dockerpinata/httpd                                                                      0
interlutions/httpd                      httpd docker image with debian-based config …   0                                       [OK]
appertly/httpd                          Customized Apache HTTPD that uses a PHP-FPM …   0                                       [OK]
amd64/httpd                             The Apache HTTP Server Project                  0
manasip/httpd                                                                           0
trollin/httpd                                                                           0
e2eteam/httpd                                                                           0
manageiq/httpd_configmap_generator      Httpd Configmap Generator                       0                                       [OK]
itsziget/httpd24                        Extended HTTPD Docker image based on the off…   0                                       [OK]
manageiq/httpd                          Container with httpd, built on CentOS for Ma…   0                                       [OK]
ppc64le/httpd                           The Apache HTTP Server Project                  0
```
The Apache HTTP Server Projectが公式でhttpdという名前のイメージを公開していることがわかります。



###イメージ取得

```bash
$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]
```
先ほど検索したhttpdのイメージを取得してみます。

```bash
$ docker pull httpd
```
TAGを指定しなければ、latest(最新版)がpullされます。

```
Using default tag: latest
latest: Pulling from library/httpd
852e50cd189d: Pull complete
67d51c33d390: Pull complete
b0ad2a3b9567: Pull complete
136f1f71f30c: Pull complete
01f8ace29294: Pull complete
Digest: sha256:fddc534b7f6bb6197855be559244adb11907d569aae1283db8e6ce8bb8f6f456
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
```

###イメージ一覧表示

```bash
$ docker images [OPTIONS] [REPOSITORY]
```
先ほどpullしたイメージを見てみます。

```bash
$ docker images
```
以下の通り表示されます。

```
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              0a30f4c29d25        4 days ago          138MB
```

###コンテナの起動

```bash
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
```
先ほどのhttpdを起動してみます。

```bash
$ docker run -d -p 8080:80 httpd
```
docker runコマンドを実行した際に下に表示される英数字が、コンテナIDとなり、今後このコンテナを指定する際には、このIDを指定します。
オプションの解説をしておきます。
-d:バックグラウンド実行(つけなければ、プロンプトがコンテナに奪われます。ログアウトすればホスト側に戻ってきます。)
-p:ポート指定(今回はローカルポートが8080でコンテナポートが80になっています)

別の起動方法。これで起動した場合は、プロンプトがコンテナ内のプロンプトになる。

```bash
$ docker run -p 8080:80 --name test01 -it httpd /bin/bash
```
--name:コンテナ名を指定
-it:image名を指定
/bin/bash:ログイン時のコマンドを指定



###コンテナプロセスの確認

```bash
$ docker ps [OPTIONS]
```
停止中のプロセスも含めて確認するには、-aオプションを付けます。
基本的に以下のコマンドを打てばいいと思います。

```bash
$ docker ps -a
```
実行結果は以下のように表示されます。

```
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                      PORTS                  NAMES
cf4beeb4be04        httpd               "httpd-foreground"   3 seconds ago       Up 2 seconds                0.0.0.0:8080->80/tcp   pedantic_cohen
168d4374aa73        httpd               "/bin/bash"          7 minutes ago       Exited (0) 4 minutes ago                           test01
```
見方は以下の通りです。

|カラム名|説明|
|:---|:---|
|CONTAINER ID|コンテナIDの最初の12桁|
|IMAGE|コンテナの元イメージ名|
|COMMAND|起動時に与えられたコマンド(起動時に末尾で指定したもの)|
|CREATED|コンテナの作成日からの経過時間|
|STATUS|起動・停止のステータス|
|PORTS|バインドしているポート(ホスト側8080:コンテナ側80)|
|NAMES|コンテナの名前(起動時に--nameで指定したもの)|

###起動中コンテナへのログイン

```bash
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
```
上記のcf4beeb4be04コンテナにログインしてみます。

```bash
$ docker exec -it cf4beeb4be04 /bin/bash
```

###コンテナの停止

```bash
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
```
先ほど起動したコンテナを停止してみます。

```bash
$ docker stop 5b43901894115d72415d265488225b957050accffcb27ce16382c97479be1d75
```


###停止中コンテナの起動

```bash
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
```
先ほど停止したコンテナを起動してみます。

```bash
$ docker start 5b43901894115d72415d265488225b957050accffcb27ce16382c97479be1d75
```


###コンテナの削除

```bash
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
```
test01コンテナを削除してみます。

```bash
$ docker rm test01
```
再度docker psコマンドを実行してみます。

```
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                      PORTS               NAMES
cf4beeb4be04        httpd               "httpd-foreground"   17 minutes ago      Exited (0) 4 minutes ago                        pedantic_cohen
```
削除されていることがわかります。


###イメージの削除

```bash
docker rmi [OPTIONS] IMAGE [IMAGE...]
```
先ほどのhttpdイメージを削除してみます。
docker imagesで表示されるコンテナIDを指定します。

```bash
docker rmi 0a30f4c29d25
```
再度docker imagesで削除されていれば完了です。



#最後に
今回はUbuntu 18.04上に、Dockerをインストールし、Dockerの基本の「キ」レベルのコマンドをまとめてみました。
今後は構築をしながら気づいたことをまとめていきたいなと思います。




#追加
genieが利用できなくなったので、dockerの起動方法を変更しておきます。
最初からこちらにしておけばよかったです。。。

```bash
sudo /etc/init.d/docker start
```

記事のsystemctlはすべて/etc/init.d/に読み替えてもらえれば実行できます。失礼いたしました。