dockerの低レイヤー知識

:::note warn
こちらは個人の備忘録になります。
:::

みなさんこんにちは、steveです。最近dockerについて学ぶことがおおく、サーバーサイドについて、たくさんの知見を得る機会となりました。今回はその知見をアウトプットとして共有させていただきます。

今回読んだ書籍はこちらです

https://www.amazon.co.jp/%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-Docker-Kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E5%B0%8F%E7%AC%A0%E5%8E%9F%E7%A8%AE%E9%AB%98/dp/4839972745/ref=sr_1_1?adgrpid=117895793015&dib=eyJ2IjoiMSJ9.ZmeVWa9I1Yu4NaSuNmnWXh-tuPYr61SKuAWz5bLxI7cXryQk-pV1AGb1jv8pZf0oJKVj5HlZH3lbw_ZlCcbPkJX7UK_Ka3cLYMKGYsBgzxLtEKiFIjLjwS3f5qmNAkWKn7cEzC1i3jKvku1ePRlUEUgDPbPwTanPNnT0h3GDthyDO1DpeRz0QvBlzH94UOlgshkJwbEpEYnWrX3SZAHreSu0wLgZwhRzXi7TD6sTo6skCmNW7TAwomtMVp-Dv4a2NfHYsYxqt1HWgOXyqWoUOol1kV8xPE1nBOSFC_SD2E4FXCYm6FsIiUyQdQcD3wIgps0N_J471dsIaCBORcmMu4yw3sZjm1-xWS8SiWnPL4M.1PRN11hYoEO-Ao-o-5QlZ6KfNF-XgjmhrircTNJIYa4&dib_tag=se&hvadid=678961026885&hvdev=c&hvlocphy=1028818&hvnetw=g&hvqmt=e&hvrand=14570682874443241033&hvtargid=kwd-1178202787137&hydadcr=1825_13657007&jp-ad-ap=0&keywords=docker+kubernetes%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93&mcid=dc14fbcc9d6432798a070ba0ba2d911c&qid=1737722387&sr=8-1

https://www.amazon.co.jp/%EF%BC%BB%E8%A9%A6%E3%81%97%E3%81%A6%E7%90%86%E8%A7%A3%EF%BC%BDLinux%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E2%80%95%E5%AE%9F%E9%A8%93%E3%81%A8%E5%9B%B3%E8%A7%A3%E3%81%A7%E5%AD%A6%E3%81%B6OS%E3%80%81%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E6%AD%A6%E5%86%85-%E8%A6%9A/dp/429713148X

「linuxの仕組み」からは、OS周りの知識、docker、仮想化の章を参考にさせていただきました。

**順序構成**
--
1.Dockerとは何か
2. 他の独立ツールとの違い
3. Linuxとの関連
4. Dockerが動く仕組み
5. Dockerfile、docker-compose.ymlの使い方
6. まとめ



**1.Dockerとは何か**
--

**Dockerとは、データやプログラムを隔離する仕組みです。**
SQLや、OSなどを隔離させ、独立させて管理することができるというわけです。

サーバーに何かしらの要素を共同させており、片方のシステムのみにアップデートがかかり、別のシステムに影響が起こる。というような事態を避けるため、実行環境が独立してるサーバーを用意する必要がある、そこで使われるのがdockerというわけです。

**2.他の独立ツールとの違い**
--
dockerはその形態から「コンテナ型」と呼ばれます。
その対となる存在が「VM型」です。

dockerはlinux osを前提にengineを立ち上げ、各コンテナの中には「プロセス」と呼ばれるLinux OS の下っ端みたいなやつが配置され、その配置を、linux OSが中央集権的に管理するというものです。従って各コンテナの中にカーネルがないため、通信速度がVM型と比べて速いというのがあります

一方「VM型」（別名ハイパーバイザー型）は、ホストの物理マシンの上にハイパーバイザーと呼ばれるものを立ち上げ、その上に仮想マシンを立ち上げます。仮想マシンの中には、各種OSが配置され、windowsでもMac でもOSを利用可能となります、各種仮想マシンの中に各種OSが配置されるので、dockerと比べたらかなり動きが遅くなります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840426/3910d975-ed8e-d151-4790-d8dbe5d3951a.png)

ハイパーバイザー型で有名なものはHyper-Vなどが挙げられます

**3.Linuxとの関連**
--

2で述べさせていただいたように、基本的にdockerはlinuxのものになります。
実際にエンジンを立ち上げる場合も
1.仮想環境下にlinux OSをダウンロード
2.最初からlinuxOSのPCを使う
3.Docker desktopを使う（これが主流）
しかありません。

docker desktopは仮想環境下に最低限のカーネルのみ導入して軽量で使うことが可能です

そもそも、linuxは、実行中のプログラム「プロセス」と、複数のプロセスを管理する「カーネル」からなります。dockerは、linux OSを基準に作られており、コンテナの中にも、プロセスが格納されています。

**4 dockerが動く仕組み**
--

ここまでの内容をまとめて、dockerの仕組みを言うと、dockerは
物理マシン→linuxOS →docker engine →containerと積み上がっています。

ここで、
物理マシン＝ハードウェア
linux OS ＝OS
docker engine ＝ ソフトウェアと考えることができます。

OS は3章で書いたように、SW → HW、HW→SWを翻訳するような役目を持っており、翻訳する過程は、カーネルを通して、プロセスにシステムコールを許可をすることで実現されています。

結果、docker engineがコンテナの土台となり、コンテナが動きます。

さらに、コンテナそれぞれは、「イメージ」と呼ばれるコンテナの模型から構成されます。

イメージの作成方法は主に二つで、
docker hub からイメージをインポートする。
dockerfileを用いて独自でイメージを作成する。

そして、イメージを作成してコンテナを構成し、docker engine を通じてRUNさせると、コンテナが作動すると言う訳です。

**5docker-compose.yml とdockerfileの違い。**
--
結論、マクロなcomposeとミクロなdockerfileは、個々のコンテナを作成するのに使い、composeは各コンテナを管理、接続するのに使います。

ここで、「え？でもデータベースの設計って、個々のコンテナなのに、なんで、Composeに書くの？」と思うかもしれませんが、それはdockerhub上に最適化されたイメージが用意されているため、それを用いるのが一般的なため、Composeに書くと言う訳です。

**まとめ**
--

Dockerは、アプリケーションとその実行環境を独立した形で動作させる技術で、Linuxを基盤に設計されています。これにより、複数のシステムが互いに干渉することなく実行可能になります。

コンテナ型であるDockerは、軽量かつ高速で、ホストOSのカーネルを共有する一方、VM型（ハイパーバイザー型）は仮想マシンごとにOSを持つため、リソース消費が多いという特徴があります。Dockerの仕組みは、物理マシン上でLinuxカーネルを活用し、Docker Engineを通じてコンテナを管理する構造に基づいています。

Dockerを活用する際には、Dockerfileで個々のコンテナを作成し、docker-compose.ymlを利用して複数のコンテナを連携させる方法があります。特にデータベースでは、Docker Hubの公式イメージを活用することで、設定を簡略化しつつ、迅速に環境を構築することが一般的です。

今回、Dockerを学んだことで、いろんなことが線になってきつつあると思います。

これからもインプットを続けていきたいと思います