📋 このステップで学ぶこと
データの永続化が必要な理由
Dockerの3つのデータ保存方法の違い
ボリューム(Volume)の作成と管理
バインドマウント(Bind Mount)の使い方
-vオプションと–mountオプション
ボリュームのバックアップとリストア
PostgreSQLのデータ永続化実践
💾 1. データの永続化とは
1-1. コンテナのデータは消える
Dockerコンテナは、削除するとコンテナ内のデータもすべて消えます 。
これは、コンテナが「使い捨て」として設計されているためです。
【コンテナのデータが消える仕組み】
┌─────────────────────────────────────────────┐
│ コンテナ(起動中) │
│ ┌─────────────────────────────────────┐ │
│ │ アプリケーション │ │
│ │ データファイル ← ここに保存 │ │
│ │ 設定ファイル │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
│
│ docker rm(コンテナ削除)
▼
💨 全て消滅!
【データを永続化する仕組み】
┌─────────────────────────────────────────────┐
│ コンテナ(起動中) │
│ ┌─────────────────────────────────────┐ │
│ │ アプリケーション │ │
│ │ /var/lib/postgresql/data ─────────┼───┼─┐
│ └─────────────────────────────────────┘ │ │
└─────────────────────────────────────────────┘ │
│ │
│ docker rm │
▼ │
コンテナは消滅 │
▼
┌──────────────────────┐
│ ボリューム(残る) │
│ データファイル ✓ │
└──────────────────────┘
1-2. データが消える問題の実例
😱 データが消える!(実演)
# 1. PostgreSQLコンテナを起動
docker run -d –name my-db -e POSTGRES_PASSWORD=secret postgres
# 2. データベースを作成してデータを挿入
docker exec -it my-db psql -U postgres -c “CREATE DATABASE myapp;”
docker exec -it my-db psql -U postgres -d myapp -c “CREATE TABLE users(id INT, name VARCHAR(50));”
docker exec -it my-db psql -U postgres -d myapp -c “INSERT INTO users VALUES(1, ‘太郎’);”
# 3. データを確認
docker exec -it my-db psql -U postgres -d myapp -c “SELECT * FROM users;”
# → 太郎が表示される
# 4. コンテナを削除
docker stop my-db
docker rm my-db
# 5. 再度起動
docker run -d –name my-db -e POSTGRES_PASSWORD=secret postgres
# 6. データを確認
docker exec -it my-db psql -U postgres -d myapp -c “SELECT * FROM users;”
# → エラー!データベース ‘myapp’ が存在しない!
1-3. 3つのデータ保存方法
Dockerには、データを永続化する3つの方法 があります。
方法
説明
主な用途
ボリューム
Dockerが管理する専用の保存領域。/var/lib/docker/volumes/に保存される。
本番環境でのデータ永続化。データベース、ファイルストレージなど。
バインドマウント
ホストの任意のディレクトリをコンテナにマウント。
開発環境でのソースコード共有。設定ファイルの外部管理。
tmpfs マウント
ホストのメモリ上に一時保存。コンテナ停止で消える。
セキュリティ上重要な一時データ。高速なキャッシュ。
【3つの保存方法の比較図】
ホストマシン
┌────────────────────────────────────────────────────────────────┐
│ │
│ ファイルシステム │
│ ┌──────────────────────────┐ │
│ │ /home/user/project/ │ ← バインドマウント │
│ │ ├── src/ │ (ホストの任意のパス) │
│ │ └── config/ │ │
│ └──────────────────────────┘ │
│ │
│ Docker管理領域 │
│ ┌──────────────────────────┐ │
│ │ /var/lib/docker/volumes/ │ ← ボリューム │
│ │ ├── db-data/ │ (Dockerが自動管理) │
│ │ └── app-data/ │ │
│ └──────────────────────────┘ │
│ │
│ メモリ │
│ ┌──────────────────────────┐ │
│ │ tmpfs │ ← tmpfsマウント │
│ │ └── secrets/ │ (メモリ上、再起動で消滅) │
│ └──────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
📦 2. ボリューム(Volume)
2-1. ボリュームとは
ボリューム は、Dockerが管理する専用のデータ保存領域 です。
本番環境でのデータ永続化に推奨される方法 です。
📦 ボリュームの特徴
Dockerが専用の場所 (/var/lib/docker/volumes/)に保存
コンテナから独立 しており、コンテナ削除後も残る
複数のコンテナで共有 できる
Docker CLIで簡単に管理 (作成、削除、バックアップ)
ホストのファイルシステムに依存しない (ポータブル)
2-2. ボリュームの作成
docker volume create postgres-data
📝 コマンドの意味
docker volume create :ボリュームを作成するコマンド
postgres-data :ボリュームの名前(任意)
2-3. ボリュームの一覧と詳細
# ボリューム一覧を表示
docker volume ls
DRIVER VOLUME NAME
local postgres-data
local mysql-data
local app-logs
# ボリュームの詳細を確認
docker volume inspect postgres-data
[
{
“CreatedAt”: “2024-01-15T10:30:00+09:00”,
“Driver”: “local”,
“Labels”: {},
“Mountpoint”: “/var/lib/docker/volumes/postgres-data/_data”,
“Name”: “postgres-data”,
“Options”: {},
“Scope”: “local”
}
]
📝 inspectの出力項目
CreatedAt :作成日時
Driver :ストレージドライバー(通常は local)
Mountpoint :ホスト上の実際の保存パス
Name :ボリューム名
Scope :スコープ(local = このホストのみ)
2-4. ボリュームを使ってコンテナを起動
docker run -d –name my-db \
-v postgres-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
📝 -v オプションの書き方
-v ボリューム名:コンテナ内のパス
postgres-data :使用するボリューム名
: :区切り文字
/var/lib/postgresql/data :コンテナ内でマウントするパス(PostgreSQLのデータ保存先)
💡 各アプリケーションのデータ保存パス
アプリケーションによって、データの保存先は異なります。
アプリケーション
データ保存パス
PostgreSQL
/var/lib/postgresql/data
MySQL
/var/lib/mysql
MongoDB
/data/db
Redis
/data
Nginx
/usr/share/nginx/html
2-5. データ永続化の実践
ボリュームを使って、コンテナを削除してもデータが残ることを確認しましょう。
# 1. ボリュームを作成
docker volume create postgres-data
# 2. ボリュームを使ってPostgreSQLを起動
docker run -d –name my-db \
-v postgres-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
postgres
# 3. データベースとテーブルを作成、データを挿入
docker exec -it my-db psql -U postgres -c “CREATE DATABASE myapp;”
docker exec -it my-db psql -U postgres -d myapp -c “CREATE TABLE users(id INT, name VARCHAR(50));”
docker exec -it my-db psql -U postgres -d myapp -c “INSERT INTO users VALUES(1, ‘太郎’);”
# 4. データを確認
docker exec -it my-db psql -U postgres -d myapp -c “SELECT * FROM users;”
id | name
—-+——
1 | 太郎
(1 row)
# 5. コンテナを削除
docker stop my-db
docker rm my-db
# 6. 再度起動(同じボリュームを使用)
docker run -d –name my-db \
-v postgres-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
postgres
# 7. データがまだ残っているか確認
docker exec -it my-db psql -U postgres -d myapp -c “SELECT * FROM users;”
id | name
—-+——
1 | 太郎
(1 row)
✅ データが残っている!
コンテナを削除しても、ボリュームに保存されたデータは残ります。
同じボリュームを使って新しいコンテナを起動すれば、データにアクセスできます。
2-6. ボリュームの削除
# 特定のボリュームを削除
docker volume rm postgres-data
# 未使用のボリュームを全削除
docker volume prune
# 確認なしで削除
docker volume prune -f
⚠️ ボリューム削除の注意
ボリュームを削除すると、データは完全に失われます 。
削除前に必ずバックアップを取りましょう。
docker volume pruneは、どのコンテナにもマウントされていない
「未使用」のボリュームを全て削除するため、注意が必要です。
2-7. 匿名ボリューム
ボリューム名を指定しない場合、匿名ボリューム が自動的に作成されます。
# コンテナ内のパスだけ指定(ボリューム名なし)
docker run -d –name my-db \
-v /var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
# ボリューム一覧を確認(ランダムな名前が付く)
docker volume ls
DRIVER VOLUME NAME
local abc123def456789…
⚠️ 匿名ボリュームの注意点
匿名ボリュームは名前がランダムなため、管理が困難 です。
本番環境では、必ず名前付きボリューム を使用しましょう。
📁 3. バインドマウント(Bind Mount)
3-1. バインドマウントとは
バインドマウント は、ホストの特定のディレクトリを
コンテナ内のディレクトリに直接マウントする方法です。
📁 バインドマウントの特徴
ホストの任意のパス を指定できる
ホストから直接編集 すると、即座にコンテナに反映
開発時に非常に便利 (コード変更がリアルタイムで反映)
パスは絶対パス で指定(または./から始まる相対パス)
3-2. バインドマウントの書き方
【-v オプションの書き方】
# ボリュームの場合(名前だけ)
-v ボリューム名:コンテナ内パス
# バインドマウントの場合(パス指定)
-v /ホストのパス:コンテナ内パス
-v $(pwd)/ディレクトリ:コンテナ内パス ← カレントディレクトリ基準
【見分け方】
– /で始まる → バインドマウント
– ./で始まる → バインドマウント(相対パス)
– 名前だけ → ボリューム
3-3. バインドマウントの使用例
# htmlディレクトリを作成
mkdir html
echo ‘<h1>Hello from host!</h1>’ > html/index.html
# バインドマウントでNginxを起動
docker run -d –name my-nginx \
-v $(pwd)/html:/usr/share/nginx/html \
-p 8080:80 \
nginx
📝 コマンドの意味
$(pwd) :現在のディレクトリの絶対パスに展開される
$(pwd)/html :カレントディレクトリ内のhtmlフォルダ
/usr/share/nginx/html :Nginxのドキュメントルート
# ブラウザで確認
# http://localhost:8080
# → “Hello from host!” が表示される
# ホスト側でファイルを編集
echo ‘<h1>Updated content!</h1>’ > html/index.html
# ブラウザを更新(コンテナ再起動不要!)
# → “Updated content!” に変わる
✅ リアルタイム反映!
ホスト側でファイルを編集すると、即座にコンテナに反映 されます。
開発中はバインドマウントを使うことで、効率的に作業できます。
3-4. 読み取り専用マウント
設定ファイルなど、コンテナから変更されたくないファイルは読み取り専用 でマウントします。
# :ro を追加して読み取り専用に
docker run -d –name my-nginx \
-v $(pwd)/html:/usr/share/nginx/html:ro \
-p 8080:80 \
nginx
📝 コマンドの意味
:ro :read-only(読み取り専用)の略
コンテナ内からファイルを変更しようとするとエラーになる
# コンテナ内から編集を試みる
docker exec my-nginx sh -c “echo ‘hack’ > /usr/share/nginx/html/test.txt”
sh: can’t create /usr/share/nginx/html/test.txt: Read-only file system
3-5. Windows/Macでの注意点
⚠️ パスの書き方(OS別)
# Linux / Mac
docker run -v $(pwd)/html:/usr/share/nginx/html nginx
# Windows(PowerShell)
docker run -v ${PWD}/html:/usr/share/nginx/html nginx
# Windows(コマンドプロンプト)
docker run -v %cd%/html:/usr/share/nginx/html nginx
# Windows(絶対パス)
docker run -v C:/Users/yourname/html:/usr/share/nginx/html nginx
⚠️ ファイル監視の問題(Mac/Windows)
Mac/WindowsのDocker Desktopでは、ファイル変更の検知が
遅延したり、検知されない ことがあります。
対策:
ホットリロード機能を持つフレームワークを使う
polling方式のファイル監視を有効にする
Docker Desktopの設定でパフォーマンスを調整
⚙️ 4. –mountオプション
4-1. -v と –mount の違い
--mountオプションは、-vの代替として使える、
より明示的で読みやすい 書き方です。
項目
-v オプション
–mount オプション
書き方
コロン区切り-v source:target:options
キー=値形式--mount type=...,source=...,target=...
可読性
短いが意味が分かりにくい
長いが意味が明確
エラー検知
存在しないパスを自動作成
存在しないパスでエラー
推奨場面
コマンドライン、簡単な用途
スクリプト、本番環境
4-2. –mountの書き方
【–mount オプションの構文】
–mount type=タイプ,source=ソース,target=ターゲット[,readonly]
type :volume(ボリューム)、bind(バインドマウント)、tmpfs
source :ボリューム名またはホストパス(srcでも可)
target :コンテナ内のパス(dstまたはdestinationでも可)
readonly:読み取り専用にする場合に追加
4-3. ボリュームを–mountで指定
# -v での書き方
docker run -d –name my-db \
-v postgres-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
# –mount での書き方(同じ意味)
docker run -d –name my-db \
–mount type=volume,source=postgres-data,target=/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
4-4. バインドマウントを–mountで指定
# -v での書き方
docker run -d –name my-nginx \
-v $(pwd)/html:/usr/share/nginx/html:ro \
-p 8080:80 \
nginx
# –mount での書き方(同じ意味)
docker run -d –name my-nginx \
–mount type=bind,source=$(pwd)/html,target=/usr/share/nginx/html,readonly \
-p 8080:80 \
nginx
💡 –mount のメリット
--mountは存在しないパスを指定するとエラー になります。
-vは存在しないパスを自動作成 してしまうため、
タイプミスに気づきにくいことがあります。
本番環境やスクリプトでは、--mountの使用を検討しましょう。
⚖️ 5. ボリューム vs バインドマウント
5-1. 詳細比較
項目
ボリューム
バインドマウント
管理主体
Dockerが管理
ユーザーが管理
保存場所
Docker専用領域 (/var/lib/docker/volumes/)
ホストの任意のパス
-vの書き方
-v 名前:パス
-v /絶対パス:パス
ホストからのアクセス
直接アクセスしにくい
直接編集可能
バックアップ
docker volumeコマンドで簡単
通常のファイルコピー
パフォーマンス
高速(特にLinux)
OSによって差がある
主な用途
本番環境、データベース
開発環境、ソースコード共有
5-2. 使い分けの指針
📦 ボリュームを使う場面
本番環境 でのデータ永続化
データベースのデータ保存(PostgreSQL、MySQL、MongoDB)
複数のコンテナでデータを共有
バックアップをDockerコマンドで管理したい
ホストのファイルシステムに依存したくない
📁 バインドマウントを使う場面
開発環境 でのソースコード共有
設定ファイルを外部から管理したい
ホストから直接ファイルを編集したい
ログファイルをホストに出力したい
IDEやエディタでコードを編集しながら開発
5-3. 実際の使い分け例
# 本番環境:ボリュームでデータを永続化
docker run -d –name prod-db \
-v db-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secure_password \
postgres
# 開発環境:バインドマウントでソースコードを共有
docker run -d –name dev-app \
-v $(pwd)/src:/app/src \
-v $(pwd)/config:/app/config:ro \
-p 3000:3000 \
node:18
# 混合:データはボリューム、設定はバインドマウント
docker run -d –name mixed-app \
-v app-data:/data \
-v $(pwd)/config/app.conf:/etc/app/app.conf:ro \
my-application
🔄 6. バックアップとリストア
6-1. ボリュームのバックアップ
ボリュームのデータをtarファイルにバックアップする方法です。
# ボリュームをtarファイルにバックアップ
docker run –rm \
-v postgres-data:/data \
-v $(pwd):/backup \
ubuntu \
tar czf /backup/postgres-backup.tar.gz -C /data .
📝 コマンドの意味
--rm :コンテナ終了後に自動削除
-v postgres-data:/data :バックアップ対象のボリュームを/dataにマウント
-v $(pwd):/backup :バックアップファイルの出力先
ubuntu :tarコマンドを実行するためのコンテナ
tar czf :gzip圧縮でアーカイブ作成
-C /data . :/dataディレクトリの内容を圧縮
6-2. ボリュームのリストア
# 新しいボリュームを作成
docker volume create postgres-data-restored
# バックアップからリストア
docker run –rm \
-v postgres-data-restored:/data \
-v $(pwd):/backup \
ubuntu \
tar xzf /backup/postgres-backup.tar.gz -C /data
📝 コマンドの意味
tar xzf :gzip圧縮されたアーカイブを展開
-C /data :展開先ディレクトリ
6-3. バックアップスクリプトの例
# backup.sh – 定期バックアップスクリプト
#!/bin/bash
# 日時を取得
DATE=$(date +%Y%m%d_%H%M%S)
# バックアップディレクトリ
BACKUP_DIR=”./backups”
mkdir -p ${BACKUP_DIR}
# ボリュームをバックアップ
docker run –rm \
-v postgres-data:/data \
-v ${BACKUP_DIR}:/backup \
ubuntu \
tar czf /backup/postgres-${DATE}.tar.gz -C /data .
echo “Backup created: ${BACKUP_DIR}/postgres-${DATE}.tar.gz”
# 30日以上前のバックアップを削除
find ${BACKUP_DIR} -name “postgres-*.tar.gz” -mtime +30 -delete
echo “Old backups cleaned up.”
# スクリプトに実行権限を付与
chmod +x backup.sh
# 実行
./backup.sh
# cronで毎日午前2時に実行する場合
# crontab -e で以下を追加
# 0 2 * * * /path/to/backup.sh >> /var/log/backup.log 2>&1
💡 バックアップの重要性
本番環境では、定期的なバックアップが必須 です。
最低でも1日1回はバックアップを取り、複数世代を保持しましょう。
また、バックアップが正しくリストアできるか も定期的にテストしましょう。
💪 7. 練習問題
練習問題 1
基礎
ボリュームを作成して一覧を確認してください
「test-volume」という名前のボリュームを作成し、一覧と詳細を表示してください。
解答を見る
【解答】
# ボリュームを作成
docker volume create test-volume
# ボリューム一覧を表示
docker volume ls
# ボリュームの詳細を表示
docker volume inspect test-volume
# 後片付け
docker volume rm test-volume
練習問題 2
基礎
PostgreSQLのデータを永続化してください
タスク:
ボリューム「pg-data」を作成
ボリュームを使ってPostgreSQLを起動
テーブルを作成してデータを挿入
コンテナを削除して再起動
データが残っていることを確認
解答を見る
【解答】
# 1. ボリューム作成
docker volume create pg-data
# 2. PostgreSQL起動
docker run -d –name my-pg \
-v pg-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
# 3. データ挿入(少し待ってから実行)
sleep 5
docker exec my-pg psql -U postgres -c “CREATE DATABASE test;”
docker exec my-pg psql -U postgres -d test -c “CREATE TABLE users(id INT, name TEXT);”
docker exec my-pg psql -U postgres -d test -c “INSERT INTO users VALUES(1, ‘Alice’);”
# 確認
docker exec my-pg psql -U postgres -d test -c “SELECT * FROM users;”
# 4. コンテナ削除
docker stop my-pg
docker rm my-pg
# 5. 再起動してデータ確認
docker run -d –name my-pg \
-v pg-data:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
sleep 5
docker exec my-pg psql -U postgres -d test -c “SELECT * FROM users;”
# → Alice が表示される!
# 後片付け
docker stop my-pg
docker rm my-pg
docker volume rm pg-data
練習問題 3
基礎
バインドマウントでNginxのコンテンツを編集してください
htmlディレクトリを作成し、バインドマウントでNginxを起動して、ホストからファイルを編集してください。
解答を見る
【解答】
# ディレクトリとファイル作成
mkdir html
echo ‘<h1>Version 1</h1>’ > html/index.html
# Nginx起動
docker run -d –name web \
-v $(pwd)/html:/usr/share/nginx/html \
-p 8080:80 \
nginx
# ブラウザで http://localhost:8080 を確認
# → “Version 1” が表示
# ファイル編集
echo ‘<h1>Version 2</h1>’ > html/index.html
# ブラウザを更新(コンテナ再起動不要!)
# → “Version 2” に変わる
# 後片付け
docker stop web
docker rm web
rm -rf html
練習問題 4
応用
複数のコンテナで同じボリュームを共有してください
タスク:
共有ボリュームを作成
コンテナ1でファイルを作成
コンテナ2から同じファイルを読み取る
解答を見る
【解答】
# 1. ボリューム作成
docker volume create shared-data
# 2. コンテナ1でファイル作成
docker run –rm \
-v shared-data:/data \
ubuntu \
sh -c “echo ‘Hello from container 1’ > /data/message.txt”
# 3. コンテナ2から読み取り
docker run –rm \
-v shared-data:/data \
ubuntu \
cat /data/message.txt
# 出力:Hello from container 1
# 後片付け
docker volume rm shared-data
練習問題 5
応用
読み取り専用マウントを使ってください
設定ファイルを読み取り専用でマウントし、コンテナ内から編集できないことを確認してください。
解答を見る
【解答】
# ディレクトリと設定ファイル作成
mkdir config
echo ‘Important config’ > config/settings.txt
# 読み取り専用でマウント
docker run -d –name secure-app \
-v $(pwd)/config:/config:ro \
ubuntu \
sleep infinity
# コンテナ内から編集を試みる
docker exec secure-app sh -c “echo ‘hack’ >> /config/settings.txt”
# → エラー:Read-only file system
# 読み取りは可能
docker exec secure-app cat /config/settings.txt
# → Important config
# 後片付け
docker stop secure-app
docker rm secure-app
rm -rf config
練習問題 6
応用
–mountオプションでボリュームを指定してください
-vオプションの代わりに–mountオプションを使って、PostgreSQLコンテナを起動してください。
解答を見る
【解答】
# ボリューム作成
docker volume create mount-test
# –mount オプションで起動
docker run -d –name my-pg \
–mount type=volume,source=mount-test,target=/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres
# 確認
docker inspect my-pg –format='{{json .Mounts}}’ | jq
# 後片付け
docker stop my-pg
docker rm my-pg
docker volume rm mount-test
練習問題 7
発展
ボリュームをバックアップしてリストアしてください
タスク:
ボリュームを作成してデータを保存
tarファイルにバックアップ
元のボリュームを削除
新しいボリュームにリストア
データが復元されていることを確認
解答を見る
【解答】
# 1. ボリューム作成とデータ保存
docker volume create original-volume
docker run –rm -v original-volume:/data ubuntu \
sh -c “echo ‘Important data’ > /data/file.txt && echo ‘More data’ > /data/file2.txt”
# 確認
docker run –rm -v original-volume:/data ubuntu ls -la /data
# 2. バックアップ
docker run –rm \
-v original-volume:/data \
-v $(pwd):/backup \
ubuntu \
tar czf /backup/backup.tar.gz -C /data .
# バックアップファイル確認
ls -la backup.tar.gz
# 3. ボリューム削除
docker volume rm original-volume
# 4. 新ボリューム作成とリストア
docker volume create restored-volume
docker run –rm \
-v restored-volume:/data \
-v $(pwd):/backup \
ubuntu \
tar xzf /backup/backup.tar.gz -C /data
# 5. データ確認
docker run –rm -v restored-volume:/data ubuntu cat /data/file.txt
# 出力:Important data
# 後片付け
docker volume rm restored-volume
rm backup.tar.gz
練習問題 8
発展
開発環境と本番環境で適切なマウント方法を選択してください
シナリオ:
開発環境:Pythonアプリのソースコードをホストから編集したい
本番環境:MySQLのデータを永続化したい
それぞれに適切なマウント方法を選択してコンテナを起動してください。
解答を見る
【解答】
# === 開発環境:バインドマウント ===
# ソースコードディレクトリ作成
mkdir -p myapp
echo ‘print(“Hello from Python!”)’ > myapp/app.py
# バインドマウントで起動(ソースコードをリアルタイム共有)
docker run –rm \
-v $(pwd)/myapp:/app \
python:3.11 \
python /app/app.py
# 出力:Hello from Python!
# ホストでコード編集
echo ‘print(“Updated code!”)’ > myapp/app.py
# 再実行(変更が反映される)
docker run –rm \
-v $(pwd)/myapp:/app \
python:3.11 \
python /app/app.py
# 出力:Updated code!
# === 本番環境:ボリューム ===
# ボリューム作成
docker volume create mysql-data
# ボリュームを使ってMySQL起動
docker run -d –name prod-mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secure_password \
mysql:8
# データベース作成
sleep 15 # MySQLの起動を待つ
docker exec prod-mysql mysql -uroot -psecure_password \
-e “CREATE DATABASE production;”
# コンテナ削除後もデータが残る
docker stop prod-mysql
docker rm prod-mysql
# 再起動
docker run -d –name prod-mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secure_password \
mysql:8
sleep 15
docker exec prod-mysql mysql -uroot -psecure_password \
-e “SHOW DATABASES;”
# → production データベースが残っている
# 後片付け
rm -rf myapp
docker stop prod-mysql
docker rm prod-mysql
docker volume rm mysql-data
📝 STEP 10 のまとめ
✅ このステップで学んだこと
コンテナを削除してもデータを残す 方法
ボリューム :Dockerが管理する専用領域(本番向け)
バインドマウント :ホストのディレクトリを直接マウント(開発向け)
-v オプションと–mount オプションの書き方
読み取り専用マウント (:ro)でセキュリティ向上
ボリュームのバックアップとリストア
📊 今回学んだコマンド一覧
コマンド
機能
docker volume create 名前
ボリュームを作成
docker volume ls
ボリューム一覧を表示
docker volume inspect 名前
ボリュームの詳細を表示
docker volume rm 名前
ボリュームを削除
docker volume prune
未使用ボリュームを全削除
-v 名前:パス
ボリュームをマウント
-v /パス:パス
バインドマウント
:ro
読み取り専用でマウント
💡 重要ポイント
データの永続化は、本番環境で必須 の技術です。
データベースのデータは、必ずボリュームで保護 しましょう。
開発環境では、バインドマウント を使うことで
コードを編集しながら即座に反映でき、開発効率が劇的に向上 します。
本番環境では、定期的なバックアップ が命綱です。
自動バックアップの仕組みを必ず構築しましょう。
🎯 次のステップの予告
次のSTEP 11では、「Dockerfileの基本構文」 を学びます。
自分でDockerイメージを作成する方法
FROM、RUN、COPY、CMDなどの命令
docker buildコマンドの使い方
効率的なDockerfileの書き方
カスタムイメージの作成方法を習得しましょう!