【Docker】Dockerについて

## はじめに
今までなんとなく使用していたDockerでしたが、改めてしっかり勉強しようと思い、学んだことをアウトプットしていきたいと思います。

## Dockerとは
Dockerを一言で表すと、`データやプログラムを隔離できる`仕組みです。
私たちが使用しているパソコンやサーバでは、複数のプログラムが動いています。パソコンであれば、ExcelやWordなどのソフトウェアを同時に立ち上げて使用していますし、サーバでは、ApacheやMySQLなどの複数のソフトウェアが同時に動いています。
こうした複数のデータやプログラムを、独立した環境に構築することができるのがDockerです。

## Docker Engineとcontainer(コンテナ）
Dockerのイメージとしては、パソコン上やサーバ上の環境を`コンテナ`という単位で分けて、この独立したコンテナにデータやプログラムなどが入っています。そして、このコンテナを支える仕組みが`Docker Engine`です。
Dockerを使用するには、Docker Engineというソフトウェアをインストールする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851087/cef4fe22-d4b2-7468-a7ff-ff59b8445113.png)

## image(イメージ)からcontainer(コンテナ)を作る
コンテナを作成するには、`イメージ`と呼ばれるコンテナの素になるものから生成します。
イメージはたくさんの種類があり、Apacheのコンテナを作りたいならApacheのイメージが必要ですし、MySQLのコンテナを作りたいならMySQLのイメージが必要です。
コンテナは複数作成することができ、Dockerの上にいくつでも乗せることができます。

## Linux OSが必要！
Dockerを使用するには、必ず`Linux OS`が必要です。また、コンテナに入れるプログラムもLinux用のプログラムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851087/d8d36566-af45-2630-6711-c7ea55829471.png)

## コンテナで複数のサーバを同居させる
Dockerのコンテナ環境を使用すれば、完全に隔離することができるのでWebサーバやDBサーバなどを別々のコンテナに分けて安全に運用することができるようになります。アップデートをしても、隔離されているのでお互いの環境に影響することはありません。
普通であれば、一台のサーバマシンには1つのWebサーバ（Apache）しか載せられませんが、コンテナを使用すれば複数のWebサーバを作成して載せることができます。

もしコンテナを使用せずに複数のWebサーバを同居させるとなると、あるプロジェクトのメンバーが他のプロジェクトの環境を触ってしまう可能性もあります。それに、Apacheは1つしか入れることはできないので、Webサーバの機能を共有することになってしまいます。
コンテナを使用することで、こうしたリスクなしにサーバを同居させることができます。

## コンテナを持ち運ぶ
コンテナは、書き出すことで別のDocker上に再構築することもできます。簡単にいうと、DockerからDockerへコンテナを移すことができるということです。
移せるということは、あるコンテナを全員に配布することで`開発環境を一斉に揃える`ことができますし、開発サーバで作ったものをそのまま本番サーバへ持っていくこともできます。
Dockerは、OSに依存しないので開発環境では動いたけど本番環境では動かないなどといった問題が発生することはなくなります。

## Dockerの仕組み
まず、物理マシンがあってその上にLinux OSがあります。ここまでは普通のサーバと同じですが、Dockerの場合は、OSの上にDocker Engineを載せて、その上でコンテナを動かします。プログラムやデータはコンテナに入れます。
コンテナの中には、OSのようなものが入っています。これは完全なOSではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851087/8cdb60a5-ca69-19e4-0c5b-735119090b2d.png)
まず、OSというのはユーザーやソフトウェアからの命令をハードウェアに伝える役割を持っています。そしてOSは、核となる`カーネル`とその`周辺の部分`から構成されています。周辺の部分が命令を受け取ってカーネルに伝え、カーネルがハードウェアを操作します。
Dockerの場合は、コンテナは完全に隔離されているので土台となるLinux OSの周辺部分がコンテナにあるプログラムの命令を受け取ることはできません。そのため、OSの周辺部分をコンテナの中に入れることでプログラムからの命令を受け取り、カーネルに伝える仕組みになっています。
OSの核となるカーネルを土台であるホストOSに任せることで、Dockerは非常に軽くなっています。

## MacやWindowsでDockerを使う
Dockerは、Linux OS上でしか動きません。コンテナの中に入れるソフトウェアもLinux用のものしか入れることはできません。
このようにDockerはLinuxを前提としたソフトウェアなので、MacやWindowsでは動かないはずです。
しかし、`Docker Desktop for Mac`や`Docker Desktop for Windows`を使用することでDockerを使用することができるようになります。

これらは、MacやWindows用のDockerではありますが、ユーザーからは見えない仮想のLinux環境を作成してそこでDockerを動かします。

このソフトウェアはダブルクリックで起動できますが、実際にDockerを操作するにはコマンド（CLI）で操作することになります。

## ボリュームのマウント
`ボリューム`というのは、ストレージの1領域を区切ったものです。例えば、SSDなどの区切られた1領域です。
`マウント`とは取り付けるという意味があり、対象を接続してOSやソフトウェアの支配下に置くことです。

コンテナを使用するには、記憶領域にデータを置くので記憶領域のマウントが必要です。
コンテナは停止しても消えることはありませんが、コンテナのライフサイクル上いつかは削除する日が来ます。そのような時に、コンテナ内にデータを置いていると、コンテナの削除と同時にそのデータも消えてしまうことになります。

例えばパソコンなどを買い替えるときは外付けのHDDなどにデータを逃して移し替えると思いますが、それはコンテナも同じで外部にデータを逃します。しかし、コンテナの場合はいちいちデータを移し替えるのではなく、最初から外部にデータを置き、そこからアクセスして使用するのが一般的です。
これを`データの永続化`といいます。 このデータを置く場所がマウントした記憶領域です。

## Dockerfileとは
Dockerfileとは、新規にDockerイメージを作成するための手順を記したテキストファイルのことです。
Dockerfileというテキストファイルを作成することで、Docker Imageを作ることが出来ます。

Dockerfileを使うことで、以下のようなメリットがあります。

・自分の好きなようにカスタマイズすることができる

・ファイルで管理できる

・一連の手順を自動化できる

・Dockerfileを開発者に配布

・共有することで簡単に同じ環境を構築することができる

## Docker Composeとは
Docker Composeとは、複数のコンテナを構築し運用する場合などに使用するコマンド文を1つのテキストファイルに書き込んで、一気に実行したり、停止、破棄したりすることができるものです。
コマンド操作に慣れてくると複数のコンテナで構成するシステムを作成するのが少し面倒になってきますが、Docker Composeを使用することでこれらを簡単に行うことができるようになります。

Docker Composeでは、構築に関する定義を記述したファイルを`YAML`形式で用意します。
定義ファイルには、コンテナやボリュームをこういう設定で作成したいという項目を記述しておきます。

## DockerfileとDocker Composeの違い
Docker Composeは、テキストファイルに定義を書いて実行するのでDockerfileに似ているのですが、Docker Composeは`docker run`コマンドの集合体なので作成するのはコンテナや周辺環境です。
一方、Dockerfileは、イメージを作成するものなのでボリュームやネットワークなどは作成することはできません。

## 最後に
今回は、Dockerの概要についてでしたが、実際のコマンド操作についてもアウトプットしていきたいと思います。