目次
- 導入
- Dockerの設計思想
- Dockerの3つの核となる概念
- 基本原理
- 主な用途
- コマンド操作
- データボリューム(永続化)
- Dockerfileの活用
- イメージからコンテナ生成
- docker-compose.ymlの使い方
導入
開発やデプロイ作業において、多くの人が直面する共通の課題があります:
「ローカルでは動作するが、別の環境ではエラーになる」
この問題は単なるバージョン違いではなく、以下のような環境差異が根本原因です:
- OSの違い(Windows/Mac/Linux)
- 言語バージョンの違い(Python3.9/3.10、JDK8/17など)
- 依存ライブラリの不足やバージョン衝突
- 環境変数やシステム設定の違い
Dockerの設計思想
Dockerはこの環境依存性の問題を解決するために設計されました。生活に例えると:
- プロジェクト = 花
- Docker = 移植可能なポット
- Dockerfile = ポットの作成手順書
従来の移栽方法では、花(プロジェクト)を直接他の土地(環境)に移植すると枯れてしまうように、環境差異により動作不能になります。
Dockerの解決策は「花+土壌+肥料+気温」をすべて含むポットをパッケージングし、どこにでも移植できるようにすることです。
Dockerの3つの核となる概念
- レポジトリ(Repository)
- イメージ(Image)
- コンテナ(Container)
レポジトリに保存されたイメージがインスタンス化されコンテナが生成されます。
基本原理
DockerはLinuxのNamespaceによる環境分離とCgroupsによるリソース制限を基盤としています。
- コンテナはホストOSのカーネルを共有するため軽量
- 分層構造のイメージにより再利用性が高まる
- アプリケーションと依存関係を統合パッケージすることで環境依存を解消
主な用途
- 開発チームの環境統一
- 非開発者向けの簡易実行環境提供
- サーバーへの簡単なデプロイ
コマンド操作
イメージ操作
docker images # 一覧表示
docker rmi image_name # 削除
コンテナ操作
docker run -d --name my_container image_name # 実行
docker ps -a # 一覧(停止中含む)
docker rm -f container_id # 強制削除
データボリューム(永続化)
概要
データボリュームはコンテナの外置ストレージのような存在で、以下の特徴があります:
- コンテナ削除後もデータが保持される
- 複数コンテナ間でのデータ共有が可能
- アプリケーションとデータの分離が可能
コマンド操作
docker volume create my_volume # 作成
docker volume ls # 一覧
docker run -v my_volume:/path_in_container image_name # 掛け
Dockerfileの活用
概要
Dockerfileはプロジェクトの実行環境構築手順を記述するファイルです。
基本例
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install flask
CMD ["python", "app.py"]
企業向け進階例
# === ビルドフェーズ ===
FROM maven:3.8.6-jdk-11 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package
# === 実行フェーズ ===
FROM openjdk:11-jre-slim
ENV TZ=Asia/Tokyo
WORKDIR /app
COPY --from=builder /build/target/app.jar .
ENTRYPOINT ["java", "-jar", "app.jar"]
イメージからコンテナ生成
生成方法は以下の2通りがあります:
- サーバー側で直接ビルド
- ローカルでビルド→イメージファイル転送
どちらの場合も最終的に
docker-compose up -d
で一括起動が可能です。
docker-compose.ymlの使い方
version: '3.8'
services:
user-service:
image: user-app:1.0
container_name: user_svc
restart: always
order-service:
image: order-app:1.0
ports:
- "8080:8080"
depends_on:
- user-service
このように複数サービスの管理が容易になります。