Dockerとは?
Dockerは、アプリケーションを「コンテナ」という単位でパッケージ化し、どこでも同じ環境で実行できるようにするツールです。
なぜDockerを使うのか?
実務でDockerが使われる主な理由は以下の通りです:
- 環境の統一:「私のPCでは動くのに...」問題を解決
- 簡単なセットアップ:複雑な環境構築を1コマンドで完了
- クリーンな環境:プロジェクトごとに独立した環境を作成
- チーム開発:全員が同じ環境で開発できる
コンテナとは?
コンテナは、アプリケーションとその実行に必要なすべて(ライブラリ、設定ファイルなど)をまとめたパッケージです。軽量で起動が速く、複数のコンテナを同時に実行できます。
💡 コンテナとVMの違い
仮想マシン(VM):ハードウェア全体を仮想化。重くて起動が遅い。
コンテナ:OSレベルで仮想化。軽量で起動が速い。
なぜWindows/Macでも同じものが動くのか?
Dockerコンテナは実はLinux上で動いています。
- Linux:Dockerが直接動く(ネイティブ)
- Windows/Mac:Docker Desktopが内部で軽量なLinux仮想マシンを起動し、その上でコンテナを実行
つまり、Windows版でもMac版でも、実際にはLinuxコンテナが動いているため、どの環境でも同じように動作するのです。
💡 補足
Docker Desktopを使えば、この仕組みを意識することなく、Windows/MacでもLinuxコンテナを簡単に使えます。これがDockerの便利なところです。
イメージとは?
イメージは、コンテナを作るための「設計図」や「テンプレート」です。イメージからコンテナを何個でも作成できます。
- イメージ:設計図(読み取り専用)
- コンテナ:実際に動いているアプリケーション
実際の開発での使い方
実務では、複数のイメージを組み合わせてプロジェクト全体の環境を作ります。例えば:
💡 実例:Webアプリケーションの構成
Node.js + PostgreSQL + Redisの組み合わせ:
node:18- アプリケーションサーバーpostgres:15- メインデータベースredis:7- セッション管理やキャッシュ
これら3つのコンテナが連携して、1つのWebサービスとして動きます。
💡 実例:Pythonデータ分析環境
Jupyter + PostgreSQL + Nginxの組み合わせ:
-
jupyter/datascience-notebook- データ分析環境 postgres:15- 分析用データベースnginx:latest- リバースプロキシ
チーム全員が同じデータ分析環境で作業できます。
単体で使える便利なイメージ
もちろん、単体で使える便利なイメージもあります:
wordpress- WordPressサイトがすぐ起動gitlab/gitlab-ce- GitLabサーバー一式nextcloud- 自分専用クラウドストレージjenkins- CI/CD環境
これらは複数のサービスが1つのイメージにパッケージされているので、すぐに使い始められます。
Dockerのインストール
DockerをPCにインストールする方法を説明します。
Windows / Macの場合
Docker Desktopをインストールします。これが一番簡単な方法です。
手順:
- Docker Desktop公式サイトにアクセス
- お使いのOS(Windows または Mac)に合わせてダウンロード
- インストーラーを実行
- 再起動後、Docker Desktopを起動
⚠️ Windows注意点
Windows 10/11 Home版の場合、WSL 2(Windows Subsystem for Linux 2)が必要です。インストール時に自動で案内されます。
Linuxの場合
Ubuntuでのインストール例:
# 古いバージョンを削除
sudo apt-get remove docker docker-engine docker.io containerd runc
# 必要なパッケージをインストール
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# DockerのGPGキーを追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# リポジトリを追加
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Dockerをインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# sudoなしで実行できるようにする(オプション)
sudo usermod -aG docker $USER
インストール確認
ターミナルまたはコマンドプロンプトで以下のコマンドを実行:
docker --version
バージョン情報が表示されればインストール成功です。
# 動作確認(Hello Worldを実行)
docker run hello-world
「Hello from Docker!」というメッセージが表示されれば完璧です。
基本的な概念
Dockerfile
Dockerイメージを作るための設計書です。テキストファイルで、どのようにイメージを構築するかを記述します。
# 例:シンプルなNode.jsアプリのDockerfile
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]
docker-compose.yml
複数のコンテナをまとめて管理するための設定ファイルです。実務ではこれを使うことが多いです。
# 例:WebアプリとデータベースのCompose設定
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: password
💡 重要:1つのプロジェクト = 複数のコンテナ
上の例では、2つのコンテナが起動します:
- webコンテナ:Node.jsアプリケーション
- dbコンテナ:PostgreSQLデータベース
それぞれ独立したコンテナですが、内部ネットワークで自動的に接続されます。
実際のプロジェクトでは?
より複雑なプロジェクトでは、さらに多くのコンテナを組み合わせます:
# 例:本格的なWebサービスの構成
version: '3.8'
services:
# フロントエンド(React/Next.js)
frontend:
build: ./frontend
ports:
- "3000:3000"
# バックエンドAPI(Node.js)
backend:
build: ./backend
ports:
- "4000:4000"
# データベース(PostgreSQL)
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: password
# キャッシュ(Redis)
redis:
image: redis:7
# 検索エンジン(Elasticsearch)
search:
image: elasticsearch:8.11.0
environment:
- discovery.type=single-node
この例では5つのコンテナが連携して動きます。でも、起動は1コマンドだけ:
docker-compose up
これで全部のコンテナが起動し、自動的に接続されます。止める時も:
docker-compose down
このように、複数のコンテナをまとめて管理できるのがdocker-composeの便利なところです。
Docker Hub
Dockerイメージの公開リポジトリです。Node.js、Python、PostgreSQLなど、様々な公式イメージが公開されています。
Docker Hubで必要なイメージを探せます。
ボリューム(Volume)の使い方
ボリュームは、コンテナのデータを永続的に保存するための仕組みです。コンテナは基本的に「使い捨て」なので、削除するとデータも消えてしまいます。ボリュームを使えば、コンテナを削除してもデータを保持できます。
どんな時に使うのか?
実務では主に以下の場面で使います:
💡 必ずボリュームが必要な場面
- データベース:PostgreSQL、MySQL、MongoDBなどのデータ
- アップロードファイル:ユーザーがアップロードした画像や文書
- ログファイル:アプリケーションのログを永続化
基本的な使い方
docker-compose.ymlでボリュームを定義します:
# 例:データベースのデータを永続化
version: '3.8'
services:
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
volumes:
postgres_data: # 名前付きボリューム
これで、コンテナを削除(docker-compose down)しても、postgres_dataボリュームにデータが残ります。
開発時の便利な使い方
開発中は、ローカルのコードをコンテナに同期させることで、コード変更が即座に反映されます:
# 例:Node.js開発環境
version: '3.8'
services:
app:
image: node:18
working_dir: /app
volumes:
- ./:/app # ローカルのコードを同期
- node_modules:/app/node_modules # node_modulesは別管理
command: npm run dev
ports:
- "3000:3000"
volumes:
node_modules:
⚠️ 重要:ボリュームの削除に注意
docker-compose down - ボリュームは保持(通常はこれ)
docker-compose down -v - ボリュームも削除(データが消える!)
実践例:Webアプリケーション全体
version: '3.8'
services:
web:
build: .
volumes:
- ./src:/app/src # コード同期(開発用)
- uploaded_files:/app/uploads # アップロードファイル保存
ports:
- "3000:3000"
db:
image: postgres:15
volumes:
- db_data:/var/lib/postgresql/data # DBデータ保存
environment:
POSTGRES_PASSWORD: password
volumes:
uploaded_files:
db_data:
この例では、3つのボリュームを使用:
./src:/app/src- コード変更の即時反映uploaded_files- ユーザーのアップロードファイル保存db_data- データベースのデータ保存
よく使う用語
イメージ(Image)
コンテナを作るためのテンプレート。読み取り専用。
コンテナ(Container)
イメージから作られた、実際に動作する環境。
Dockerfile
イメージを作るための設計書。
docker-compose
複数のコンテナをまとめて管理するツール。
ボリューム(Volume)
データを永続化するための仕組み。コンテナを削除してもデータは残る。
ポート(Port)
コンテナと外部の通信経路。例:3000番ポートでアクセス。