とりあえずDockerについて学んでみる（構築方法有）

# はじめに
なぜDockerについて勉強しようと思ったかというと、システムエンジニアのインターンに行った際に「Docker使ったことある？便利だよ。」と言われ、Dockerについて色々調べて、[記事](https://qiita.com/poly_soft/items/fb649573c19b7a5c0227#docker)を読んでいたら、社会的には広く使われている便利なツールで使ったことがない人は危機感を持った方がいいということが判明したことと、授業でも仮想化技術のところでDockerが出てきたので勉強してみようと思った。

# 仮想化技術について　[参考1](https://bcblog.sios.jp/what-is-virtualenvironment-vmware/#i-2)　　[参考2](https://www.itmanage.co.jp/column/virtualization-server-integration/)
仮想化技術はいくつかの種類に分けられる。
![9fde390a989582af34341a905b3b3abb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256914/ee9f913d-8ead-c31c-059a-8ca625331ac1.png)

## 仮想環境のメリット
#### コスト削減
これまで複数のハードウェアが必要だったものが一つに集約でき、機器を購入するコスト削減、電力などのランニングコストの削減、サーバを管理するための人件費やハードウェア保守費用の低下が見込める。

#### 業務効率化
ハード機器の数が減るため、メンテナンスなどん管理にかかる手間が減る。また、アプリケーションのバージョンアップに合わせてのOS更改が必要になってもハードの数が少ないのですぐにできる。

#### 拡張性
１つのサーバのメモリを拡張したいとなった時は、メモリやディスクを追加するために、機械を分解する必要があるため、稼働を停止して作業をする必要があるが、仮想環境上であればメモリを割り当てることで物理的な工事の必要が少なくなる。スペックを拡張するためには一度、仮想環境を停止し、パラメータを設定する必要があるが、物理サーバを拡張するよりも運用停止時間を短くできる。

#### 耐障害性
仮想環境は１つのファイルとしてバックアップを取得できるので、物理サーバが故障してもバックアップファイルを別のハードウェアに移行すれば運用の継続が可能。

## 仮想環境のデメリット
#### 性能が劣る
仮想環境は仮想かソフトウェアによって作られるため物理的な環境と比べて仮想化の処理があるので、割り振ったリソースよりも性能が劣る場合がある。物理的なメモリやディスク、CPUっを分割して各仮想環境に割り振るため、十分なリソースを確保できず、パフォーマンスが発揮できない場合がある。

#### 運用管理
物理的なサーバに比べると、仮想化の概念や知識が必要となるため、仮想技術を習得した人材の確保が必要となる。運用方法も少し複雑になるので、計画を綿密に考えなければならない場合がある。

#### セキュリティ管理
セキュリティ管理も通常のサーバと比べると特別な対策が求められる。OSやアプリケーションによるセキュリティ対策と、仮想環境特有のセキュリティ管理が必要となる。仮想環境は、あらゆるサーバが相乗りするため、どのような手段でどこを守るかを考える必要があり、ウイルスに感染したときの感染経路の遮断や、各仮想環境に対するセキュリティ対策など、計画的に考慮する必要がある。

## 仮想環境の種類
### ホスト型
・パソコンやサーバにホストOSをインストールし、そのOS上に仮想環境作成ソフトウェアをインストールして構築するタイプ。ホストOSの上にゲストOSが並ぶ。
###### メリット
・仮想化に必要なソフトウェアが使いやすい。
・既存マシンが使える。
・テスト環境などを作成したいときに便利
###### デメリット
・ホストOSを動作させる物理リソースが必要
・ゲストOSを運用する場合にホストOSでの処理速度が限定的になる。
・既存のサーバなどにインストールすればすぐに始められるメリットがあるが、ホストOSを起動しなければならないので、ハードウェアを起動する際にホストOSが立ち上がるまでの時間がかかる場合がある。

ex)VMwareWorkstation Player,WMware Fusion,Oracle VM Virtualbox

### ハイパーバイザー型
・一つのハードウェアに仮想化ソフトウェアを直接インストールし、仮想化を構築するタイプ
###### メリット
・ホストOSが不要でハードウェアを直接制御が可能
・システム全体の観点からみてリソースの使用効率がよい
・管理するサーバの台数削減が可能
・ホストOSを起動しなくて良いので比較的早い起動が可能。
・ホストOSがないので、リソースのほとんどを仮想環境に使える。
###### デメリット
・新しいハードウェアを購入する必要があるので、コストがかかる。
・仮想化環境の高度な管理を実現するツールが標準装備されていない場合がある。
・ハードウェアのスペックが低かった場合は処理能力不足になる可能性がある。
・頻繁にアップデートを要するものがあるため専門的な知識や技術が必要。

ex)Microsoft Hyper-V,Citrix Xen Server,Red Hat Enterprise Virtualization

### コンテナ型
・仮想環境の種類の中でも新しいタイプで、ホストOSにコンテナエンジにと呼ばれる仮想化ソフトウェアをインストールし、その中でコンテナと呼ばれる環境を作り、アプリケーションを実行させる。
###### メリット
・コンテナ型にはゲストOSという概念がない。ホストOSからは、一つのプロセスとして認識される。
・余分なリソースが不要で、快適な環境を提供でき、アプリケーションを短期動で起動可能。リソース効率がよくコストパフォーマンスに優れている。
・不可が小さく高速な動作が実現可能。
・比較的容易でコピーも簡単なため作業時間の大幅な短縮が可能。
・開発と運用の相性が良くリリースサイクルの高速化が期待できる
###### デメリット
・新しい技術ということもあり、構築できるベンダーが少ない、便利な管理ツールが不足している。
・複数のホストでのコンテナ運用が煩雑になる。
・カーネルを他のコンテナと共有するため個別に変更できない。
・新しい技術であり学習コストが比較的高い。
ex)Docker,Kubernetes

# Dockerについて
### Dockerとは？
Dockerは仮想化技術の中でもコンテナ型に分類される。Docker社が開発したコンテナタイプの仮想環境のなかで、アプリケーションを作成したり、配布したり、実行したりすることができるプラットフォーム。
### Dockerを使うメリットは？
###### 軽量で効率的な作業が可能
・dockerは仮想マシンと比較して軽量なため高速でアプリケーションの作成、実行ができる。
・コンテナのイメージが軽量なので、エンジニアと共有する際に時間をかけずにダウンロードが可能
###### コード化されたファイルで同じ環境が作れる
・Dockerではインストールや各種環境設定をコード化できるため、開発肯定で作成した環境をコード化し、同じ環境で本番環境を作ることができる。そのため、環境によるリスクを軽減できる。
###### 配布しやすい
・Dockerでは、web上のDocker HubでDockerイメージを取得すれば、すぐに使用できるコンテナが起動できる。
・Dockerイメージを他者に配布しやすく、環境バージョンのずれや、環境準備に伴うミス防止や作業時間の短縮につながる。
###### スクラップ＆ビルドが楽
・Dockerイメージはコンテナ名を変えて新たな開発に使えるため、環境を作る必要がなくなる。
### Dockerで何ができる？
・DockerによってOS内に独立した仮想環境（コンテナ）を複数生成することができ、コンテナによってOS内に多面の実行環境を構築でき、多種多様の開発検証環境や開発環境の変更にも柔軟に対応が可能。
・独立した環境コンテナを生成することでファイルやバージョン、設定やポートの競合回避ができ、開発環境の共通化を推進できる。
・Infrastructure as a Codeと呼ばれるように、インフラをコード化しようという考え。オンプレミス型ではサーバの用意、OSノインストール、アプリケーションサーバ、DB等のミドルウェアのインストールというように作業が多くなり、時間がかかるもので、少しでも設定を間違えるとアプリケーションが正しく動作しないという問題が発生する。それを解決するために考えられたもの。
・immutable infrastructureといってセットアップしたサーバに、後から変更を加えないようにすることで、安定的に運用ができる。
### Dockerでの開発を助けてくれるもの [参考](https://www.pasonatech.co.jp/workstyle/column/detail.html?p=2675)
###### Docker Hub
・GithubのようにDockerのイメージを共有できるサービス。自分の作成したDockerイメージをクラウド上にアップロードして共有すること、ダウンロードして利用することが可能。
###### Docker Compose
・複数のコンテナを同時に利用するようなアプリケーションにおいて、複数のコンテナの連携を実現させるツール。
###### Kubernetes
・複数のコンテナを利用する複雑なアプリケーションの管理を用意にする技術。
### Dockerで使用される用語　[参考](https://www.pasonatech.co.jp/workstyle/column/detail.html?p=2675)
・Docker Engine・・・コンテナ化及びコンテナを動作させるためのアプリケーションでDockerの核
・コンテナ・・・Docker上で動作するアプリケーションの単位。
・Docker Image・・・コンテナを作成するための依存関係や情報を含むデータ。
・Dockerfile・・・Docker Imageをビルドするための手順が記載されたファイル。自身で作成することも可能。


#実際にDockerを使える環境を構築する。
## For Mac [参考](https://qiita.com/kobori_akira/items/0cc993caeb20d77cd367)
### ダウンロード、インストール
1. https://docs.docker.com/docker-for-mac/install/ から最新のDockerをダウンロードしインストールする。
2. docker --versionができるかどうかを確かめる。

```
$ docker --version
Docker version 20.10.7, build f0df350
```


### DockerイメージからDockerコンテナの新規作成

```
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

LaunchpadからインストールしたDockerを起動していないと"Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"というエラーが出ました。
Dockerが起動しているかどうかは上のバーにクジラのマークがあるかどうかでわかります。

psコマンドで動いているDockerコンテナのリスト取得

```
$docker run hello-world
```
runコマンドでDockerイメージをもとにDockerコンテナを新規作成
正常に動くと・・・

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
って感じでメッセージが出ます。ここに書いてあるメッセージを日本語に変換すると
1. DockerクライアントがDockerデーモンにコンタクトする。
2. DockerデーモンがDocker Hubからhello-worldイメージを取り出す。
3. Docker デーモンは、そのイメージから新しいコンテナを作成し、現在読んでいる出力を生成する実行ファイルを実行。実行ファイルを実行し、現在見ている出力を生成します。
4. Dockerデーモンはその出力をDockerクライアントにストリーミングし、Dockerクライアントはそれをターミナルに送る。
## For Windows
### Hyper-Vの設定
前提としてDockerをwindowsで使う場合には[Hyper-V](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)を有効化する必要がある。
1. アプリと機能へ
2. 関連設定の下にあるプログラムと機能へ
3. Windowsの機能の有効化または無効化へ
4. Hyper-Vを選択しOK
5. Windowsの再起動   

### Dockerのインストール
[ここ](https://www.docker.com/products/docker-desktop)からインストーラーをダウンロードする。ダウンロードできたDocker for Windows Installer.exeを実行。今回はubuntuを使用する予定なので、Configrationのinstall required Windows composements for WSL 2というところのチェックを外す。

### 動作確認
Windows PowerShellで
```
docker  version
```
を実行するとバージョンが表示される。
```
docker run hello-world
```
を実行し
```
docker ps -a
```
でコンテナが出て来れば環境構築自体は完成。
## ubuntuを入れていく　[参考](https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53)
とりあえず docker imagesでDockerMachineに保存されてるイメージを確認

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
```
次にDockerHubにあるubuntuリポジトリからコンテナイメージを取得
docker pull <REPOSITORY>コマンドで実行できる

```
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
c549ccf8d472: Pull complete 
Digest: sha256:aba80b77e27148d99c034a987e7da3a287ed455390352663418c0f2ed40417fe
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
```
docker imagesでubuntuが入っているかを確認できる。

```
$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    9873176a8ff5   5 days ago     72.7MB
hello-world   latest    d1165f221234   3 months ago   13.3kB
```
docker psで稼働中のコンテナを確認する。

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
何も起動していないと何も表示されない。
続いてさっき取得したubuntuイメージからコンテナの作成

```
$ docker run -it ubuntu
root@19cc0bdb82fa:/# 
```
これでコンテナの作成と起動を実行、ログインが行われる。
ログイン状態は "control + P→Q"で抜けることができる(dettach)。
exitコマンドを実行するとコンテナが停止する。

```
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
19cc0bdb82fa   ubuntu    "bash"    7 minutes ago   Up 7 minutes             elastic_visvesvaraya
```
STATUSがUPになっていることが確認できる。
dettachしたところに再度入るときには
docker attach <DONTAINER ID か NAME>を実行

```
$ docker attach 19cc0bdb82fa
root@19cc0bdb82fa:/# 
```
exitコマンドでコンテナを停止して抜けることが可能。

```
root@19cc0bdb82fa:/# exit
exit
```
動いているコンテナがあるか確認してみる

```
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
docker ps -aで停止中のコンテナも表示できる

```
$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                          PORTS     NAMES
19cc0bdb82fa   ubuntu        "bash"     13 minutes ago   Exited (0) About a minute ago             elastic_visvesvaraya
fcfa082535dc   hello-world   "/hello"   22 hours ago     Exited (0) 22 hours ago                   pedantic_moser
312b069a15a8   hello-world   "/hello"   10 days ago      Exited (0) 10 days ago                    nifty_dirac
```

コマンドに関しては[ここ](https://qiita.com/noralife/items/18301143c20cc5172c56)を確認すると色々出てきます。
# まだ書き途中で、都度追記していく。
dockerfileについて　https://blog.codecamp.jp/docker-file-how-to
[次の記事](https://qiita.com/Fu-Te/items/48145a59a2455f5658cc)