Docker について

## Docker について

### 概要

自分のメモ用だが、他の方の参考になれば。。

### 仕組みについて

以下のサイトが参考になるかも

- [【図解】Docker の全体像を理解する -前編-](https://qiita.com/etaroid/items/b1024c7d200a75b992fc)
- [Docker イメージの理解を目指すチュートリアル](https://qiita.com/zembutsu/items/24558f9d0d254e33088f)

### CLIについて

- 公式ドキュメントは以下。
  [コマンドライン リファレンス](https://docs.docker.jp/engine/reference/index.html)
- 自分が調べたCLIコマンドは以下。

|コマンド名|説明|
|:-----------|:-----------|
|docker build|Docker イメージ作成|
|docker run|Docker コンテナ実行|
|docker ps|Docker コンテナ表示|
|docker rm|Docker コンテナ削除|
|docker images|Docker イメージ表示|
|docker rmi|Docker イメージ削除|
|docker attach|起動済みの Docker コンテナにアタッチ|
|docker start|Docker コンテナを起動|
|docker stop|Docker コンテナを停止|

#### docker build

- コマンド

```docker
docker build [オプション] パス | URL | -
```

- 説明
  - コンテナイメージを構築するコマンド
  - 実行時に Dockerfile 内で指定した OS(CentOS や Linux など)やミドルウェア(JDK や Ruby など)やアプリのインストールなどを行い、コンテナの元となるイメージファイルを作成する。
  - パスや URL は、Dockerfile が置いてる場所を指定可能。基本的に、Dockerfile を置いてる場所に、`cd`し、カレントディレクトリの`.`を指定する。
  - 指定可能なオプションは以下。

| オプション  | 説明                                                                                                                                                                                                                                                                                                                   |
| :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| --build-arg | 変数を指定する。<br/>複数指定する場合は、<br/>docker build --build-arg=○○ --build-arg=△△<br/>のように複数回指定する。                                                                                                                                                                                                  |
| -f          | Dockerfile の名前（デフォルトは パス/Dockerfile ）                                                                                                                                                                                                                                                                     |
| --no-cache  | イメージの構築時にキャッシュを使用しない場合に、<br/>docker build --no-cache=true<br/>で指定する。<br/>Dockerfile 書き換えたのに、「exist」みたいな表示が出た時にこのオプションを指定すれば大体解決する。                                                                                                              |
| -t          | タグを 名前:タグ の形式で指定<br/>`<repoName>/<imageName>:<tagName>`や<br/>`<imageName>:<tagName>`<br/>で指定可能。<br/>例えば、最新バージョンの場合は、`○○:latest`のように指定する。<br/>複数指定する場合は、<br/>docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1<br/>のように複数回指定する。 |

#### docker run

- コマンド

```docker
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
```

- 説明
  - 指定されたイメージからコンテナ・レイヤを create （作成）する。それから、指定されたコマンドを使って start （開始）する。
  - docker create と docker start を内部的に行ってるのが、run コマンド。
  - Docker イメージ「whenry/fedora-jboss:latest」を実行したい場合は以下。  
    `docker run whenry/fedora-jboss:latest`
  - 指定可能なオプションは以下。

| オプション              | 説明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| -it                     | コンテナ内部とやりとりするためのコマンドで、bash コマンドと組み合わせることで、ssh 接続されたかのように、コンテナ内部からコマンドを実行することができる。<br/>例えば、以下。<br/>docker run -it centos:centos8 /bin/bash                                                                                                                                                                                                                                                                                            |
| --name [name]           | コンテナ名を指定して実行する。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| --rm                    | コンテナ終了時に、コンテナを自動的に削除する。 このオプションを使用することで、コンテナが終了した後に手動で削除する必要がなくなる。                                                                                                                                                                                                                                                                                                                                                                                 |
| -e [環境変数名]=[値]    | コンテナ内で使用する。環境変数を指定する。<br/>複数指定したい場合は以下。<br/>-e var1=val -e var2="val 2"                                                                                                                                                                                                                                                                                                                                                                                                           |
| --env-file [ファイル名] | ファイルからも環境変数を読み込める。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| --detach                | コンテナをバックグラウンドで実行する。<br/>対話型のコンテナを実行する場合には使用できない。 対話型のコンテナを実行する場合は、代わりに -it オプションを使用する必要がある。<br/>アタッチしたい場合は、<br/>`docker attach [コンテナ ID]`<br/>例えば、LINUX のコンテナをデタッチした状態で起動し、後でアタッチするとなった場合は、<br/>\<Docker 実行><br/>`docker run --detach linux:latest`<br/>\<Docker のプロセス確認><br/>`docker ps`<br/>\<アタッチ><br/>`docker attach [コンテナ ID]`<br/>`root@[コンテナ ID]:/#` |

#### docker ps

- コマンド

```docker
docker ps [OPTIONS]
```

- 説明
  - コンテナを一覧表示する。
  - 指定可能なオプションは以下。

| オプション | 説明                                                         |
| :--------- | :----------------------------------------------------------- |
| --all、-a  | 全てのコンテナを表示（デフォルトは実行中のコンテナだけ表示） |

#### docker rm

- コマンド

```docker
docker rm [OPTIONS] CONTAINER [CONTAINER...]
```

- 説明
  - 1 つまたは複数のコンテナを 削除する。
  - 指定可能なオプションは以下。

| オプション  | 説明                           |
| :---------- | :----------------------------- |
| --force、-f | 実行中のコンテナを強制的に削除 |

#### docker rmi

- コマンド

```docker
docker rmi [OPTIONS] IMAGE [IMAGE...]
```

- 説明
  - 1 つまたは複数のイメージ を削除する。
  - 指定可能なオプションは以下。

| オプション  | 説明               |
| :---------- | :----------------- |
| --force、-f | イメージの強制削除 |

#### docker attach

- コマンド

```docker
docker attach [オプション] コンテナ
```

- 説明
  - ローカルの（訳者注：操作中のターミナルのこと）標準入力、標準出力、標準エラー出力を、実行中のコンテナに対して 取り付ける。
  - コンテナを停止するには、 CTRL-c や exit コマンド を使う。
  - 停止せず、デタッチする場合は、CTRL-p CTRL-q キーを使う。

#### docker start

- コマンド

```docker
docker start [OPTIONS] CONTAINER [CONTAINER...]
```

- 説明
  - 作成済みの Docker コンテナを起動する。

#### docker stop

- コマンド

```docker
docker stop [OPTIONS] CONTAINER [CONTAINER...]
```

- 説明
  - 起動済みの Docker コンテナを停止する。

### Dockerfileについて

- Docker イメージの元となるファイル。
- `命令 引数`で記述する。
- Docker は Dockerfile 内の命令を記述順に実行する。
- コンテナ内のレイヤーを作るのは FROM、RUN、COPY、ADD のコマンド。
- 上記の 4 コマンドを使いすぎると容量を圧迫する可能性があるので注意。
- 公式ドキュメントは以下。
  [Dockerfile リファレンス](https://docs.docker.jp/engine/reference/builder.html#builder-format)



| 命令       | 説明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| :---------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| FROM [--platform=<プラットフォーム>] <イメージ名> [AS <名前>]       | FROM以降の命令のベースとなる親イメージ。<br/>一番最初に書く。これより前に書けるのは、ARGのみ。<br/>基本的に DockerHub にあるイメージを指定すればいいかも。<br/>https://hub.docker.com                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| \#          | コメントアウト                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| RUN \<コマンド> <br/>RUN \["実行ファイル", "パラメータ1", "パラメータ2"]       | コマンドを実行する。<br/>RUN 命令（で処理された内容）のキャッシュは、次回以降の構築時にも、自動的に有効<br/>`RUN apt-get dist-upgrade -y` のような命令に対するキャッシュは、次の構築時に再利用される。<br/> RUN 命令に対するキャッシュを無効にするには、 `docker build --no-cache` のように `--no-cache` フラグを使う。<br/>Dockerfile 中に ADD 命令と COPY 命令が出てくると、以降の RUN 命令の内容はキャッシュされない。<br/>コマンドを&&で繋げて 1 回の RUN で実行も可能。（バックスラッシュで改行できる）                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| CMD \["実行ファイル","パラメータ1","パラメータ2"] （ こちらが望ましい ）<br/>CMD \["パラメータ1", "パラメータ2"] （ ENTRYPOINT 命令に対するデフォルトのパラメータとして扱う）<br/>CMD コマンド パラメータ1 パラメータ2 （シェル形式）        | コンテナ実行時のデフォルトのコマンドを指定する。1度しか書けない。原則 Dockerfile の最後に記述する。<br/>実行したいコマンドがない場合は`"/bin/bash”`とするのが一般的。<br/>CMD がないと FORM で取得してきているイメージのデフォルトコマンドが実行されるが、何が実行されるか不明なため、CMD で実行コマンドを記述するようにした方がわかりやすい。<br/>レイヤーで持っておかなくていい場合は、CMD コマンドを使用し、<br/>レイヤーで持っておきたい場合は、RUN コマンドを使用する。 |
| COPY \[--chown=<ユーザ>:<グループ>] <コピー元>... <コピー先><br/>COPY [--chown=<ユーザ>:<グループ>] ["<コピー元>",... "<コピー先>"]       | Dockerfile 以外のファイル（またはディレクトリ）を Dockerイメージに組み込むことが可能。<br/>\<コピー元>は複数指定可能                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ADD \[--chown=<ユーザ>:<グループ>] \<追加元>... <追加先> <br/>ADD [--chown=<ユーザ>:<グループ>] ["<追加元>",... "<追加先>"]      | コピーするファイルが圧縮ファイルの場合、自動解凍される。<br/>\<追加元>は、複数指定可能。また、GitHubなどインターネット上のファイルも指定可能。<br/>\<追加先> は絶対パスか WORKDIR （作業ディレクトリ）からの相対パス<br>COPYは自動解凍されない。また、GitHubなどインターネット上のファイルは指定できない。                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ENTRYPOINT \["実行ファイル", "パラメータ1", "パラメータ2"]<br/>ENTRYPOINT コマンド パラメータ1 パラメータ2 | コンテナのデフォルトのコマンドを指定する。<br/>特徴としては、docker run 時に別のコマンドを実行させる事ができなくなる（コマンドの上書きが不可能）。上書きしたい場合は、CMDを使って以下のように実行。<br/>FROM ubuntu<br/>ENTRYPOINT \["top","-b"]<br/>CMD \["-c"]                                                                                                                   |
| ENV \<キー>=<値>        | 環境変数を設定する際に使用する。   |
| WORKDIR    | Dockerfile 内のコマンドは、ルートディレクトリで実行されるため、実行するディレクトリを変更したい場合に使用する。<br/>WORKDIR で指定したディレクトリが存在しない場合は、そのディレクトリが自動で作成されるため、mkdir などでディレクトリを作成する必要はない。                                                                                                                                                                                                                                                                                                           |
| VOLUME \["/data"]     | コンテナ内で発生したデータは同じコンテナ内のどこかに書き出されるが、コンテナを破棄すると消える。<br/>そのデータを永続化させたい場合に使用する。<br/>Windows の場合、以下にマウントされる。<br/>`\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes`<br/>ホスト側(Windows 側)のマウント先を変更したい場合は、\["/data"]を以下のように指定する。<br/>\{ホスト側ディレクトリ}:{コンテナ側ディレクトリ}                                                                                                                                                              |
| EXPOSE     | コンテナが公開するポートを指定するコマンド。ただ、これはコンテナ側から公開するだけなので、実際にホスト側からアクセスするには、`docker run -p [ホスト側ポート]:[コンテナ側ポート]` みたいにして、ホスト側とコンテナ側でバインドする必要がある。                                                                                                                                                                                                                                                                                                                                                                             |
| ARG \<名前>[=<デフォルト値>]        | CLI上から引数を代入するキーを指定するコマンド。docker build時に`--build-arg <key>=<value>` オプションで代入することで、 Dockerfile 内で値を使い回すことが可能。 |