[Docker] コンテナ技術、「Docker」について整理！🙌

今回は、コンテナ技術の「Docker」について情報を整理していきます！

参考：

https://www.amazon.co.jp/Docker-%E4%BB%AE%E6%83%B3%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-Web%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%82%BF%E3%83%BC%EF%BC%86%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E4%BD%9C%E6%A5%AD%E3%81%8C%E3%81%AF%E3%81%8B%E3%81%A9%E3%82%8B%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%AA%E3%83%96%E3%83%AD%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9-ebook/dp/B0BF9C3FJX/ref=sr_1_16?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=XYK0IBXYJWF8&dib=eyJ2IjoiMSJ9.4I9opglWg2ybelfZ7Olav1eX6O2yCGMsICGqe33QERA7OZQ9F2VUffWKjywaNg_x36tC-bCV4nTbwrPWKgJdPa_gEPNgiv91M4Qaema-i0AaNQTlsHA8FDqUdKAubMrXDdsPRr4oSCgby3EwX5sLr9By-lI7-Ocu-tl4OYZyMZIE89GWs5OrghpR39-9sK-QqkfUuvv1ragtu_GCaIw6vYPvUVMz0dsufH4c-OwJQSGIaR836KQtQxZiBUG8U9OBQOB5tRWi_uIJYTghvYu70jP-K4iGwpLQF_GPpjRuDxc.nOtRwOEWO1n-dquaR1mBdzlVNPlsMy22nHrwJVHlnb0&dib_tag=se&keywords=docker&qid=1714114688&sprefix=docker,aps,190&sr=8-16

## 対象
- 未来の自分
- 以下の条件に当てはまる方
## 前提
- Dockerについて整理したい
- Docker初心者
## 本題
### クライアントとサーバー

Web：**クライアントであるWebブラウザ**と、そこに**コンテンツを供給するWebサーバー**で構成されるシステム。これはクライアント・サーバーシステムと呼ばれる。

- **クライアント**：サーバーに対してリクエストを送信することで、サーバーが提供するコンテンツを利用するコンピューターやソフトウェアを指す。

- **サーバー**：ユーザーからのリクエストに大路て、何らかのサービスを提供するコンピューターやソフトウェアのこと。

Webサーバーのほかに、データの保存や検索を行う「データベースサーバー」などがある。

## コンテナ

コンテナとは、一言でいうと、**「アプリとファイルシステムを隔離する特殊なプロセス」**のこと。

プロセスとは、OS上で動作している1つ1つの処理のこと。

アプリとファイルシステムを隔離するということは、1つの物理マシンの中で動いているにもかかわらず、そのプロセスの中だけが別マシンで動いているような状態になるということ。

これが、従来の仮想化技術と異なるコンテナの仕組み。

コンテナ技術のデファクトスタンダードであるソフトウェアが「Docker」。

コンテナの仮想マシンとの違いは、ゲストOSを含まないこと。コンテナにインストールするのはLinux-OSのあくまで一部であり、OSのカーネル（OSの中核部分）はホストOSのものを使う。

コンテナはゲストOSがないから軽量。

また、仮想化技術には、仮想マシンだけでなく、ネットワークを仮想化した「ネットワーク仮想化」やストレージを仮想化した「ストレージ仮想化」などの種類がある。

Dockerでは、コンテナ間の通信や、コンテナの外部と通信する際に、この仮想ネットワークが使われる。

Dockerは、Linuxで動かすものであり、WindowsでDockerを使う場合は、Windows上で動作するLinuxが必要。

### コンテナのメリットとデメリット

 **メリット**

- 軽量である

コンテナは仮想マシンよりもはるかに軽量です。これは、ゲストOS全体をロードする代わりに、必要なアプリケーションとその依存関係のみを含んでいるためです。この軽量性により、起動時間が短縮され、システムリソースの消費が抑えられます。

- ホストOSを汚さずに環境構築できる

コンテナはホストOSから隔離されて動作します。これにより、アプリケーションが必要とする環境をホストOSに影響を与えることなく構築でき、互いに干渉しない環境を複数つくることができます。

- IaC（Infrastructure as Code）を実現する

コンテナ技術は、インフラストラクチャをコードとして管理することを可能にします。これにより、開発、テスト、本番環境間での環境の一貫性が保たれ、デプロイメントプロセスが自動化され、迅速化されます。また、Dockerではどんなコンテナをつくるか、といった手順をまとめたテキストファイルをもとにコンテナを創れるので、そのテキストファイルさえあれば、ほかの人が別のマシンでコンテナをつくることは容易です。

- 可搬性がある

コンテナはどのプラットフォーム上でも同じように動作するよう設計されています。これにより、開発環境からテスト、本番環境へとアプリケーションを簡単に移行することができます。

**デメリット**

- 学習コストが必要

コンテナ技術は多くの新しい概念を導入しており、特に従来の仮想化技術や物理サーバーから移行する場合、これらの技術を理解し適切に管理するためには時間と労力が必要です。

- 限定された可搬性

コンテナは一般的には可搬性が高いとされていますが、実際にはホストOSのカーネルを共有するため、異なるOS間での移行には制限があります。例えば、LinuxコンテナをWindowsや異なるLinuxディストリビューションでそのまま動かすことはできない場合があります。

## コンテナイメージ

コンテナは、コンテナイメージ（以降、イメージ）からつくられる。イメージは、コンテナを作成するためのテンプレートのようなもの。イメージには、基本的なアプリやソフトウェアに加えて、コンテナを動かすのに必要なファイルシステムや、実行コマンド、メタ情報などが含まれている。コンテナに必要なファイルの集合体である。

コンテナhあ、あくまでプロセスなので、コンテナ自体を他の環境に配布することはできない。しかし、イメージはファイルの集合体なので配布が可能。つまり、イメージは、コンテナの可搬性を支える仕組みといえる。

## コンテナのライフサイクル

コンテナは作っては削除が基本。

物理マシンに直接、アプリの事項環境を構築する場合、必要なソフトウェアを1つずつインストールすることが必要である。そして、その環境を削除する場合は、ソフトウェアを1つずつアンインストールしていく必要がある。対してコンテナは、作っては削除する、ことが簡単に出来る。