Dockerの基本操作について

# Docker基本コマンドの備忘録
Dockerについて学習したのでDockerコマンドに関してまとめました。


### コンテナ操作の基本はDockerコマンド
コンテナを操作するコマンド文は、すべて「docker」コマンドから始まる。  
dockerと書いてから「何を」「どうする」「対象」等を記述し、[Enter]キーを押すと実行される。

dockerコマンドの基本
``` bash
docker ～
```
dockerコマンドの基本形
```bash
docker コマンド (オプション) 対象 (引数)
```

---

#### コンテナ操作関連コマンド（上位コマンドは「container」）
```bash
docker container (副コマンド) (オプション)
```
副コマンド|内容|省略|主なオプション
-|-|-|-
start|コンテナを開始する|可|-i
stop|コンテナを停止する|可|特になし
create|Dockerイメージからコンテナを作成する|可|--name -e -p -v
run|Dockerイメージをダウンロードし、コンテナを作成して起動する|可|--name -e -p -v -d -i -t
rm|停止したコンテナを削除する|可|-f -v
exec|実行中のコンテナ内でプログラムを実行する|可|-i -t
ls|コンテナ一覧を表示する|docker ps|-a
cp|DockerコンテナとDOckerホスト間でファイルをコピーする|可|特になし
commit|Dockerコンテナをイメージに変換する|可|特になし

---

#### イメージ操作関連コマンド（上位コマンドは「image」）
```bash
docker image (副コマンド) (オプション)
```
副コマンド|内容|省略|主なオプション
-|-|-|-
pull|Docker Hubなどのリポジトリからイメージをダウンロードする|可|特になし
rm|Dockerイメージを削除する|docker rmi|特になし
ls|自分がダウンロードしたイメージ一覧を表示する|不可|特になし
build|Dockerイメージを作成する|可|-t

---

#### ボリューム操作関連コマンド（上位コマンドは「volume」）
```bash
docker volume (副コマンド) (オプション)
```
副コマンド|内容|省略|主なオプション
-|-|-|-
create|ボリュームを作る|不可|--name
inspect|ボリュームの詳細情報を表示する|不可|特になし
ls|ボリュームの一覧を表示する|不可|-a
prune|現在マウントされていないボリュームをすべて削除する|不可|特になし
rm|指定したボリュームを削除する|不可|特になし

---

#### ネットワーク操作関連コマンド（上位コマンドは「network」）
```bash
docker network (副コマンド) (オプション)
```
副コマンド|内容|省略|主なオプション
-|-|-|-
connect|コンテナをネットワークに接続する|不可|特になし
disconnect|コンテナをネットワークから切断する|不可|特になし
create|ネットワークを作る|不可|特になし
inspect|ネットワークの詳細情報を表示する|不可|特になし
ls|ネットワークの一覧を表示する|不可|特になし
prune|現在コンテナがつながっていないネットワークをすべて削除する|不可|特になし
rm|指定したネットワークを削除する|不可|特になし

---

#### その他上位コマンド
上位コマンド|内容
-|-|
checkpoint|現在の状態を一時的に保存し、後でその時点に戻ることができる。実験的な機能|
node|Docker Swarmのノードを管理する機能|
plugin|プラグインを管理する機能|
secret|Docker Swarmのシークレット情報を管理する機能|
service|Docker Swarmのサービスを管理する機能|
stack|Docker SwarmやKubernetesでサービスをひとまとめにしたスタックを管理する|
swarm|Docker Swarmを管理する機能|
system|Docker Engineの情報を取得する|

---

#### 単独コマンド
単独コマンド|内容|主なオプション
-|-|-|
login|Dockerレジストリにログインする|-u -p
logout|Dockerレジストリからログアウトする|特になし
search|Dockerレジストリで検索する|特になし
version|Docker Engineおよびコマンドのバージョンを表示する|特になし


---

### コンテナの作成・削除と起動・停止
コンテナの起動には「docker run」コマンドを使う。  
このコマンドは、Dockerのコンテナを作成し、起動するコマンド。  
コンテナの作成には、イメージが必要で、イメージがない場合はイメージのダウンロードも行う。
```bash
docker run (オプション) イメージ (引数)
```
#### 主なオプション
オプションの書式|内容
-|-|
--name コンテナ名|コンテナ名を指定する
-p ホストのポート番号:コンテナのポート番号|ポート番号を指定する
-v ホストのディスク:コンテナのディレクトリ|ボリュームをマウントする
--net=ネットワーク名|コンテナをネットワークに接続する
-e 環境変数名=値|環境変数を指定する
-d|バックグラウンドで実行する
-i|コンテナに操作端末（キーボード）をつなぐ
-t|特殊キーを使用可能にする
-help|使い方を表示する

#### コンテナを停止するコマンド
```bash
docker stop コンテナ名
```

#### コンテナを削除するコマンド
```bash
docker rm コンテナ名
```

---

#### 動いているコンテナの一覧を表示する
```bash
docker ps
```

#### 存在するコンテナの一覧を表示する
```bash
docker ps -a
```

#### docker ps実行結果の見方
項目|内容
-|-|
CONTAINER ID|コンテナID。ランダムな数字が振られる。本来のIDは64文字だが、先頭12文字のみ表記
IMAGE|元となったイメージ名
COMMAND|コンテナにデフォルトで起動するように構成されているプログラム名。あまり意識することはない
CREATED|作られてから経過した時間
STATUS|現在のステータス。動いている場合は「Up」動いていない場合は「Exited」と表記される
PORTS|割り当てられているポート番号が「ホストのポート番号->コンテナのポート番号」の形式で表示される
NAMES|コンテナ名


---
#### イメージの削除
コンテナは削除していても、イメージはたまり続けている。  
イメージは増えてくるとストレージを圧迫してしまうので、不要になったものはどんどん削除すること
```bash
docker image rm イメージ名
# 複数指定する場合
docker image rm イメージ名 イメージ名 イメージ名
```

#### イメージ一覧を表示する
```bash
docker image ls
```

#### イメージ一覧の見方
項目|内容
-|-|
REPOSITORY|イメージ名
TAG|バージョン情報。イメージをダウンロードするときに指定していないと「latest(最新版)」をダウンロードしたことになる
IMAGE ID|イメージID。本来のIDは64文字だが、先頭12文字のみの表記。12文字のみでもIDとして使用できる
CREATED|作られてから経過した時間
SIZE|イメージのファイルサイズ


---
### ボリュームのマウント
Dockerに記憶領域をマウントする方法は「ボリュームマウント」と「バインドマウント」の2種類がある。
##### ボリュームマウント
ボリュームマウントは、Docker Engineが管理している領域内にボリュームを作成し、ディスクとしてコンテナにマウントする。  
名前だけで管理できるため手軽に扱える半面、ボリュームに対して直接操作しづらい。  
「仮で使いたい場合」や「滅多に触らないが、消してはいけないファイル」を置くのに使うことが多い。

##### バインドマウント
バインドマウントは、Dockerをインストールしたパソコンのディレクトリなど、Docker Engineの管理していない場所の既に存在するディレクトリをコンテナにマウントする。  
ディレクトリだけでなく、ファイル単位でマウントすることもできる。ディレクトリに対して直接ファイルを置いたり開いたりできるため、頻繁に触りたいファイルは、ここに置く。

##### マウントの違い
項目|ボリュームマウント|バインドマウント
-|-|-|
記憶領域|ボリューム|ディレクトリやファイル
マウントの場所|Docker Engine管理下|どこでも可能
マウントの動作|ボリュームを作成してマウント|既存のファイルやフォルダをマウント
内容の編集|Dockerコンテナを経由して行う|普通のファイルとして扱う
バックアップ|複雑な手順|普通のファイルとして扱う

#### ボリューム作成
```bash
docker volume create ボリューム名
```

#### ボリューム削除
```bash
docker volume rm ボリューム名
```

#### 記憶領域をマウントするコマンド
```bash
# バインドマウントの記述例
docker run (省略) -v 実際の記憶領域パス:コンテナの記憶領域パス (省略)

# ボリュームマウントの記述例
docker run (省略) -v ボリューム名:コンテナの記憶領域パス (省略)
```

---
### コンテナのイメージ化
既にあるコンテナを利用すれば、誰でも簡単にイメージを作ることができる。  
オリジナルのイメージを作成することで、同じ構成のコンテナを量産でき、他のパソコンやサーバに移動させることもできる。  
イメージの作成方法は「commit」でイメージの書き出しをする方法と、「Dockerfile」でイメージを作る方法がある。

1. commitでイメージを書き出す
   コンテナを用意して、それをイメージに書き出す。コンテナがあればコマンド1つで作成できるので手軽。  
   ただしコンテナを作り込む必要がある。すでにあるコンテナを複製したい、移動したいなどの用途に便利。
   ```bash
   docker commit コンテナ名 作成するイメージ名
   ```

  
2. Dockerfileでイメージを作成する
   「Dockerfile」という名前のファイルを用意して、それを「build」することでイメージにする。  
   Dockerfileには、元となるイメージや、実行したいコマンドなどを記載する。編集はテキストエディタで行う。
   ```bash
   docker build -t 作成するイメージ名 材料フォルダのパス
   ```
#### 主なDockerfileコマンド
コマンド|内容
-|-|
FROM|元にするイメージを指定する
ADD|イメージにファイルやフォルダを追加する
COPY|イメージにファイルやフォルダを追加する
RUN|イメージをビルドするときにコマンドを実行する
CMD|コンテナを起動するときに実行する既定のコマンドを指定する
ENTRYPOINT|イメージを実行するときのコマンドを強要する
ONBUILD|ビルド完了したときに任意の命令を実行する
EXPOSE|通信を想定するポートをイメージの利用者に伝える
VOLUME|永続データが保存される場所をイメージの利用者に伝える
ENV|環境変数を定義する
WORKDIR|RUN、CMD、ENTRYPOINT、ADD、COPYの際の作業ディレクトリを指定する
SHELL|ビルド時のシェルを指定する
LABEL|名前やバージョン番号、制作者情報などを設定する
USER|RUN、CMD、ENTRYPOINTで指定するコマンドを実行するユーザやグループを設定する
ARG|docker buildする際に指定できる引数を宣言する
STOPSIGNAL|docker stopする際に、コンテナで実行しているプログラムに対して送信するシグナルを変更する
HEALTHCHECK|コンテナの死活確認をするヘルスチェックの方法をカスタマイズする　

---
### コンテナの改造
コンテナに対してLinuxのコマンドを命令して、ソフトウェアのインストールや設定ファイルの書き換えをする。  
コンテナは、何も指定せずに起動すると、bashが動いていない状態になる。なのでbashを起動して、命令を受け取って貰う状態にする。
```bash
# 「exec」コマンドに引数を付けた例
docker exec (オプション) コンテナ名 /bin/bash
# 「run」コマンドに引数を付けた例
docker run (オプション) イメージ名 /bin/bash

# Apacheコンテナにbash引数を付けた例
# exec例
docker exec -it apachesample /bin/bash
# run例
docker run --name apachesample -it -p 8080:80 httpd /bin/bash
```

---
### Docker Composeファイルについて
構築に関わるコマンド文の内容を1つのテキストファイル（定義ファイル）に書き込んで、一気に実行したり、停止・破棄したりできるのがDocker compose。  
Docker Composeでは、構築に関する設定を記述した定義ファイルをYAML形式で用意し、ファイルの中身を「up」したり「down」したりする。  
「up」コマンドは、イメージをダウンロードしたり、コンテナを作成・起動したりする。定義ファイルにはネットワークやボリュームについても書けるのでそうした周辺の環境も一緒に作られる。  
「down」コマンドは、コンテナとネットワークを停止・削除する。ボリュームとイメージはそのまま。削除せずに停止のみを行いたい場合は「stop」コマンドを使う。

#### 定義ファイルの項目
##### 大項目
項目|内容
-|-|
services|コンテナに関する定義をする
networks|ネットワークに関する定義をする
volumes|ボリュームに関する定義をする
##### よく使われる定義内容
項目|docker runでの対応|内容
-|-|-|
image|イメージ引数|利用するめいーじを指定する
networks|--net|接続するネットワークを指定する
volumes|-v、--mount|記憶領域のマウントを設定する
ports|-p|ポートのマッピングを設定する
environment|-e|環境変数を設定する
depends_on|なし|別のサービスに依存することを示す
restart|なし|コンテナが停止したときに再試行ポリシーを設定する
##### restartの設定値
設定値|内容
-|-|
no|何もしない
always|必ず再起動する
on-failure|プロセスが0以外のステータスで終了したときは再起動する
unless-stoppend|停止していたときは再起動しない。それ以外は再起動する
##### その他の定義項目
項目|docker runでの対応|内容
-|-|-|
command|コマンド引数|起動時の既定のコマンドを上書きする
container_name|--name|起動するコンテナ名を明示的に指定する
dns|--dns|カスタムなDNSサーバを明示的に設定する
env_file|なし|環境設定情報を書いたファイルを読み込む
entrypoint|--entrypoint|起動時のENTRYPOINTを上書きする
external_links|--link|外部リンクを設定する
extra_hosts|--add-host|外部ホストのIPアドレスを明示的に指定する
logging|--log-driver|ログ出力先を設定する
network_mode|--network|ネットワークモードを設定する