[メモ]初心者がコンテナを触ってみる - (1)PCにDockerをインストールする

# はじめに
お疲れ様です。yuki_inkです。

**コンテナ、使ってますか？？**

普段はEC2に甘やかされて生きている私ですが、今を生きるインフラエンジニアの端くれとして、いつかはコンテナと向き合う日が来るのだろうと思っていました。
そんな時、社内でKubernetesを使っていろいろやってみようという勉強会が企画されました。
この機は逃せない。勉強しなければ（歓喜）
ということで、コンテナ初心者が1から勉強する過程をメモ的に記録していきたいと思います。


# やったこと

参考にした記事
[Windows 10 + WSL 2 でDocker環境を構築する（Docker Desktop有料化対策）](https://blog.ecbeing.tech/entry/2021/09/07/150000)

### (1) WSL 2のインストール
まずは自分のPCにWSLを導入できるか確認。
>WSL 2の環境構築に必須となる要件は以下の通りです。
①Windows 10(64bit) バージョン2004以上
②パソコンのハードウェアがHyper-Vに対応している

PowerShellで`systeminfo`コマンドを実行して確認した。
結果、大丈夫そう。初手で躓かなくてよかった。

続いてPowerShellで`wsl --install`コマンドを実行して、WSL 2をインストールする。
1回目の実行でよく分からないエラーが出たが、2回目の実行でうまくいった。
```
> wsl --install
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
インストール中: Ubuntu
Ubuntu はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります 。
```
言われるがままPCを再起動。
再起動中、そういえばLinux ディストリビューション何にするか何も考えてなかったわ～／(^o^)＼と思ったが、個人開発なのでまあヨシ。

再起動後、以下のプロンプトが自動起動してビビる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/50695513-b92e-0e2b-719c-4a159d1dd3cc.png)

指示に従って、Ubuntu用のユーザ名とパスワードを入力したら、いい感じになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/c6564211-3037-2ddd-40c1-59fca3d902e6.png)

### (2) WSL 2の設定
コマンドプロンプトで`wsl --list --verbose`コマンドを実行。
先ほど入れたUbuntuしか表示されてないので、デフォルトのディストリビューションを気にする必要なし。
```
> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

### (3) Docker Engineのインストール
休日に英語のドキュメントを読むことに拒否反応を示してしまい、大部分は以下の記事を参考にした。

https://weblabo.oscasierra.net/docker-ce-install-ubuntu1604/

「[sudoなしでdockerコマンドを実行できるようにする](https://blog.ecbeing.tech/entry/2021/09/07/150000#Docker-Engine%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB:~:text=be%20working%20correctly.-,sudo%E3%81%AA%E3%81%97%E3%81%A7docker%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%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,-docker%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92)」の手順を実施して、Dockerのインストールが完了。
長い闘いだった。。
<details><summary>インストール完了後のプロンプト出力</summary>

```
$ docker -v
Docker version 24.0.2, build cb74dfc

$ sudo service docker status
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-06-17 16:22:57 JST; 7min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 8870 (dockerd)
      Tasks: 13
     Memory: 45.2M
     CGroup: /system.slice/docker.service
             └─8870 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
(以下略)
```
</details>


### (4) Webサーバを動かしてみる
[参考記事](https://blog.ecbeing.tech/entry/2021/09/07/150000#Docker-Engine%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB:~:text=%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81-,Docker%E3%81%A7MariaDB%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%82%8B,-%E3%81%9D%E3%82%8C%E3%81%A7%E3%81%AF%E3%80%81Docker%E3%82%92)では、Dockerインストール後、MariaDBを起動しているが、
俺ははじめてコンテナを立てたらNginxを動かすと決めていた！！
ということで以下の記事を参考にNginxを動かしてみる。

https://www.kagoya.jp/howto/cloud/container/dockernginx/

`docker image pull nginx`コマンドで最新のイメージをダウンロード。
`docker image ls`コマンドでイメージを確認する。
```
$ docker image pull nginx
Using default tag: latest
latest: Pulling from library/nginx
5b5fe70539cd: Pull complete
441a1b465367: Pull complete
3b9543f2b500: Pull complete
ca89ed5461a9: Pull complete
b0e1283145af: Pull complete
4b98867cde79: Pull complete
4a85ce26214d: Pull complete
Digest: sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
nginx         latest    eb4a57159180   3 days ago    187MB
hello-world   latest    9c7a54a9a43c   6 weeks ago   13.3kB
```
「nginx」というイメージが表示されているのでヨシ。
「hello-world」は`docker run hello-world`コマンドを実行した時に取得されたもの。

`docker container run`コマンドを実行して、Dockerイメージ「nginx」から「webserver」という名前のDockerコンテナを起動する。
コンテナIDが出力された。
```
$ docker container run -d -p 8080:80 --name webserver nginx
a752110be57578d4ff8e673d7f58fb794708e9f4aba344d1ed45b3f91766a4bb
```

>・「-p 8080:80」
ホスト側のポート番号（8080）と、Docker側のポート番号（80）を紐づけるオプションです。

なるほど。

ブラウザを立ち上げ、アドレスバーに`http://localhost:8080/`と入れる。
Nginxのトップ画面が表示された！！うれしい！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/822f3e1a-648a-1278-a951-2554605dc5f8.png)

`docker container ps`コマンドでプロセスの情報を見てみる。
```
$ docker container ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
a752110be575   nginx     "/docker-entrypoint.…"   36 seconds ago   Up 35 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   webserver
```

`docker container stats`コマンドでコンテナのステータスを見てみる。
※systemctl普段使いしてる身なので、え、"status"じゃない??大丈夫??、と不安になる。大丈夫でした。
```
$ docker container stats
CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT    MEM %     NET I/O           BLOCK I/O   PIDS
a752110be575   webserver   0.00%     7.23MiB / 3.758GiB   0.19%     3.12kB / 1.35kB   0B / 0B     9
```

最後に、「webserver」コンテナを停止させる。
プロセスを見て、止まっていることを確認する。
```
$ docker container stop webserver
webserver

$ docker container ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
# 終わりに
参考記事におんぶにだっこでPCにDockerを入れてみました。
次はDockerイメージの作成とかもやってみたいと思います。