Dockerの入門書を読んでのアウトプット

## 初めに
[仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん](https://book.mynavi.jp/ec/products/detail/id=120304)

上記参考書を拝読し、勉強した内容をアウトプットのため投稿する
## Dockerとは
MySQLやNginx等のプログラムをコンテナ化（独立した環境）して動かすことができる
また、Dockerを使用するには、Docker Engineが必要である
Dockerをコンテナ化するにはimage（isoファイルのような物）が必要になる


### Dockerを使用するメリット
#### 複数のシステムから連携されているシステムのバージョン管理
複数のシステムで同じシステムを参照している場合に、どちらのシステムも同じバージョンを使用かどうかは限らない
その場合に、参照しているシステムをコンテナ化してバージョンを複数用意できる
例：Webアプリが複数あり、同じRDBを参照している
しかし、WebアプリごとにRDBのバージョンを変更したい
その際に、RDBをDockerを使用してコンテナ化をすることで、異なるバージョンのRDBを参照できる

#### 開発環境の差異を埋めることができる
Dockerはコンテナを配布することができる（配布される人もDockerを使用できるようになっていないといけない）
そのため、異なるOSで開発をしていても同じ環境で開発を行うことができる
また、同じようにコンテナを配布することで開発環境と本番環境の差異を埋めることもできる

## Dockerの仕組み
### 構造
DockerはLinux上にDocker Engineを載せてその上でコンテナを動かす
また、コンテナの中には、Lixun OS（カーネルを除く）の一部機能を取り入れたものが入っている
これは、コンテナが独立した環境であるため、コンテナ内に何もなければLixunとのやりとりができないからである
カーネルを除いたOSの一部機能を導入しているためコンテナは動作が軽くなる

冒頭に記述した参考書ではコンテナに入っているOSのことを
> OSっぽいもの

と記述している
これは、カーネルがないためそのような呼び方になっており、厳密なOS（カーネルが入っているもの）ではない

Dockerの全体像
![スクリーンショット 2022-03-23 124617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/b95dcf69-a01f-6f03-cc75-019b44e0ecfd.png)

### image
1つのimageから複数のコンテナを作成可能であり、コンテナからimageを作成することもできる

### コンテナを使用する際の考え方
Dockerは、基本的に独立したコンテナをアップデートすることはなく、既存のコンテナを捨てて新しいコンテナを作成する
これは、コンテナの作成は容易であるDockerの特徴を生かした考え方である
コンテナを削除する際に、必要なデータが一緒に消えてしまうと困るので、その際には、物理マシンにマウントしてデータを保存して使う

## Dockerの導入
### 導入方法
以下サイトを参照に導入できる
※ 2022年3月20日時点 MacOSでの導入
https://docs.docker.com/desktop/mac/install/

サイトにアクセスしてチップを選択
![スクリーンショット 2022-03-19 13.48.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/dceb2bd7-ef9a-977b-6dda-eb994bc6996f.png)

以下のようなデスクトップアプリケーションを起動できれば成功
![スクリーンショット 2022-03-19 14.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/e91fba55-dc72-26e2-c0c0-576c98ef1d88.png)

### 簡単な使用方法
Docker Engineは、コンテナ全体の管理に関わる操作（起動や停止）を行うもので、インストールと同時に起動している
コンテナはDocker Engineが停止していると一緒に停止するので、必要に応じて設定を変更する必要がある
macの場合は、ターミナルを開いてDockerの操作を行う

※DockerコマンドはWindowsでもMacでも共通である

Docker Engineは、Dockerコマンドを使用する
基本的なコマンドは以下

```docker
docker 「何を」「どうする」 （オプション） 「対象」 （引数）
```

「何を」の部分には以下が入る

```
container
image
volume
network	Docker
checkpoint
node
plugin
secret
service	
stack	
swarm	
system	
```

## 普段使いしそうなコマンド

Dockerのバージョン確認
```docker
docker version
```

### コンテナ系
イメージのダウンロード、コンテナの作成、起動を一括で行う

```docker
docker run --name （コンテナ名）
```

実際に走るコマンド
```
docker pull
docker create
docker start
```

コンテナ一覧

```docker
docker ps
```
コンテナ一覧（停止状態含む）

```docker
docker ps -a
```

コンテナ停止
```docker
docker stop （コンテナ名）
```

コンテナ削除
コンテナの削除を行う場合は、コンテナが停止していないといけない
また、コンテナの削除をしてもイメージは残る
```docker
docker rm （コンテナID）
```

### イメージ系

イメージ一覧
```
docker image ls
```
イメージ削除
イメージ削除の際は、コンテナが削除されていないとエラーになる
```
docker image rm （イメージID）
```

### ネットワーク系

ネットワークの作成
```
docker network create （ネットワーク名）
```
ネットワークの削除
```
docker network rm （ネットワーク名）
```

### ファイルのコピー

ホストからコンテナへコピー
```
docker cp ホストのパス　 コンテナ名：コンテナ側パス
```
コンテナからホストへコピー
```
docker cp コンテナ名：コンテナ側パス ホストのパス　
```

## ボリュームのマウント
### 用語に関して
ボリューム・・・ストーレージの一部を切り取ったもの
マウント・・・記憶領域をフォルダ等に取り付ける

### マウントする理由
Dockerでは、コンテナをアップデートすることはなく、削除して新たに作成することが多い
コンテナを削除するとデータも一緒に消えてしまうので、データを残しておけるようにマウントする


### ボリュームマウント
Docker Engine管理下の領域にボリュームを作成し、コンテナにマウントする
特徴は以下
・誤って削除することなどが少ない（コンテナを経由しないと確認できない）
・使用しているパソコンのOSに依存しない（パスなど）
・Dockerが推奨している
### バインドマウント
Docker Engine管理外の、DockerをインストールしたOS等に対して、フォルダやファイルをマウントする
コンテナを経由しなくとも確認できることが特徴
### tmpfsマウント
デイスクではなく、メモリをマウントする
アクセスが高速になることが特徴

## マウント系の普段使いしそうなコマンド


ボリュームの作成
```
docker volume create （ボリューム名）
```
ボリュームの削除
```
docker volume rm （ボリューム名）
```
ボリュームの一覧
```
docker volume ls         
```
ボリュームの詳細

```
docker volume inspact （ボリューム名）
```
バインドマウントの例
```
docker run -v 実際のパス:コンテナのパス
```
ボリュームマウントの例
```
docker run -v ボリューム名:コンテナのパス
```

## コンテナのイメージ化

コンテナをイメージ化することによって、コンテナを複製したり、他のパソコン等に移動できる
comiitでイメージを書き出すか、Dockerfileでイメージを作成する方法がある

commit利用時のコマンド
```
docker commit コンテナ名（任意） イメージ名（任意）
```
Dockerfile利用時のコマンド
Dockerfile自体には、元にするイメージ、イメージに追加したファイルなどの情報を記載する

```docker
docker build -t イメージ名（任意） フォルダのパス（任意）
```

作成したイメージは、saveコマンドでtarファイルにする
```
docker save -o ファイル名.tar 作成したイメージ名
```

## Docker・コンテナへの命令
Docker Engineに対しての命令では、今までのようにdockerコマンドを使用していたが、コンテナに対してはshellを利用する

bashを起動させるコマンド
```docker
docker exec -it コンテナ名 /bin/bash
```

bashを起動させた後はdockerコマンドを使用できないため以下のコマンドで一旦bashから抜ける必要がある
```bash
exit
```