Dockerはどのように動くのか?

こんにちは。私はダットです。ソフトウェアエンジニアです。Javaのプログラムを作ることをしています。
プログラミングの知識や経験をみなさんにシェアするのが好きです。
このブログがあなたの役に立つとうれしいです。
はじめに
前回の記事では、Dockerの基本的な概念として、Image、Container、Dockerfileの3つを紹介しました。
今回は、さらに一歩踏み込んで、Dockerが内部でどのように動作しているのか、ImageとContainerの違い、そして Layer、Volume、Networkの役割について初心者にも分かりやすく解説します。 それでは、一緒にDockerの仕組みを見ていきましょう。

Dockerはどのように動くのか?
Dockerは「コンテナ型仮想化」と呼ばれる技術を使用しています。
従来の仮想マシン(VM)では、OS、アプリケーション、ライブラリなど、あらゆる要素を仮想化する必要がありました。各アプリケーションが個別の OS を使用すると、リソース消費が非常に大きくなります。
ただし、Dockerでは、ホストOSのカーネルを共有しつつアプリケーションをそれぞれ独立した環境で実行します。
そのため、起動が速く、軽量であり、多くのコンテナを同時に動かせるなどのメリットがあります。
これらの利点により、複数のアプリケーションを個別のコンテナで実行できるため、リソース消費を大幅に抑えることができます 。
Docker Layerとは
Docker Imageは「Layer」という仕組みで構成されています。
Layerとは、Imageを小さな層に分けて保存する仕組みです。
例えば、Dockerfileが次のようになっている場合:
FROM ubuntu
RUN apt install nginx
COPY index.html /var/www/html
Dockerは次のLayerを作ります:
1. Ubuntu layer
2. nginx layer
3. application layer
Dockerのレイヤー機構は、キャッシュを利用して重複するデータ層を再利用することで、ストレージ容量の最適化やビルドおよび転送速度の向上を実現しています。
複数の読み取り専用(Read-only)レイヤーを積み重ねることで、Docker はベース環境の一貫性を維持しつつ、コンテナが一時的な書き込みレイヤー上で柔軟に動作できるようにしています。
Volumeとは
コンテナは、停止するとデータが消失する可能性があります。そのため、Volumeが利用されます。Volumeは、コンテナ外にデータを保存する仕組みです。
実際に Docker コンテナ上で DB サーバーを構築する場合、Volumeを定義しないと、コンテナ停止時にデータが消失してしまいます 。
以下は、DockerコンテナでVolumeを宣言して使用する例です。
version: "3.9"
services:
web:
image: nginx:latest
container_name: web-container
ports:
- "8080:80"
networks:
- app-network
db:
image: mysql:8
container_name: db-container
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: sampledb
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
volumes:
db-data:
networks:
app-network:
Networkとは
Docker Networkは、コンテナ同士が通信するための仕組みです。
例:
· Web container
· API container
· Database container
これらがネットワークで接続されます。
上記のサンプルコンテナ例では、webコンテナと dbコンテナがどちらも app-networkに参加しています。そのため、両コンテナは互いに通信することが可能です。
まとめ
本記事では、Dockerの動作メカニズムについて説明し、従来のVMとの比較を行いました。 次回の記事では、Dockerを用いてアプリケーションをデプロイする方法について、より詳細に解説します。
注釈
Dockerfile
Dockerfile はテキスト形式のファイルであり、Docker が Docker イメージをビルドする際に参照する一連のコマンドを記述したものです。
Image(イメージ)
イメージとは、ソフトウェアを実行するために必要なすべての要素を含んだ、読み取り専用のパッケージファイルです。
Container
イメージから生成される実行環境です。
参考資料:

