Dockerの基本コマンド

## どんな記事？
CLI（コマンドライン）を用いてDockerコンテナを管理する際に必要となる基本的なコマンドを丁寧に列挙していきます。
普段DockerDesktopをメインで使われている方でも知っておくと役に立つタイミングがあるのでぜひご一読ください。
## 前提
### Dockerを構成する基本要素
#### DockerContainers(以下、コンテナと呼ぶ)
- その名の通り、Dockerで扱われるコンテナのこと
- とりあえずマシン（サーバ）の実態と思ってよい
:::note info
本記事ではコンテナ技術そのものについての説明は割愛します。
以下記事などが分かりやすいので、そもそもコンテナとは？となった人はぜひご参照ください。
- https://pepa.holla.cz/wp-content/uploads/2016/10/Using-Docker.pdf
:::
#### DockerImages(以下、イメージと呼ぶ)
- コンテナから見えるファイル群や実行するアプリケーション、各種設定情報など
- これをもとに下記のデーモンがコンテナを作成する
- [Dockerfile](https://qiita.com/nana-solid/items/fb05da4e89a376156981)から生成される
#### DockerDeamon（以下、デーモンと呼ぶ）
- Dockerアーキテクチャの中心
- コンテナの作成、実行、監視、イメージの構築と保存を担当する
#### DockerClient(以下、クライアントと呼ぶ)
- ユーザーがデーモンと対話するために使用される
#### DockerRegistry(以下、レジストリと呼ぶ)
- イメージの保存、配布を指定した範囲で共有する
    - GithubのDocker版というイメージ
- Dockerhubのこと

![Docker components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723230/4260d923-bc3c-fc95-17bb-270515306187.png)
cf:https://pepa.holla.cz/wp-content/uploads/2016/10/Using-Docker.pdf
### よく使うコマンド
#### docker login
- レジストリ（dockerhub）にログインする
- ローカル上に存在しないイメージをレジストリからpullしてくるために必要となる
```
$ docker login 
$ Username:{dockerhubのユーザーネーム}
$ Password:{dockerhubのパスワード}
```
:::note info
事前にdockerhubのアカウントを作成する必要がある。
- https://hub.docker.com/
:::
####  docker run
- イメージからコンテナを1つ起動する
- コンテナを作成するためのイメージがローカルに存在しない場合、dockerhubから自動で取得（pull）し起動する
```
$ docker run {イメージ名}
```
- オプション
    - --name
        - コンテナに任意の名前をつける
    - --rm
        - プロセスが終了したらコンテナを削除
    - --volune
        - コンテナにホストのディレクトリをマウント
    - -it
        - コンテナの中に入る
    - -p
        - コンテナにアクセスするポートの解放
    - -d
        - コンテナをバックグラウンドで実行する
    - --env
        - 環境変数（DBのパスワードなど）を渡す
#### docker ps
- 起動中のコンテナ一覧を表示する
- コンテナごとの作成時刻や状態（実行中、終了、一時停止など）が分かる
- オプション
    - -a
        - 停止しているコンテナを含めて表示する
```
$ docker ps -a
```
#### docker start
- コンテナを起動する
```
$ docker start {コンテナのID or name}
```
#### docker stop
- コンテナを停止する
```
$ docker stop {コンテナのID or name}
```
#### docker restart
- コンテナを再起動する
```
$ docker restart {コンテナのID or name}
```
#### docker exec
- 起動中のコンテナ内で**新しいプロセスを作成して**コマンドを実行する
    - →コンテナ中のファイルやディレクトリをみたり、実行したりすることができる
- オプション
    - it
        - コンテナに入ることができる（runのitオプションと同じ）
```
$ docker exec {コンテナID or name} {実行したいコマンド}
```
:::note warn
メインプロセスに直接接続したい場合、docker attachコマンドを使用すること
:::

#### docker rm
- 停止中のコンテナを削除する
- オプション
    - -f
        - 強制削除
        - 起動中のコンテナも削除できるが注意して使用すること
```
$ docker rm -f {コンテナID or name}
```
#### docker images
- ローカルのイメージ一覧を表示する
```
$ docker images
```
#### docker rmi
- イメージを削除する
- コンテナが存在するイメージは削除できない
- 複数イメージで依存関係がある場合、親にあたるイメージ（ベースイメージと呼ぶ）を削除しないとエラーになる
```
docker rmi {イメージのID}
```
#### docker build
- Dockerfileからイメージを生成する
```
docker build {Dockerfileのパス}
```
#### docker cp
- コンテナとホストマシン（クライアント）でファイルのやり取りを行う
- ログファイルや設定ファイルの取り出しや入力で使用されがち
##### ホスト→コンテナへコピー
```
$ docker cp {ホストのコピー元ファイルパス} {コンテナID or name + :コピー先ディレクトリパス}
```
##### コンテナ→ホストへコピー
```
$ docker cp {コンテナID or name + :コピー元ディレクトリパス} {ホストのコピー先ディレクトリパス}
```
:::note warn
いずれのパターンでも、コンテナ内ではなくホスト側でコマンドを実行すること（=対象コンテナを指定する必要がある）
:::
#### docker logs
- コンテナのログ出力をする
- コンテナの異常やアクセスログの解析に使われる
- オプション
    - -f
        - リアルタイムログの参照
        - Linuxコマンド「tail -f」のイメージ
        - Ctrl+C を押すと、現在のプロセスが中断され、ログの追跡が停止する
```
$ docker logs {コンテナID or name}
```
:::note warn
docker execで新しく起動したプロセスの出力は、通常docker logsでは表示されない点に注意（docker run -itかdocker attachでメインプロセスに接続すること）
:::
### おまけ
頻出ではないが、覚えておくと役に立つかもしれないコマンド
#### docker inspect
- コンテナの詳細情報を出力する
- マウントや設定、環境変数、IPアドレス（ホスト向けの内部IP）の情報などが参照できる
```
$ docker inspect {コンテナID or name}
```
#### docker pull
- イメージのダウンロードを行う 
- pullの後ろに「プライベートレジストリ」をつけるとレジストリ以外からダウンロードが可能
```
$ docker pull {イメージ名:タグ or レジストリURL}
```
#### docker commit
- コンテナをイメージ化する
- コンテナに直接手を加え、その状態のイメージを作成したい場合に使用される
- レジストリにpushする場合はイメージ名の前に{アカウントID/}を記述すること
```
$ docker commit {コンテナID or name} {作成するイメージ名:バージョンのタグ}
```
#### docker push
- イメージをレジストリにアップする
```
$ docker push {Dockerhubアカウント名/対象イメージ名:タグ}
```
:::note info
個人の学習などでコンテナを作成したら、積極的にpushしてポートフォリオにしておくのがおすすめ
:::
#### docker history
- イメージの履歴を確認する
- Dockerfileを見られない場合などに参照する
```
$ docker history {イメージ名:タグ}
```

## おわり
間違い、補足など、ご指摘ありましたらコメントをお願いいたします！
## 参照
https://qiita.com/nana-solid/items/fb05da4e89a376156981

https://qiita.com/nana-solid/items/423b4b056bd20b1f12a2