Docker チートブック


## 目次
- [1. Dockerについて](#1-dockerについて)
- [2. Dockerの導入について](#2-dockerの導入について)
- [3. Dockerfile、Docker Composeについて](#3-dockerfiledocker-composeについて)
  - [3.1 Dockerfileについて](#31-dockerfileについて)
  - [3.2 Dockerfileの構成](#32-dockerfileの構成)
  - [3.3 Docker Composeについて](#33-docker-composeについて)
  - [3.4 Docker Composeの構成](#34-docker-composeの構成)
- [4. Docker基本コマンド](#4-docker基本コマンド)
  - [4.1 Dockerのイメージを作成](#41-dockerのイメージを作成)
  - [4.2 Dockerのコンテナの操作](#42-dockerコンテナの操作)



## 1. Dockerについて

[Docker超入門講座 合併｜ゼロから実践する4時間のフルコース](https://www.youtube.com/watch?v=lZD1MIHwMBY)  
Dockerとはなにかを説明してくれている動画。

## 2. Dockerの導入について

[Docker 導入方法（dotinstall）](https://dotinstall.com/lessons/basic_dockerdesktop_win)

## 3. Dockerfile、Docker Composeについて

### 3.1 Dockerfileについて

Dockerfileとは、口述するDockerイメージを作るための設計図である。  
よくDockerfileとDockerイメージの違いについてわからなくなることがあるが、定義的には以下のように捉えると良い：

- **Dockerfile**：設計図
- **Dockerイメージ**：システムの完成品（実体なし）
- **Dockerコンテナ**：システムの完成品（実体あり）

料理に例えると以下の通り：

- **Dockerfile**：レシピ
- **Dockerイメージ**：料理の完成品（写真）
- **Dockerコンテナ**：提供された料理の完成品（実物）


### 3.2 Dockerfileの構成

#### `FROM ベースイメージ名  `
ベースイメージでは、すでに用意された環境を仮想環境に搭載することができる。

例：
```dockerfile
FROM php:8.2-apache
```

#### `RUN コマンド`
イメージ構築時に実行されるコマンドを記述する。

``` dockerfile
RUN apt-get update && apt-get install -y git
```
この場合はイメージ構築時にapt-getの更新とgitのダウンロードを行う。

#### `WORKDIR　ディレクトリ名`
WORKDIRではその後の作業でのカレントディレクトリ(現在のディレクトリ)を設定する。
```dockerfile
 WORKDIR /var/www/html
 ```
この場合は/var/www/htmlを作業ディレクトリとする。


#### `COPY 自身のファイルパス イメージ内のコピー先`
自身のファイルをイメージにコピーする
```dockerfile
 COPY index.php /var/www/html/
 ```
この場合は自身のindex.phpをイメージ内の/var/www/html/にコピーする。

#### `ADD URL or ファイル`
COPYと違いURLなどからファイルをダウンロードする場合はADDを使う。


#### `EXPOSE port番号`
外部に公開するポート番号(いわゆる送受信のための出入口)を設定。設定する場合はDocker container run -pコマンドを使う必要がある。

### その他の設定(必須じゃないけど知っとくと便利)
#### `VOLUME 保存用のファイル`
Dockerコンテナ内で作成されたファイルはコンテナを削除するとすべて消える。それらを保存するためにVOLUMEがある。
```dockerfile
 VOLUME /data
 ```
この場合は/dataがボリュームとして自動的にDockerに管理される。

### 3.3 Docker composeについて
LAMP環境などは基本役割ごとにサーバーをDocker開発環境下ではコンテナを分けるべきである。ただ一つ一つのコンテナを定義実行管理するのは面倒くさい。その仕事を行うのがDocker composeである。
Docker composeの仕事は主に複数コンテナの起動・停止、状態確認、実行中サービスのログ確認をする。Doker composeは基本ymlを拡張子に持つ。

### 3.4 Docker composeの構成
#### `version: '3.8'`
使用しているDocker composeのバージョンを指定する。

#### `seveices:` 
このセクションの仮想でコンテナを複数定義できる。
```yaml
 services:
 任意の名前:
 	各設定
 任意の名前:
 	...
```
##### services内の設定
#### `image: ベースイメージ名`
そのコンテナのベースイメージの設定

#### `container_name: コンテナ名`
コンテナ名を指定、指定しない場合はランダム

#### `volumes:ホスト側のフォルダ:コンテナ内のフォルダ`
ホスト側の変更をコンテナ内の変更と同期させる(マウント)

#### `port: "ホスト側のポート:コンテナ内のポート"`
ホスト側のポートをコンテナのポートにマッピングする

##### 高度な設定
#### `depends_on:サービス名`
ほかのサービスがある場合、ここに書くとそのサービスが先に起動するようになる。

#### `restart: `
設定されたコンテナが停止しても自動的に再起動する設定。(本番環境向き)。引数は以下の4つが存在する。
- **"no"** : default 再起動しない
- **always** : コンテナが削除されるまで停止しても起動し続ける
- **on-failure** : exitコードがエラーを出した時だけ再起動する
- **unless-stopped** : alwaysとほとんど同じだが手動で止めたら起動しない

#### `environment: 環境変数設定`
環境変数を設定する。MYSQLの設定などで使う

### 3.4 Docker composeのTips
#### volumeについて
基本volumeは前述したようにホスト側のファイル:コンテナ内のファイルという書き方をするが、単純に以下のように書くこともある。

#### `volume:ホスト側のファイル`
これは何がマウントされているかを明示するためだ。実際はDockerが自動でそのファイルをvolumeしてくれるが、開発規模が大きくなったときどのファイルをvolumeしているかわからなくなるため明示するほうがいい。

#### Docker composeとDockerfileの併用
コンテナ内に追加のライブラリを入れあい場合や設定ファイルを変更したい場合、テスト環境と開発環境を分けたい場合などは、各コンテナの招請を設定できるDockerfileを使うことができる。その時は以下の文章をDocker composeの任意のコンテナ設定内に追加する。
```dockerfile
     build:
       context: ./web
       dockerfile: Dockerfile
```
## 4 Docker基本コマンド
dockerのイメージとは作りたい仮想環境の設計図のようなもの。イメージではDockerfileが指示書、Dockerイメージは設計図、Dockerコンテナが完成品のようなものである。

### コンテナが一つの場合
### 4.1 Dockerのイメージを作成
```powershell
 docker image build [オプション] パス/URL
 ```
 よく使うオプション
```dockerfile
 -t  イメージに名前とタグを付与
 例）docker image build -t myapp:1.0 .
 
 -f　Dockerfileのファイル名を指定する(デフォルトはDockerfile)
 例) docker image build -f Dockerfile.dev .
 
 --build-arg Dockerfileに引数を入力
 例) docker image build --build-arg VERSION=18 .
 
  --pull ベースイメージを常に最新のものにする
  例) docker image build --pull -t myapp .
```
#### 例文

```powershell
 docker image build -t test:1.0 .
 ```
カレントディレクトリ下にDockerfileがあり、imageの名前をtest, versionが1.0の場合
### 4.2 Dockerコンテナの操作
コンテナの起動
```powershell
 docker container run [オプション] イメージ名
 ```
 
 よく使うオプション
 ```
 -d バックグラウンドでコンテナを起動
 例) docker container run -d image_name
 
 -it コンテナに接続して中でコマンド実行できるようになる(対話モード)
 例) docker container run -it image_name bash
　‼　コンテナが起動してもすぐ閉じてしまう場合は-itをつける必要がある
　
　--name コンテナに任意の名前をつける
　例)　docker container run -d --name image_name
　
　-p ホストのポートをコンテナのポートに転送する
　docker container run -p 8080:80 image_name
　
　-v コンテナ内で行った変更をマウントしてローカル環境に反映
　例) 
 docker volume create mydata
　docker container run -d -v mydata:コンテナ内のディレクトリ　image_name
　
　--network コンテナにネットワークを指定(複数のコンテナを同一ネットワーク内で使用するときに使う)
　例) docker network create mynet
　　　docker container run -d --network=mynet image_name
```

コンテナ内のshellを起動
```powershell
 docker exec -it コンテナ名 bash 
 ```
コンテナの状態確認
```powershell
 docker image ls イメージの表示 -aで実行されてないコンテナも確認可能
 docker container ls　コンテナの表示
 docker container logs コンテナがどのように動いているかわかる
 ```
コンテナの削除、停止
```powershell
 docker system prune -a　使っていないコンテナを止めることができる
 docker stop コンテナ名　特定のコンテナを止める
```
### コンテナが複数の場合
### 4.3 複数コンテナの操作
複数コンテナの起動
```powershell
 docker-compose up 
 -d バックグラウンド起動
 -y コンテナ起動時の回答をYesにする
 ```
複数コンテナの状態確認
```powershell
 docker-compose ps コンテナの一覧表示
 docker-compose logs ログの表示(-f でリアルタイム監視)
 ```
複数コンテナの停止、削除、再起動	
```powershell
 docker-compose stop 停止
 docker-compose down　削除
 docker-compose restart 再起動
 ```
コンテナ内に入る
```powershell
 docker-compose exec サービス名 bash
```