0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

普段、開発ではDockerを日常的に使っています。

docker compose up -d

手順に沿って構築し、上記を実行すれば開発環境が立ち上がり、特に困ることもありません。

ここ最近ふと思ったのは

  • Dockerって結局何をしているのか?
  • ImageとContainerの違いは?
  • 仮想マシンと何が違うの?

というもの。
普段使っているのに説明できなかったので、この機会にDockerの仕組みを整理してみました。
おもに基礎知識になる部分です。

なぜ調べたか

Dockerは便利です。

プロジェクトをクローンして、

docker compose up -d

を実行するだけで環境が立ち上がります。

ただ、エラーが発生したときに直接Dockerfileを修正するときになると、理解が曖昧な部分が多いことに気付きました。

基本的にツールは仕組みを理解していた方が圧倒的にトラブル対応もしやすいため、一度基礎から調べてみることにしました。

そもそも Docker とは

Dockerは一言でいうと、アプリケーションを実行するための環境をまとめて管理できる仕組み です。

例えばPHPのアプリケーションを動かす場合、

  • PHP
  • Nginx
  • MySQL
  • 各種ライブラリ

などが必要になります。

開発者ごとに環境が違うと、「自分のPCでは動くのに、他の人のPCでは動かない」 という問題が発生します。

そこでこのDockerを使うことで、環境ごとパッケージ化し、どこでも同じ状態を再現できるようになります。

Dockerができた理由

Dockerが登場する前は、前段の通り環境構築に多くの手間がかかっていました。

例えば、

  • AさんのPCでは動く
  • BさんのPCでは動かない
  • 本番環境だけエラーになる

といった問題が頻繁に発生していました。

これを解決するために、「実行環境ごとまとめて配布しよう」 という考え方が生まれました。

以前から仮想マシン(Virtual Machine)という仕組みはありましたが、OSごと起動するため動作が重いという課題がありました。

DockerはOS全体を仮想化するのではなく、必要なプロセスだけを隔離して実行することで、軽量かつ高速な環境構築を実現しています。

現在では多くの開発現場で採用される理由も納得できます。

Docker公式ドキュメントでは、コンテナについて以下のように説明されています。

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.

https://www.docker.com/resources/what-container/

つまり 「アプリケーションと依存関係をまとめて持ち運べる仕組み」 と読み取れます。

Dockerのメインとなる仕組み

Dockerを理解するうえで重要なのは、以下の5つが挙げられます。

Dockerfile

Docker環境の設計図になります。
どのベースイメージを使うかどのライブラリをインストールするかどのコマンドを実行するかなどを定義します。

つまり環境を定義するファイルです。

例えば、

FROM php:8.3-fpm
RUN docker-php-ext-install pdo_mysql

のように記述して使用します。


Image

Dockerfileから作られる成果物です。
イメージは変更されないテンプレートのような存在です。

料理で例えると、

  • Dockerfile = レシピ
  • Image = 完成した冷凍食品

のようなイメージです。


Container

Imageを実際に起動したものです。
コンテナは実行中の環境そのものになります。

料理の例なら、

  • Image = 冷凍食品
  • Container = 実際に食べるために温めた料理

に近いです。

普段立ち上げて触っているアプリケーションは、このコンテナの中で動いています。


Volume

コンテナ内部に保存したデータは、コンテナを削除すると一緒に失われます。
ですが、データベースのデータまで消えてしまうので、それを防ぐためにVolumeが使われています。

Volumeを利用すると、

  • MySQLのデータ
  • アップロードファイル

などをコンテナの外に保存できます。
そのためコンテナを削除してもデータは残るという仕組みですね。


Docker Compose

複数のコンテナをまとめて管理する仕組みです。

例えばWebアプリでは、

  • Nginx
  • PHP
  • MySQL

など複数のコンテナが必要になります。

Composeを使うと、以下のコマンドだけでまとめて起動できます。

docker compose up -d

普段何気なく実行しているコマンドは、実は複数のコンテナを一括管理してくれているのです。

Dockerを調べてみて分かったこと

調べる前は、ざっくりですが 「Dockerは軽量な仮想マシンみたいなもの」 くらいの認識でした。

しかし実際には、

  • Dockerfileで環境を定義する
  • Imageを作成する
  • Containerとして実行する
  • Volumeでデータを保持する
  • Composeで複数コンテナを管理する

という仕組みで動いていることが分かりました。

また、「コンテナは消えてもよい存在」 という考え方も印象的でした。

データはVolumeに保存し、コンテナ自体はいつでも作り直せる状態にしておくのがDockerらしい運用なのだと理解しました。

まとめ

普段Dockerを使っていても、

docker compose up -d

上記を実行するだけで済んでしまうため、内部の仕組みまで意識する機会は人によりますが多くありません。

今回調べてみて、超基礎的な部分ですが

  • Dockerfile
  • Image
  • Container
  • Volume
  • Compose

の関係性が整理できました。

もちろん今回でDockerを完全に理解したとは言えませんが、「何となく使う」状態からは一歩前進できたと思っています。

同じようにDockerを使っているけれど仕組みまでは理解していない方の参考になれば幸いです。

今度は実際にDockerfileやdocker-compose.ymlの中身を読み解きながら、もう少し深く理解できるようまとめたいなと思います。

ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?