DevContainerでの開発環境構築が自分ですんなりできるよう、Dockerの学習から始めた初学者です!
前回DevContainerで開発環境を構築する為に必要な前提知識として、Docker
とDevContainer
の学習をしていくことにしました。
本記事では超基本的なDocker入門
について学んだことでも備忘録がてら書いていきます!
初学者の自分でもわかるようにかなり簡潔(雑になりそう)にまとめていきます。
Dockerとは?
まず、Dockerとはなんでしょうか?
Dockerとは「アプリケーションを「コンテナ」と呼ばれる独立した環境にパッケージ化するためのツール」です。
簡単に例に例えると、引越しの段ボール箱のようなものです。
1.必要なものを全て箱に詰める
- アプリケーションのコード
- 実行に必要なソフトウェア
- 設定ファイル
- ライブラリなど
2.その箱があれば、どのコンピュータでも同じように動く
- 開発環境
- テスト環境
- 本番環境
3.他の箱(コンテナ)と干渉せず、独立して動作する
そのため、「自分のPCでは動いたのに、本番環境では動かん!」という問題を防ぐことができます。
イメージとは?
Dockerのイメージとは、「アプリと実行に必要な全ての依存関係を含む不変のテンプレート」です。
設計図みたいなものです!
イメージの基本構成
イメージの基本構成は、以下のようなものになっています(詳しめに書きます)
-
ベースイメージ
- OS層(Ubuntu,Alpine,Linux,CentOS)
- 最小限の機能を持つ軽量OSを選択することが推奨される
- 例
FROM alpine:3.14 # 軽量なLinuxディストリビューション
# or
FROM node:16-slim # 言語特化型の軽量イメージ
-
アプリーケーションの実行環境(OS、ランタイム)
- プログラミング言語のランタイム(Node.js, Python, Java等)
- ミドルウェア(Nginx, Apache等)
- 例
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
postgresql-client
-
依存ライブラリ
- アプリケーションが必要とするパッケージ
- バージョン管理ファイル(package.json, requirements.txt等)
- 例
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
-
設定ファイル群
- 環境変数設定
- アプリケーション設定ファイル
- サーバー設定ファイル
- 例
COPY nginx.conf /etc/nginx/nginx.conf
ENV APP_ENV=production
ENV DB_HOST=localhost
イメージの主な特徴
イメージの主な特徴は
- 不変性
- レイヤー化されたファイルシステム
- ポータビリティ
- バージョン管理
です!一つづつかなり簡潔に見ていきます。
不変性
不変性とは簡単にいうと変更不可という意味です。
一度作成されたイメージは変更不可でReadOnlyになります!
レイヤー化されたファイルシステム
レイヤー化されているため、各レイヤーは差分のみを保持します。
そのためストレージ効率が良く、キャッシュメカニズムにより高速なビルドが可能です。
ポータビリティ
どの環境でも同じように動作します!
環境依存性を排除し、簡単な移植性を有しています。
バージョン管理
タグによってバージョンを管理することができます。
また、ロールバックも容易で、イメージの履歴追跡が可能です!
レイヤーの基本概念
レイヤーとは、「重ねられた層」のようなものです。ケーキを例に考えると、
- スポンジ(ベースレイヤー)
- クリーム(第2レイヤー)
- フルーツ(第3レイヤー)
- デコレーション(最終レイヤー)
のような感じでしょうか?Dockerでも同じように、1つ1つの命令が新しい層となって重なっていきます
# 1層目:ベースとなるOS
FROM ubuntu:20.04
# 2層目:パッケージリストの更新
RUN apt-get update
# 3層目:Nginxのインストール
RUN apt-get install -y nginx
# 4層目:アプリケーションファイルのコピー
COPY ./app /var/www/html/
# 5層目:設定ファイルの配置
COPY nginx.conf /etc/nginx/conf.d/
# 6層目:起動コマンドの設定
CMD ["nginx", "-g", "daemon off;"]
レイヤーは読み取り専用なので、一度作成されたレイヤーは変更できません。変更が必要な場合は新しいレイヤーを重ねます。
また、差分を管理しているので、各レイヤーは前のレイヤーからの変更点のみを保存し、ストレージの効率的な使用が可能です!
To be continue
次回は、dockerの重要な概念の一つである「コンテナ」について書いていきます!