Dockerについて

# Dockerとは？

Dockerとは？ Dockerは、コンピュータの中で特別な「仮想環境」を作るためのソフトウェアです。仮想環境というのは、まるで別のコンピュータが中にあるかのような状態を作り出すものです。この仮想環境を使うと、アプリケーション（ソフトウェア）を実行するための環境を簡単に作ることができます。

通常、アプリケーションを実行するためには、そのアプリケーションに適した環境を整える必要がありますが、Dockerを使うと、そうした準備を一から行わなくても、Dockerが準備した「コンテナ」と呼ばれる単位で、すぐにアプリケーションを実行することができます。

# コンテナ型の仮想化とは？ 

これまでの仮想環境を作る方法には「ハイパーバイザー型」と呼ばれる方法がありました。

## ハイパーバイザー型

ハイパーバイザー型とは？ ハイパーバイザー型というのは、1台のコンピュータの中で、まるで複数のコンピュータが動いているかのような環境を作り出す技術です。

具体的には、1つのコンピュータの中に、複数の「仮想マシン」と呼ばれる別々のコンピュータを作ります。それぞれの仮想マシンは、独立して動くことができ、別々のOS（WindowsやLinuxなど）をインストールして、それぞれ別の作業をさせることができます。

ハイパーバイザーの役割 この「仮想マシン」を作り出すために使われるのが「ハイパーバイザー」と呼ばれるソフトウェアです。ハイパーバイザーは、実際のコンピュータのハードウェア（CPUやメモリなど）を管理して、仮想マシンに割り当てます。これにより、仮想マシンがそれぞれ独立して動作できるようになります。

例えると… 例えば、1つの部屋（コンピュータ）があったとします。その部屋をハイパーバイザーが区切って、いくつかの小さな部屋（仮想マシン）を作り出します。それぞれの小さな部屋には、独立したコンピュータがあるかのように振る舞うことができ、違う仕事を同時に行うことができます。

デメリット ただし、ハイパーバイザー型は、1つのコンピュータをいくつもの仮想マシンに分けるため、かなりのリソース（メモリやディスク容量など）が必要です。そのため、たくさんの仮想マシンを動かすと、実際のコンピュータが重くなったり、遅くなったりすることがあります。

ハイパーバイザー型は、1台のコンピュータで複数の仮想マシンを動かすための技術で、それぞれの仮想マシンが独立して動作できるというメリットがありますが、リソースを多く消費するというデメリットもあります。
この方法では、仮想環境全体を別のOS（オペレーティングシステム）として動かしていたため、非常に多くのメモリやディスク容量が必要でした。


## Dockerが使う「コンテナ型の仮想化」

一方、Dockerが使う「コンテナ型の仮想化」は、もっと効率的です。コンテナは、ホストとなるコンピュータの一部を借りて、独立した環境を作り出します。この方法では、コンテナ同士が互いに干渉せず、必要なリソースだけを効率よく使うことができます。これにより、少ないリソースで多くのアプリケーションを動かすことができるようになります。

Dockerを使うことで、ソフトウェア開発者は、アプリケーションの動作環境を簡単に作り出し、その環境を他の人と共有したり、どこでも同じように動かしたりすることができるのです。

プロセスの隔離にはホストOSで動作しているカーネルの機能が使われ、プロセスの実行に伴ってハイパーバイザといったプログラムが介入することはありません。
また、コンテナごとにカーネルといったOSの機能が別々に実行されることもありません。

Linuxで動作しているDockerの場合、プロセスを隔離するためにLinuxカーネルが提供している

cgroups（control groups）が用いられ、ルートディレクトリを分離するためにchrootが使われています。

## cgroupsとは？

cgroupsとは？ cgroups（control groups）というのは、Linuxというオペレーティングシステム（OS）における機能の一つです。簡単に言うと、コンピュータの中で動いているプログラムやプロセスに対して、使えるリソース（CPUやメモリなど）を管理するための仕組みです。

何をするのか？ cgroupsの主な役割は、次のようなことです：

リソースの割り当て: コンピュータの中で動いている各プログラムが、どれくらいのCPUやメモリを使うかを制限したり、管理したりします。これにより、一部のプログラムがコンピュータのリソースを独り占めしてしまうのを防ぎます。

プロセスのグループ化: cgroupsは、いくつかのプログラムやプロセスを「グループ」にまとめ、そのグループに対してリソースを一括で管理することができます。たとえば、ある特定のアプリケーションが複数のプロセスで動いている場合、それらを1つのグループとしてまとめ、そのグループ全体に対してリソースを割り当てることができます。

例えると… 例えば、cgroupsを学校の先生に例えてみましょう。先生はクラスの生徒たち（プログラムやプロセス）が、授業中にどれだけノートを使えるか（リソースの割り当て）を管理します。また、グループ活動をさせるときには、生徒たちをいくつかのグループに分けて、それぞれのグループに対して活動の時間や使える道具を配分します（プロセスのグループ化）。

なぜ重要か？ cgroupsがあることで、コンピュータが効率よく、そして公平にリソースを使うことができるようになります。これにより、Dockerのような仮想化技術が多くのプログラムを同時に実行するときでも、システム全体が安定して動作することができるのです。

要するに、cgroupsは、コンピュータの中で動くプログラムに対してリソースを賢く配分し、
全体のパフォーマンスを保つための「管理者」のような役割を果たしているのです。

Dockerではコンテナ内から見えるファイルはイメージという形で扱われており、実際にはホスト環境のファイルシステム上のファイルとして展開されています。ファイルシステムの機能（LinuxではAufsやOverlayFSやDevice Mapper）を用いることで、同じイメージを使って実行しているコンテナは書き込みがない限り同じファイルを参照するようになっています。

これらの理由により、Dockerが用いているコンテナ型の仮想化はハイパーバイザ型の仮想化よりも性能低下が少なく消費リソースも少ないといった利点を持っています。


# Dockerのイメージについて

Dockerのイメージとは？ Dockerの「イメージ」というのは、コンピュータ上で動かすためのアプリケーションやプログラムが入った特別なファイルです。このイメージを使うことで、簡単にアプリケーションを実行できる「コンテナ」を作り出すことができます。

イメージの特徴：不変なインフラ Dockerでは、「immutable infrastructure（不変なインフラ）」という考え方が取り入れられています。これは、一度作ったイメージは、その後変更せずに使い続けるというものです。イメージを書き換えたりする代わりに、新しいバージョンのイメージを作って、それを使って新しいコンテナを作り直すことが推奨されています。

イメージの利点 この方法の良い点は、イメージの中身を固定しておくことで、アプリケーションやサービスが安定して動作するようになることです。例えば、サービスを新しいバージョンにアップデートする場合でも、あらかじめ作っておいた新しいイメージを使えば、簡単に新しい環境を立ち上げることができます。これにより、アップデート時に設定を変更したり、複雑な作業を行ったりする必要がなくなります。

Dockerイメージのビルド Dockerイメージを作る（ビルドする）際には、以前作ったイメージを基にして、新しい部分だけを追加していく形で行われます。これにより、効率よく新しいバージョンのイメージを作り上げることができます。例えば、あるアプリケーションが既に動いている状態でも、新しいバージョンのイメージを使ってすぐに新しい環境を作ることができるため、サービスを一時的に停止する必要がなくなります。


# Dockerを使って開発と運用を効率化する方法

Dockerは、開発環境と本番環境の違いを少なくすることで、スムーズなアプリケーションの開発や運用ができるというメリットがあります。これをさらに活用して、全体の開発や運用の流れ（フロー）をより効率的にする方法があります。

Dockerを使うと、アプリケーションを「コンテナ化」できます。コンテナ化とは、アプリケーションを実行するための環境をまるごと一つの単位にまとめてしまうことです。これによって、どの環境（開発中の環境や実際に使う環境）でも、同じようにアプリケーションが動作するようになります。

通常、アプリケーションを動かすためには、その環境に合わせた準備作業が必要です（ソフトウェアのインストールや設定など）。しかし、Dockerを使えば、こうした作業の大部分はコンテナを作成する時点で済んでいるので、わざわざ手作業で準備する必要がほとんどなくなります。つまり、あらかじめ準備しておいた「イメージ」というファイルを使って新しいコンテナを立ち上げるだけで、すぐにアプリケーションを動かすことができるのです。

さらに、過去に作った「イメージ」を保存しておけば、もし何か問題があったときにも、そのイメージを使って元の状態に簡単に戻す（ロールバックする）ことができます。これにより、運用手順がシンプルになり、ミスが減るだけでなく、迅速な対応が可能になります。



# Docker Composeとは？


Docker Composeは、複数のコンテナを使ってアプリケーションを構成し、まとめて管理するためのツールです。例えば、あるアプリケーションが「データベース」と「ウェブサーバー」という2つの部分で動いているとします。通常、それぞれの部分を別々に設定しなければなりませんが、Docker Composeを使えば、それらを一つの「プロジェクト」としてまとめて管理できます。

具体的には、「YAMLファイル」という設定ファイルに、どのコンテナを使うかや、そのコンテナがどう動くべきかを記述します。Docker Composeは、そのYAMLファイルを読み込んで、自動的にコンテナを設定し、実行してくれるのです。これにより、複雑なアプリケーションのセットアップや管理が簡単になります。

要するに、Docker Composeを使えば、複数のコンテナを効率よく管理し、アプリケーションの動作をシンプルにコントロールできるようになります。


# Docker CLIのコマンド

Docker CLIのコマンド
Dockerを操作するためには、さまざまなコマンドがあります。これらのコマンドを使って、Docker内の作業を効率的に進めることができます。

イメージの管理コマンド
イメージは、コンテナを作る際の基盤となるもので、コンテナ内部のファイルシステムやアプリケーションのセットアップが含まれます。以下は、イメージに関する主なコマンドです。

docker image build / docker build
Dockerfileから新しいイメージをビルドします。

docker image history / docker history
イメージがどのように作られたかの履歴を表示します。

docker image import / docker import
外部のファイル（tarアーカイブ）から新しいイメージを作成します。

docker image inspect
イメージの詳細情報を確認できます。

docker image load / docker load
保存されたイメージファイル（tarアーカイブ）を読み込んで、Dockerで使えるようにします。

docker image ls / docker images
ローカルにあるイメージの一覧を表示します。

docker image prune
不要なイメージを削除します。特に、タグが付いていないイメージや未使用のイメージが対象です。

docker image pull / docker pull
Dockerリポジトリ（例えば、Docker Hub）からイメージを取得します。

docker image push / docker push
ローカルのイメージをDockerリポジトリに送信します。

docker image rm / docker rmi
不要になったイメージを削除します。

docker image save / docker save
イメージをファイル（tarアーカイブ）に保存します。

docker image tag / docker tag
イメージに新しいタグを付けます。これにより、同じイメージに異なる名前をつけて管理できます。
コンテナの管理コマンド
コンテナは、実際にアプリケーションが動く環境です。以下は、コンテナに関する主なコマンドです。

docker container attach / docker attach
実行中のコンテナに接続し、その標準入力と出力を使用できるようにします。

docker container commit / docker commit
コンテナ内の変更を新しいイメージとして保存します。

docker container cp / docker cp
ファイルやディレクトリをコンテナとホスト間でコピーします。

docker container create / docker create
新しいコンテナを作成しますが、すぐには起動しません。

docker container diff / docker diff
コンテナ内で変更されたファイルやディレクトリを確認します。

これらのコマンドを活用することで、Dockerをより効率的に管理し、様々な作業を自動化することができます。