Dockerの備忘録

## Dockerデーモン
コンテナを管理する永続的なプロセスでありDocker デーモンはユーザーからのDockerコマンドによる命令を実行することでコンテナの起動や再起動、停止などの管理をしている。

## Docker Hub
Dockerイメージのレジストリサービス。
Dockerイメージの公開、検索、ダウンロードすることができる。

## Dockerイメージ
コンテナ実行に必要なファイルをまとめたファイルシステム。
AUSFなどの特殊なファイルシステムが使用されている。
イメージ上のデータはレイヤで構成され読み取り専用。

## イメージの一覧表示
```docker
% docker images
```

## 新しいイメージを作るコマンド
```docker
## % docker tag 元のイメージ名 新しいイメージ名
% docker tag docker/whalesay my_whalesay

## % docker tag 元のイメージ名 新しいイメージ名:タグ
% docker tag docker/whalesay my_whalesay:num1
```
下の場合は「num1」と言うタグ名がつけられた「my_whalesay」というイメージが作られる。

## イメージの詳細情報を表示するコマンド
```docker
## % docker inspect 対象のイメージ若しくはイメージID
% docker inspect my_whalesay
```

## イメージを削除するコマンド
```docker
## % docker rmi 対象のイメージ若しくはイメージID
% docker rmi docker/whalesay
```

## イメージを強制削除するコマンド
```docker
## docker rmi -f 対象のイメージ若しくはイメージID
% docker rmi -f docker/whalesay
```

## イメージを取得するコマンド
```docker
## % docker pull 取得したいイメージ
% docker pull docker/whalesay
```
latestが新しいイメージでは無い可能性もあるので詳しくは公式参照。

## Dockerfile
イメージの定義ファイル。Dockerfileからイメージをビルドすることをイメージビルドという。

```dockerfile
## FROMはイメージを作る際、元のイメージを指定する今回はdocker/whalesay:latest
FROM docker/whalesay:latest
## RUMはイメージビルドの際にコマンドを指定する
RUN apt-get -y update && apt-get install -y fortunes
## CMDはコンテナが作成された後で実行するコマンドを指定する命令
CMD /usr/games/fortune | cowsay
```

## Dockerfileからイメージをビルドするコマンド
```docker
## % docker build -t イメージ名 .
% docker build -t docker-whale .
```

-tはビルドしたイメージに名前をつける今回はdocker-whale。
「.」はビルドコンテキストの設定でイメージを作成する際にアクセスできるディレクトリや、ファイルの範囲を示すもの。今回はカレントディレクトリを示す.(ピリオド)。

```docker
## % docker build --no-cache -t イメージ名 .
% docker build --no-cache -t docker-whale .
```
上記は再度Dockerfileでイメージビルドする際、キャッシュが適用され更新されず、
新しいパッケージがインストールされないのを防ぐコマンド。
キャッシュが使わずに更新することができる。

## DockerHubにログインする
```docker
% docker login
Username DockerHubのユーザー名
Password: DockerHubのパスワード
```
成功したら「Login Succeeded」と表示される。

## DockerHubにおけるタグ付けルール
```docker
## % docker tag 元のイメージ名 リポジトリ名:タグ名
% docker tag docker-whale user/docker-whale:num1
```
DockerHubの「user/docker-whale」というリポジトリにpushするのでこのような記述になる。
タグ名を指定しない場合はlatestタグになる。
リポジトリ名を間違えるとpushできないので注意！

## DockerHubにイメージをpushする
```docker
## % docker push リポジトリ名:タグ名
% docker push user/docker-whale:num1
```
ここでエラーが出た場合、再度リポジトリ名が合っているか確認する。
DockerHubのリポジトリにイメージがpushできていることを確認する。

## DockerHubからイメージをpullする
```docker
## % docker pull イメージ名:タグ名
% docker pull user/docker-whale:num1
```
docker imagesコマンドでイメージがpullできていることを確認する。

## nginxのコンテナを立ち上げるコマンド
```docker
## % docker run --name コンテナ名 -d -p ホスト側ポート番号:コンテナのポート番号 イメージ名
% docker run --name some-nginx -d -p 8080:80 some-content-nginx
```
--neme は起動するコンテナに名前をつけるオプション。
-d はデタッチモードでコンテナの実行をバックグラウンドで行うもの。入力が無い場合、実行した画面で他の操作ができなくなるため、入力することを推奨。
-p はコンテナのポートをコンテナ外に設定するオプション。ここでは8080が外部に公開するポート番号。
正常に実行された場合、http://localhost:8080/ でnginxが起動していることが確認できる。

## dockerコンテナの確認
```docker
## 起動中のコンテナの表示
% docker ps
## 起動中、停止しているコンテナの表示
% docker ps -a
```


## dockerコンテナをスタートさせる
```docker
## docker start コンテナ名若しくはコンテナID
% docker start static-site
```
コンテナのステータスがrunningに変わる。

## dockerコンテナを一時停止させる
```docker
## docker pause コンテナ名若しくはコンテナID
% docker pause static-site
```
コンテナのステータスがpausedに変わる。

## dockerコンテナの一時停止を解除させる
```docker
## docker unpause コンテナ名若しくはコンテナID
% docker unpause static-site
```
コンテナのステータスがrunningに変わる。

## dockerコンテナを再起動させる
```docker
## docker restart コンテナ名若しくはコンテナID
% docker restart static-site
```
コンテナのステータスがrestartingを経て、runningになる。

## dockerコンテナを削除する
```docker
## docker rm コンテナ名若しくはコンテナID
% docker rm static-site
## 
```
コンテナを停止させないと削除できないので注意！

## dockerコンテナを強制削除する
```docker
## docker rm -f コンテナ名若しくはコンテナID
% docker rm -f static-site
```
コンテナを削除できない時に使用。

## dockerコンテナのステータス
docker psコマンドや、docker inspectコマンドでコンテナのステータスを確認することができる。

<b>created</b> ・・・docker createでコンテナが作られ、start前の状態。docker startでrunningに変わる。
<b>running</b> ・・・コンテナが起動している状態。docker pauseコマンドでpaused、docker stopコマンドでexited、docker restartコマンドでrestartingを経て、runningになる。
<b>paused</b> ・・・一時停止状態で起動中のコンテナに接続したり、リクエストを投げても応答しない。docker unpauseコマンドでrunning状態に戻る。
<b>restarting</b> ・・・コンテナの再起動中で、すぐに再起動するためあまり見ることができない。再起動が終了したらrunningになる。
<b>exited</b> ・・・コンテナが終了し、残り続けている状態。基本的にはここからdocker rmコマンドでコンテナを削除することができる。
<b>dead</b> ・・・コンテナが正常に終了されずに残った場合に表示され。こうなった場合は削除するしかない。

## コンテナからイメージを作る
```docker
## docker commit コンテナ名若しくはコンテナID イメージ名:タグ名
% docker commit static-site static-site:ver1
```
コンテナの状態をイメージとして保存できる。しかしコンテナ内で行われた作業は明確な記録として残らないので、通常はDockerfileに記載して履歴を残すようにする。

## イメージの履歴を確認する
```docker
## docker history イメージ名若しくはイメージID
% docker history docker-whale
```
docker-whaleに関する履歴を確認できる。