Docker入門してみた

## はじめに
- なんとなくコマンドは使ったことあるけど詳しくは分からなかったから学習してみた記録になります。
- 丁寧なメモ書きみたいな感じです。
- ミスがあれば指摘お願いします。

## Dockerとは
コンテナ仮想化技術を使って、アプリケーションを開発・配置・実行するための環境を提供するツールです。

## Dockerイメージとは
コンテナに必要なソフトウェア・環境変数・設定などが入っているもので、コンテナの型となるものです。
配布・コンテナ環境の再現が可能で、どの環境で実行しても同じコンテナが再現できます。
チーム開発で開発環境を揃える際に便利ということですね。


## DockerHub
Dockerイメージを登録・配布を可能なサイトです。
dockerコマンド実行時に、特に指定しない場合、DockerHubからベースイメージがダウンロードされます。
誰でも登録・配布できるので、ダウンロード数の少ないものを使用する際は注意が必要です。

## Docker基本コマンド

### イメージをダウンロードする
```
docker image pull {イメージ名}
```

### ローカルマシンに存在するイメージ一覧を表示する

```
docker image ls
```

### ローカルマシンに存在するイメージを削除する

```
docker image rm {イメージ名}
```

### イメージからコンテナを作成し起動する
```
docker container run {イメージ名}
```


```
docker container run --rm {イメージ名}
```
--rmオプションをつけると、コンテナ実行したのち自動削除する

### ローカルマシンに存在するコンテナ一覧を表示する
```
docker container ls
```
```
docker container ls -a
```

-aオプションをつけることで、起動していないコンテナも表示される

### 起動中のコンテナを停止するコマンド
```
docker container stop {コンテナ名}
```

### コンテナを再起動する
```
docker container restart {コンテナ名}
```

### コンテナを破棄する
```
docker container rm {コンテナ名}
```
※起動中のコンテナは破棄できない

```
docker container rm -f {コンテナ名}
```
-fオプションをつけることで起動中のコンテナを破棄することができる

### イメージの詳細情報を表示する
```
docker image inspect {イメージ名}
```

### コンテナを起動して任意のコマンドを実行させる
```
docker container run {イメージ名} {実行したいコマンド}
```

### 起動状態のコンテナに任意のコマンドを実行させる
```
docker container exec {コンテナ名} {実行したいコマンド}
```

### 停止済みのコンテナを全て削除する
```
docker container prune
```

### よく見る-itオプションについて(補足)

```
docker container run -it {イメージ名}
```
上記の-itオプションとはなんなのでしょうか？
こちらは-i、-tオプションを繋げたものです。
まず-iオプションですが、標準入力をできるようにするオプションです。
標準入力をできるようにするとコンテナに対して操作ができるようになります。
次に-tオプションについてですが、コマンド実行結果のなどの見た目を綺麗にしてくれるものです。

```
docker container run -d {イメージ名}
```
-dをつけるとデタッチドモードでコンテナを起動することができます。
デタッチドモードとはバックグラウンドでコンテナを動作させることです。
何もつけない場合はフォアグラウンドモードでコンテナを起動していることになります。
デタッチドモードはバックグラウンドで常駐させたい処理などに対してつけることが多いです。

```
docker container attach {コンテナ名}
```
デタッチドモードになっているコンテナに接続する


## Dockerfileとは
DockerHubなどのイメージレジストリに存在するイメージの多くは、最低限の機能しか入っておらず、実際に使用する際にはカスタマイズが必要となることがほとんどです。
このカスタマイズするためにDockerfileを使います。

### Dockerfileからイメージを作成する
```
docker image build {ディレクトリパス}
```
{ディレクトリパス}にはビルドコンテキストパスを指定する


### ビルドコンテキストとは

> docker build コマンドを実行したときの、カレントなワーキングディレクトリのことを ビルドコンテキスト（build context）と呼びます。 デフォルトで Dockerfile は、カレントなワーキングディレクトリにあるものとみなされます。 ただしファイルフラグ（-f）を使って別のディレクトリとすることもできます。 Dockerfile が実際にどこにあったとしても、カレントディレクトリ配下にあるファイルやディレクトリの内容がすべて、ビルドコンテキストとして Docker デーモンに送られることになります。

https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/dockerfile_best-practices/#%E3%83%93%E3%83%AB%E3%83%89%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E7%90%86%E8%A7%A3

通常、`docker image build`を実行した場所がビルドコンテキストになります。
しかし、Dockerfileの配置場所とビルドコンテキストを異なる場所にしたい時は-fオプションでDockerfileの場所を指定することで解決することができます。
下記のようにして、ビルドコンテキストはカレントディレクトリ、devディレクトリ配下のDockerfileを使用することができます。
```
docker image build -f dev/Dockerfile .
```

## ボリュームとは
コンテナ内のデータを永続させる方法の一つです。

### 基本コマンド
### 新しいボリューム領域を作成する
```
docker volume create {ボリューム名}
```

### ボリューム領域の一覧を表示する
```
docker volume ls
```

### 指定したボリューム領域の詳細情報を表示する
```
docker volume inspect {ボリューム名}
```

### 指定したボリューム領域を削除する
```
docker volume rm {ボリューム名}
```

### ボリュームに接続しながらコンテナを起動する
```
docker container run -v {ボリューム名}:{コンテナ内の絶対パス} {イメージ}
```
```
docker container run --mount type=volume src={ボリューム名},dst={コンテナ内の絶対パス} {イメージ}
```
挙動は同じです。


## バインドマウントとは
ローカル側(ホスト)の任意のディレクトリとコンテナ側の任意のディレクトリを同期させることです。

### バインドマウントしながらコンテナを起動する
```
docker container run -v {ホスト絶対パス}:{コンテナ内の絶対パス} {イメージ}
```

```
docker container run --mount type=bind,src={ホスト絶対パス},dst={コンテナ内の絶対パス} {イメージ}
```
挙動は同じです。