初心者がDockerを学ぶ　Part2 -Dockerコマンド-

# はじめに
本記事は業務でDockerやKubernetesを利用するようになったものの、初心者すぎてよくわかっていない私が様々な書籍や講座で調べて学んだ内容を残していくものになっています。
Dockerについてある程度学習した後、Kubernetesの内容に進んでいく予定です。

今回は[初心者がDockerを学ぶ　Part1 -Dockerとは-](https://qiita.com/Shiroinu716/items/6e8161123c00540757bc)の続きで、Dockerコマンドをいろいろ使ってみようと思います。

# 本記事でわかること
Dockerのイメージを取得したり、実際にコンテナを作成して実行したりするときの基本的なコマンドの使い方がわかります。
記事タイトルの通りですが初心者向けです。

# 実行環境
Part1の記事でも最後に書いていますが、私はMacBookを使っているのでDocker Desktop for Macの手順でDocker Desktopをインストールしています。

Docker Desktop for Mac : https://docs.docker.com/docker-for-mac/install/
Docker Desktop for Windows: https://docs.docker.com/docker-for-windows/install/
Linux: https://docs.docker.com/engine/install/

インストールできたかどうかは以下のコマンドで確認できます。
正常にインストールできていればバージョン情報が出てきます。

```console
$ docker --version
Docker version 20.10.20, build 9fdeb9c
```

# Docker Engineの起動と終了
上記の方法でインストールを行なった場合、Docker Engineの起動、終了は以下のようになると思います。

### MacとWindowsの場合
MacまたはWindows環境の方はとても簡単です。インストールしたDocker Desktopのアプリケーションを起動するだけです。
終了もアプリケーションを終了させればOKです。

### Linuxの場合
Docker Engineの起動、終了はroot権限で行います。それぞれ以下のようなコマンドになるかと思います。
- 起動
```console
sudo systemctl start docker
```

- 終了
```console
sudo systemctl stop docker
```

- 自動起動の設定
```console
sudo systemctl enable docker
```

# nginxのイメージを使って色々試してみる

### Dockerイメージを探す
まずは公開されているnginxのイメージを検索してみます。

```console
$ docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        17828     [OK]       
linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   181                  
bitnami/nginx                                     Bitnami nginx Docker Image                      149                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   71                   
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   22                   [OK]
rancher/nginx-ingress-controller                                                                  11                   
kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   4                    
```
なにやらいっぱい出てきましたが、一番上の`Official build of Nginx.`とかいてあるImageを使っていきましょう。

### Dockerイメージを取得する
実際にイメージを取得するコマンドは`docker pull`を使います。
```console
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
025c56f98b67: Pull complete 
ec0f5d052824: Pull complete 
cc9fb8360807: Pull complete 
defc9ba04d7c: Pull complete 
885556963dad: Pull complete 
f12443e5c9f7: Pull complete 
Digest: sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
```
pullのあとにイメージ名を指定します。

### Dockerイメージの表示
`docker images`で取得したイメージを表示できます。
```console
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    3964ce7b8458   4 days ago   142MB
```
### Dockerイメージの削除
イメージを削除するには`docker rmi <イメージ名>`を実行します。
```console
$ docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3
Deleted: sha256:3964ce7b84589cf9bc585415741b642b7167229e0afde03f502f6c848ed3279d
Deleted: sha256:d074856927ea4224de9fa86b95620c7e4a26da5512db98ccd50cd31b972679a3
Deleted: sha256:815f0d9df09812d9a61725d270fc09f565ab24af22acbda11a953ac9740bb920
Deleted: sha256:dd1c6be5fb8e83f9dc81c628a614dee835cd881c1e244f7f893f2acc49c4fd3b
Deleted: sha256:1d76f7083f6e373335df2263cbd7e272c53df65f226bedbf4849149dddbfd9d7
Deleted: sha256:f95e777ae8eeb4c90475fda98d997771924baaf2975f406d62fa92a1a5b4e502
Deleted: sha256:b5ebffba54d3e3f7fd80435fcdc34c4a96fdb2ecab0f0a298fe08f74c2f69d29
```
`docker images`でも表示されません。
```console
$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
```
今回はこの後も使いたいのでもう一回取得しておきます。

### nginxのコンテナを生成して起動してみる
イメージからコンテナを生成して起動するには`docker run`を使います。

```console
$ docker run -p 8080:80 --name nginx-server nginx
```
実行して起動に成功するとコマンド入力が使えなくなると思います。
これを回避する方法は後ほど出てきますので、一旦慌てず別ターミナルを立ちあげてください。

コマンドの内容を見ると`docker run`で実行するとは聞いてたけど、聞いてないオプションを使ってますよね。
一つずつ見ていきましょう。

`-p 8080:80` : ポートの設定をしています。ホストの8080（任意で好きなポートを設定してOKです）と生成するコンテナのポート80を繋ぐという内容です。

`--name niginx-server` : 生成するコンテナに名前をつけています。こちらも好きな名前にしてOKです。名前を付けなくても実行できるんですが、後々管理がめんどくさくなったりするかもなので付けておきましょう。

`nginx`: 最後の部分ですが、利用するイメージの名前を指定しています。

ブラウザで[localhost:8080](http://localhost:8080/)にアクセスすると以下のようにWelcome to nginx!が表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3061337/ce708983-1ff2-a275-9d58-a06ef3b59199.png)

ひとまずnginxのイメージからコンテナを生成して実行するまでできました！

### 起動しているコンテナの一覧を確認する
`docker ps`で起動中のコンテナ一覧を表示できます。
```console
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
dcd2fa8b5a1b   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   0.0.0.0:8080->80/tcp   nginx-server
```
ランダムな値が振られるコンテナIDや、元となったイメージ名、
ステータスやポートの設定、コンテナ名を確認することができますね。

停止中のコンテナを含めたすべてのコンテナを表示したい場合は以下のようになります。

```console
$ docker ps -a
```
または
```console
$ docker ps --all
```
どっちでも同じ結果が出ます。

### コンテナを停止する
コンテナを停止したいときは以下のように実行します。
```console
$ docker stop nginx-server
nginx-server
```
起動中のコンテナ一覧に表示されなくなりました。
```console
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
`docker ps -a`で確認するとステータスが`Exited`になっていることが分かります。
```console
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                          PORTS     NAMES
dcd2fa8b5a1b   nginx     "/docker-entrypoint.…"   25 minutes ago   Exited (0) About a minute ago             nginx-server
```

### 停止したコンテナの削除
停止したコンテナを削除したいときは以下のように実行します。
```console
$ docker rm nginx-server
nginx-server
```

`docker ps -a`を実行すると一覧から消えていることが分かりますね。

```console
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

### コンテナをバックグラウンドで起動する
先程の`docker run`コマンドでコマンド入力が使えない状態になったと思います。回避するには以下のように`-d`オプションをつけることでバックグラウンド起動にできます。

```console
$ docker run -d -p 8080:80 --name nginx-server nginx
a81d2a5f8d7ee6c1f20e19e94919e1825a75a2a6240cd5c9d62acc2d86021bd6
```

### 起動したコンテナのシェルに入る
以下のコマンドでバックグラウンドで起動したコンテナの中に入ってみます。
```console
$ docker exec -it nginx-server /bin/bash
root@a81d2a5f8d7e:/# 
```
`exec` : 実行中のコンテナ内で指定のプログラム、コマンドを実行します。
`-it` : ホストの標準入出力をコンテナに結びつけます。
`nginx-server` : コンテナ名です。
`/bin/bash` : 今回実行したいコマンドです。

コンテナから抜けたいときは以下のようにします。
```console
root@a81d2a5f8d7e:/# exit
exit
```
### コンテナにホストからファイルをコピーする
最後にホスト側のファイルをコンテナ内にコピーする方法を試してみましょう。
まずは以下のように`Hello World From Host`とだけ書いた`index.html`ファイルを準備します。

```
Hello World From Host
```
カレントディレクトリに`index.html`がある状態です。
```console
$ ls
index.html
```

続いて以下のようにコマンドを実行します。

```console
$ docker run -d -v "$(pwd)":/usr/share/nginx/html -p 8080:80 --rm --name nginx-server nginx
0be609db1d250cf216f666bca9f946cbfd7b23df05603e4da6cf9a2540b74c20
```
`-v "$(pwd)":/usr/share/nginx/html` : ホストのディレクトリ`$(pwd)`をコンテナのディレクトリ`/usr/share/nginx/html`としてマウントします。今回はnginxのデフォルトのHTMLを用意したものに変更しました。

`--rm` : 今回の内容には直接関係ないですが、コンテナ停止時に同時に削除も行うという意味です。

再度ブラウザで[localhost:8080](http://localhost:8080/)にアクセスすると以下のように表示が変わっていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3061337/9d8fe13d-2e88-da6c-8964-7302dda7b710.png)

# 最後に
今回はDockerの基本的なコマンド操作を行いました。
少しだけDockerを使えるようになってきました。
Part3に続きます。