Dockerインストールしてみた(Windows向け)

# はじめに
Dockerって何？って人が起動成功するまでの流れを記載します。
参考にした記事は以下です。
https://sukkiri.jp/technologies/virtualizers/docker/docker-win_install.html

# 重要
この記事で紹介するDocker for Windowsを利用するには、PCが以下の要件を満たす必要があります。

- 64bit版のWindows 10（バージョン1511、ビルド10586以降）、ProもしくはEnterprise／Educationエディション
- Hyper-Vが利用できること
- コンテナ実行用の仮想マシンには、メモリ2GB、ディスク60GB（容量可変タイプの仮想ディスクで、初期サイズは4GB程度）のリソースが必要

Hyper-Vが有効になっているか確認する方法/Hyper-Vを有効にする方法は、以下に記載しています。

# Dockerのサイトにアクセス
以下にアクセス
Docker: https://www.docker.com/

右上の「Get started」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/925a51e9-462b-0153-522c-df9d8ee7ca13.png)

「Docker Desktop」の「Download for Windows」から、ダウンロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/220b8476-bc0b-7670-c902-66f988b9927a.png)

# Dockerのインストール
ダウンロードしたインストーラーを実行。

２点の確認項目が出てきます。
これは、和訳すると次の通りです。
- WSL2のインストールが必須であること
- デスクトップにショートカットを作成するか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4e4898d2-ee8d-1234-fab6-98d451f2ca27.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/c8441d41-6737-10f4-f5f6-58c9687e9481.png)

# Hyper-VでVirtualboxが起動しなくなった人向け
余談ですが、PC再起動後、VirtualBOXが起動しなくなりました。。。（あるある？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/7b3c3217-788d-12bf-b0a4-ebf6cf2a28b1.png)

powershellを「管理者として実行」で起動します。
Hyper-Vの状態を次のコマンドで確認します。

    bcdedit

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323231373936362f63393237616230382d393962322d393063652d666339642d3638326164656638303664642e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/152a5f83-2b8f-3d5d-b9b9-ed4dd5fc3395.png)
「hypervisorlaunchtype」がAUTOになってました。←VirtualBoxが起動しなくなったのはこれが原因？
そこで、次のコマンドを入力して、「hypervisorlaunchtype」をoffにします。

    bcdedit /set hypervisorlaunchtype off

このあと、PCを再起動するとVirtualBOX内の仮想マシンが正常に起動しました。
ただし、これだとDockerがエラーになるので次のコマンドを入力して、「hypervisorlaunchtype」をautoにします。

    bcdedit /set hypervisorlaunchtype auto

# Hyper-Vの有効化/無効化とかコマンド操作するのに抵抗がある人向け
VirtualBoxもDockerも両方使いたいけど、コマンドとかは触りたくない人はGUIでHyper-Vを有効/無効の切り替えができるアプリを試すのはいかがでしょうか。
参考記事①：https://qiita.com/picato1123/items/992f84fa41f78dd37030
参考記事②：https://github.com/nuitsjp/HyperV-Switch/blob/master/README-jp.md

上記で記載したコマンドの結果とこのスイッチが対応していることを確認しました。

- Hyper-V Switch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/a2c31f82-c87e-e03f-afdd-b4b9e7c338a9.png)

- powershell
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323231373936362f63666566383238612d363961342d323939662d353263392d6462343065313435336532392e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/cacf6ccd-7622-b327-515d-d0fe9d0eb2b3.png)


このスイッチに従い、On/Off設定後にPC再起動します。そうすると、設定が反映されます。

# Dockerの起動確認
dockerの起動時、次のリンクのようなエラーが出たが、「WLS２のカーネルを最新化する」と「Linuxディストリビューションをインストールする」を実行すれば直りました。
https://ufirst.jp/memo/2021/08/04/post-2977/

ちなみに、めんどくさい人向けに「WSL 2、有効化とカーネルアップデートをコマンド一発で対応」という記事を見つけました。
（もちろん、私はこちらを試しました）
https://news.mynavi.jp/article/20200620-1059833/


    コマンド                    内容
    wsl --install               WSL (Windows Subsystem for Linux)の機能を有効化するとともに、必要となるコンポーネントのインストールを行い、システムを再起動するように促す。
    wsl --update                WSL 2のLinuxカーネルを最新バージョンへアップデートする。
    wsl --update --status       WSL 2のLinuxカーネルバージョンおよびアップデートを実施した日時を表示する。
    wsl --update --rollback     WSL 2のLinuxカーネルを1つ前のバージョンへロールバックする。


なんとか、無事にDockerが起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/735a311c-3a7d-9960-2e35-199da7cae679.png)

PC起動時にdockerが立ち上がるのは嫌だったので設定変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/30ebe803-ce10-92f6-9c1c-dd4b9ff29afc.png)

# Ubuntuの起動
Dockerが起動している状態でコマンドプロンプトを立ち上げ、下記のコマンドを入力します。

    docker run ubuntu ls

起動成功！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/74c0b1da-ef61-e43c-eac6-af5c6573e9b2.png)

なお、Dockerのダッシュボードから、現在起動しているコンテナを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/53b0e9a2-1bb8-1c04-657e-37200fb40a26.png)

# Docker を利用したアプリケーションの起動
ダウンロードしたソースコード中の`Dockerfile`という名前が存在するディレクトリ内で以下のコマンドを実行することにより、 Web アプリケーションを起動できます。
1. まず`Dockerfile`という名前が存在するディレクトリ内で`build`します。
    
    docker build -t <Dockerイメージ名>:<タグ名(1.0とか)> <Dockerfileのあるディレクトリパス>

    C:\Users\hoge>docker build -t app-hello:1.0 .
    [+] Building 59.3s (11/11) FINISHED
    => [internal] load build definition from Dockerfile                                                                                      0.0s
    => => transferring dockerfile: 147B                                                                                                      0.0s
    => [internal] load .dockerignore                                                                                                         0.0s
    => => transferring context: 52B                                                                                                          0.0s
    => [internal] load metadata for docker.io/library/node:14                                                                                3.9s
    => [1/6] FROM docker.io/library/node:14@sha256:ab6c8cd32006f8a4c1c795e55ddfbc7f54f5a3fb7318506ecb355cab8f5e7182                         49.8s
    => => resolve docker.io/library/node:14@sha256:ab6c8cd32006f8a4c1c795e55ddfbc7f54f5a3fb7318506ecb355cab8f5e7182                          0.0s
    => => sha256:1a43d3c11106306de19fd422e9da4a6f9b96de147d92c6213d6dbbc395be81b3 11.30MB / 11.30MB                                          5.5s
    => => sha256:243ae34810fbd860a43ecf1a7da887386e7a1155913bf13ed95681c98a1cfa84 4.34MB / 4.34MB                                            1.1s
    => => sha256:e0dd89382d4f7da3b2be5d5fb74c65bfa1836deecae3c5f88919f44b469025f9 2.21kB / 2.21kB                                            0.0s
    => => sha256:31421e72129c508a69ae6b4681101596908a091c9097591b73851fd4470264b7 7.64kB / 7.64kB                                            0.0s
    => => sha256:2f0ef4316716c8b8925ba3665932f8bf2cef3b072d82de1aeb269d6b8b61b84c 45.38MB / 45.38MB                                         15.1s
    => => sha256:ab6c8cd32006f8a4c1c795e55ddfbc7f54f5a3fb7318506ecb355cab8f5e7182 776B / 776B                                                0.0s
    => => sha256:d01c447bcebcc60440b9d84f429ded8ce8d836952f1061c96cce5047230ab696 49.76MB / 49.76MB                                         15.1s
    => => sha256:1d07840244ef02090cd7f447e6ab7b021a238b24864e9513e7a37d2891f4fb57 214.44MB / 214.44MB                                       40.2s
    => => extracting sha256:2f0ef4316716c8b8925ba3665932f8bf2cef3b072d82de1aeb269d6b8b61b84c                                                 1.8s
    => => sha256:5037d4710e071cf1f6f5bf24831fab5093d28a1e5fc58b9fff5309bfa193b7bc 35.14MB / 35.14MB                                         23.9s
    => => sha256:5df57a36055e9d7d2081a5c4e9310b473498a97c69eba1d2c71778a86f92db0b 4.19kB / 4.19kB                                           15.9s
    => => sha256:714346faf07fac8b4573637cb4d6e768b07d7583677b3046dd8d76efff72270a 2.33MB / 2.33MB                                           17.7s
    => => extracting sha256:1a43d3c11106306de19fd422e9da4a6f9b96de147d92c6213d6dbbc395be81b3                                                 0.4s
    => => extracting sha256:243ae34810fbd860a43ecf1a7da887386e7a1155913bf13ed95681c98a1cfa84                                                 0.2s
    => => extracting sha256:d01c447bcebcc60440b9d84f429ded8ce8d836952f1061c96cce5047230ab696                                                 2.2s
    => => sha256:6a56afa5a7808121dd05fd91cfe718eb46f8ecc22a34539eca6274e193ba2237 464B / 464B                                               18.0s
    => => extracting sha256:1d07840244ef02090cd7f447e6ab7b021a238b24864e9513e7a37d2891f4fb57                                                 7.5s
    => => extracting sha256:5df57a36055e9d7d2081a5c4e9310b473498a97c69eba1d2c71778a86f92db0b                                                 0.0s
    => => extracting sha256:5037d4710e071cf1f6f5bf24831fab5093d28a1e5fc58b9fff5309bfa193b7bc                                                 1.5s
    => => extracting sha256:714346faf07fac8b4573637cb4d6e768b07d7583677b3046dd8d76efff72270a                                                 0.1s
    => => extracting sha256:6a56afa5a7808121dd05fd91cfe718eb46f8ecc22a34539eca6274e193ba2237                                                 0.0s
    => [internal] load build context                                                                                                         0.0s
    => => transferring context: 215.16kB                                                                                                     0.0s
    => [2/6] WORKDIR /app                                                                                                                    0.9s
    => [3/6] COPY package.json ./                                                                                                            0.0s
    => [4/6] COPY package-lock.json ./                                                                                                       0.0s
    => [5/6] RUN npm i                                                                                                                       4.2s
    => [6/6] COPY . .                                                                                                                        0.0s
    => exporting to image                                                                                                                    0.3s
    => => exporting layers                                                                                                                   0.3s
    => => writing image sha256:b6b9aee9c9398e7ce0683d4dcfac12aa6489365f0f00c276e71c2fef1d5ac1d8                                              0.0s
    => => naming to docker.io/library/wanictf-post:1.0                                                                                       0.0s
    Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

2.「docker images」コマンドでDockerイメージ一覧を確認

    C:\Users\hoge>docker images
    REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
    app-hello      1.0       b6b9aee9c939   8 minutes ago   980MB
    ubuntu         latest    ba6acccedd29   2 weeks ago     72.8MB

3.　Dockerコンテナーの起動確認

    C:\Users\hoge>docker run -d -p 8080:8080 --name test1 app-hello:1.0
    569a2c9b4e843ab54b002491245d493af8f70f43a1c95797a3d8bc259fb160b6

4.ブラウザで確認
`http://localhost:8080/`にアクセス

5.コンテナーを停止

    C:\Users\hoge>docker stop test1
    test1

6.コンテナーを削除

    C:\Users\hoge>docker rm test1
    test1

7.イメージを削除

    C:\Users\hoge>docker rmi <IMAGE ID>
    untagged: app-hello:1.0
    ...


*Good luck*