Day 7: 第1週のまとめとスキルチェックテスト 📝
皆さん、こんにちは!30日集中講座、Day 7へようこそ。
あっという間に1週間が経ちました。この7日間で、皆さんはコンテナとDockerの基礎を学び、ローカル環境でマルチコンテナアプリケーションを構築するスキルを身につけました。これは、これからのクラウドネイティブ開発において非常に重要な第一歩です。
今日は、これまでの学びを振り返るための「スキルチェックテスト」に挑戦しましょう。
1. スキルチェックテスト
これから、4つの実践的な課題を出題します。テキストエディタとターミナルを開き、ぜひ挑戦してみてください。
課題1: コンテナとイメージの基本操作
-
alpine:latestイメージをDocker Hubから取得してください。 - 取得したイメージから、
ls -l /コマンドを実行するコンテナを起動してください。 - 起動したコンテナのIDを確認し、停止後、削除してください。
課題2: Dockerfile の作成
以下の要件を満たすDockerfileを、nginx-custom/ ディレクトリ内に作成してください。
- ベースイメージは
nginx:1.21-alpineを使用する。 - コンテナ内の
/usr/share/nginx/htmlに、"Hello Docker!"と書かれたindex.htmlファイルを配置する。 - ブラウザで正しく表示されるよう、HTMLの構造を含めること。
- .dockerignoreファイルを作成し、不要なファイルをビルドコンテキストから除外すること。
課題3: Docker Compose でのマルチコンテナ構築
以下の要件を満たすdocker-compose.ymlを作成し、起動してください。
-
webとdbの2つのサービスを定義する。 -
webサービスは、./nginx-customディレクトリのDockerfileを使ってイメージをビルドする。 -
webサービスは、ホストの8080ポートをコンテナの80ポートにマッピングする。 -
dbサービスは、公式のpostgres:13イメージを使用し、パスワードをDocker Secretsで安全に管理する。 -
dbサービスのデータを永続化するため、名前付きボリュームを定義してマウントする。
課題4: トラブルシューティング
以下のdocker-compose.ymlファイルを起動しようとしたところ、エラーが発生しました。エラーの原因を特定し、解決してください。
services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres:13
2. 解答と解説
課題1: 解答
docker pull alpine:latestdocker run alpine:latest ls -l /-
docker ps -aでコンテナIDを確認し、docker rm <CONTAINER_ID> -fで強制削除する。
課題2: 解答
nginx-custom/Dockerfile
FROM nginx:1.21-alpine
COPY index.html /usr/share/nginx/html
nginx-custom/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello Docker</title>
</head>
<body>
<h1>Hello Docker!</h1>
</body>
</html>
.dockerignore
.git/
node_modules/
*.log
.env
.dockerignoreファイルは、イメージをビルドする際にコンテナにコピーされないよう、不要なファイルを指定します。
課題3: 解答
docker-compose.yml
services:
web:
build: ./nginx-custom
ports:
- "8080:80"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80"]
interval: 30s
timeout: 10s
retries: 3
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
- POSTGRES_DB=myappdb
secrets:
- db_password
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
secrets:
db_password:
file: ./secrets/db_password.txt
volumes:
postgres_data:
解説: deployセクションでメモリ制限を設定することで、コンテナがホストのリソースを過剰に消費するのを防ぎます。
課題4: 解答
エラーの原因は主に2つ考えられます。
-
ポート競合:
portsに指定されたホスト側のポートが既に別のプロセスによって使用されているため、コンテナを起動できません。-
実際のエラーメッセージ例:
Error: failed to start container: port is already allocated
-
実際のエラーメッセージ例:
-
必須環境変数の不足: PostgreSQLの公式イメージは、パスワードが設定されていないと起動しません。
-
実際のエラーメッセージ例:
database is uninitialized and superuser password is not specified
-
実際のエラーメッセージ例:
解決策は以下の通りです。
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: postgres:13
ports:
- "5433:5432"
environment:
- POSTGRES_PASSWORD=mysecretpassword
- POSTGRES_DB=myappdb
ヒント: 既存のコンテナがポートを占有している場合、docker compose downで停止してから再起動するだけで解決することがほとんどです。
3. 実践的なデバッグスキルとセキュリティ
コンテナが動かない時に役立つコマンドと、より安全な環境変数の管理方法を覚えておきましょう。
-
コンテナ内へのアクセス: コンテナの内部を直接調査したい場合に便利です。
docker exec -it <container_name> /bin/sh -
コンテナの詳細情報確認: 実行中のコンテナの設定(マウントされたボリューム、ポート設定、環境変数など)を詳細に確認できます。
docker inspect <container_name> -
バージョン指定:
docker-compose.ymlファイルのversion指定は現在非推奨です。Docker Compose V2では自動で適切なバージョンが適用されます。
4. まとめ:第1週の振り返り
この1週間、Dockerの旅お疲れ様でした!これらの課題をスムーズに解けたなら、皆さんはDockerの基本的な操作を完全にマスターしたと言えるでしょう。
Dockerは、環境構築の課題を解決し、開発の生産性を飛躍的に向上させる強力なツールです。このスキルは、今後のキャリアを築く上で大きな武器になります。
明日からは、いよいよ第2週に突入し、これまで学んだDockerの知識を活かして、AWS上でのコンテナ運用に挑戦します。
次回の予告
Day 8: いざ、AWSへ!コンテナ開発のクラウド化
それでは、また明日お会いしましょう!