Dockerを使ってみよう【インフラエンジニアへの道3日目】

### 読まなくていいやつ
インフラエンジニアへの道3日目です。今日はDockerを使ってみます。
本日の参考図書です。
https://amzn.asia/d/fqzjTWy
前半がDockerについての説明で、後半がハンズオンになっています。
WindowsとMacそれぞれDocker Desktopのインストール手順が書かれていて丁寧です。
「Dockerとはなんぞや」というところは本に記載されているので、この記事では実際に手を動かしてみた記録としてやっていきます。

## Dockerでコンテナを作成するには
Dockerの操作は基本的にdockerコマンドで行います。[チートシート](https://qiita.com/wMETAw/items/34ba5c980e2a38e548db)を見つけました。
Docker Desktopでもコンテナの起動や停止はできますが、細かい操作やオプションの指定まではできないため、ほとんどコマンド操作になります。
#### Dockerコマンド
```sh
docker 対象 操作
```
例えば、コンテナを作成・実行するコマンドは
```sh
docker container run
```
で、対象が「container」で操作「run」です。操作以降にはパラメータやオプションを指定します。

#### dockerコマンドでApacheのコンテナを作成する
使用するイメージ
イメージ名：httpd
Docker hubのURL：https://hub.docker.com/_/httpd
```sh
docker container run --name apache01 -p 8080:80 -d httpd
```
コンテナが作成されたか確認するためにhttp://localhost:8080 にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/46f5005d-6398-4d83-a3bb-8f169fd4b1d6.png)
Docker Desktopでも「apache01」が実行中になっていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/2bfdc2d1-07d9-45f8-a643-f528fcca2b53.png)

#### コンテナ停止する
コンテナを作ってみたいだけだったので停止します。
```sh
docker container stop apache01
```
先程のURL (http://localhost:8080) を再度確認するとアクセスできなくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/be22cdb1-8ef3-4c18-b7f7-e92043ab0f8a.png)

#### コンテナを削除する
コンテナを作ってみたかっただけなので、削除します。
```sh
docker container rm apache01
```
Docker Desktopから削除されたことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/49383900-05b2-45bf-b403-58f18022f061.png)

## Docker Compose
大きな声で叫んだら必殺技になりそうなIT用語（？）として憧れの「ドッカーコンポーズ」です。
Docker Composeは、一度に複数のコンテナを作成、実行できます。
Docker Composeでは、どういうコンテナを作成するかを設定するファイルとしてYAMLファイルが必要です。Docker ComposeにおけるYAMLファイルのデフォルトの名称は`compose.yaml`です。
ドッカーコンポーズの手順
1. 作成したいコンテナの情報を整理する
    作成したいコンテナに必要なソフトウェアを整理します。どのソフトウェアがインストールされている環境がほしいのか、どのバージョンを使うのかという点を整理しておきます。
1. Docker Composeファイルの作成
    整理した情報を元にDocker Composeファイルを作成する。
1. コマンドを使ってコンテナを作成・実行する
    作ったファイルをフォルダに配置したら、docker compose up -dコマンドを実行すると、ファイルに記載された情報に基づいてコンテナが作成される。

### Docker Composeでコンテナを作ってみる
#### 1.Apacheコンテナの情報を整理する
| コンテナ作成に必要な項目 | 設定値|
|:-:|:-:|
|使用するイメージ|httpd.バージョン2.4   |
|ポート番号| 8080:80  |

#### 2.Docker Composeファイルの作成
`compose.yaml`ファイルを作成します。デフォルトで、カレントフォルダにあるcompose.yamlファイルが読み込まれます。また、デフォルトでフォルダ名がDocker Composeのプロジェクト名に使われます。プロジェクト名によって個々の環境が分離されるので、何のためのコンテナ・環境であるのかわかりやすい名前をつけておきます。今回は、`docker-tutorial`にしておきました。
```yaml
services:
  web:
    image: httpd:2.4
    ports:
      - "8080:80"
```
yaml形式は、半角スペースの過不足があるだけでエラーになるので気をつけて入力します。タブではなく、あくまで半角スペースを使用して、ファイル全体でインデントには半角スペースを2つ使うというルールで統一する必要があります。
また、キーのあとのコロンに続けて値を記述する場合は、コロン（:）のあとに半角スペースが1つ以上必要です。ただし、値を次の行に書く場合は半角スペースがなくても大丈夫です。

#### 3. コマンドを使ってコンテナを作成・実行する
`compose.yml`を配置している階層で以下のコマンドを実行します。
```sh
docker compose up -d
```
`docker compose up`コマンドは、ローカルに対象のイメージがない場合にイメージをプルしてからコンテナを作成・実行するコマンドです。
`-d`はコンテナをバックグラウンドで実行させるオプションです。これを使わないと、コンテナのログが画面上に出力され、続けてコマンドが打てなくなります。

#### 4.コンテナが作成されたか確認する
実行中のコンテナを確認するコマンドを実行します。
```sh
docker container ls
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/af41588f-5e2a-4dfc-9b53-fa31e636307d.png)
STATUS項目が`up`になっていれば実行中です。
#### 5.コンテナを起動・停止する
```sh
docker compose stop
```
コンテナを停止することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/6d38857a-6851-4dcc-9f25-55bfe4cbfb77.png)
再度起動してみます
```sh
docker compose start
```
コンテナが再起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/6cf3c14d-2aea-4a4f-8ab8-5fbb1ca49dbe.png)
※このコマンドはすでにあるコンテナを起動するもので、コンテナを作成しているわけではないです。

#### 6.コンテナの後始末
使い終わったコンテナを削除します。
```sh
docker compose down
```
downコマンドの場合、コンテナが実行中であっても使用可能で、コンテナに紐づくネットワークも自動で削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/79191fc1-0919-4dc8-9a01-670ad6f5899c.png)
イメージも削除してみます。
```sh
docker compose down --rmi all
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734886/2dc0cf36-1cf4-427b-9114-e82af9753543.png)

## まとめ
Dockerを使って、実際にコンテナの作成・停止・削除を体験しました。
Docker Composeを使うことで、複数のコンテナを簡単に管理できることが実感できました。
基本的な操作を試しただけでも、Dockerの便利さがよくわかりました。
本の内容に沿って手を動かすだけでDockerの概要がわかりやすく、良書だと思いました。

### 学んだこと
* `docker container run `コマンドで、指定したイメージからコンテナを作成・起動できる。
* `docker compose`を使うと、複数のコンテナを一度に管理できることが便利。
* YAMLファイルにおけるインデントや書き方に注意が必要。スペースやコロンの使い方は特に重要。
* コンテナの状態確認や管理はコマンドラインで行い、Docker Desktopで可視化できる点も安心。

### 次にやりたいこと
たまにはデータエンジニアっぽいことを併せてみたいので、Dockerを使ってdbt環境を構築してみます。