カスタムイメージの作成
検証用に異なるドキュメントルートを持つNginxイメージを2つ作成する。
docker run -itd --name temp_nginx nginx
docker exec -it temp_nginx bash
# コンテナ内
echo "version-1" > /usr/share/nginx/html/index.html
curl localhost
# version-1
exit
docker commit temp_nginx mynginx:v1
docker exec -it temp_nginx bash
# コンテナ内
echo "version-2" > /usr/share/nginx/html/index.html
curl localhost
# version-2
exit
docker commit temp_nginx mynginx:v2
docker rm -f temp_nginx
初期起動の確認
作成したイメージを使用して、2つのサービスを定義し起動する。
# docker-compose.yaml
services:
web_app:
image: mynginx:v2
ports:
- "8080:80"
api_app:
image: mynginx:v2
ports:
- "9090:80"
docker-compose up -d
# Container web_app Started
# Container api_app Started
curl localhost:8080
# version-2
curl localhost:9090
# version-2
イメージ変更時の挙動
一方のサービスのイメージタグを変更し、再起動時の挙動を確認する。
# docker-compose.yaml
services:
web_app:
image: mynginx:v1 # v2からv1へ変更
ports:
- "8080:80"
api_app:
image: mynginx:v2
ports:
- "9090:80"
docker restart web_app # dockerコマンドによる再起動ではイメージの変更は反映されない
curl localhost:8080
# version-2
docker-compose up -d
# Container web_app Started # 変更があったサービスは再作成される
# Container api_app Running # 変更がないサービスはそのまま
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
# NAMES IMAGE STATUS
# api_app mynginx:v2 Up 10 minutes
# web_app mynginx:v1 Up About a minute
設定変更時の挙動
ボリュームマウントやポートマッピングなどの設定を変更した場合の挙動を確認する。
# custom.conf
server {
listen 7777;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
# docker-compose.yaml
services:
web_app:
image: mynginx:v1
volumes:
- ./custom.conf:/etc/nginx/conf.d/custom.conf
ports:
- "8080:80"
- "7777:7777" # 追加
api_app:
image: mynginx:v2
ports:
- "9090:80"
docker-compose up -d
# Container api_app Running
# Container web_app Started # 設定変更により再作成される
docker exec -it web_app curl localhost:7777
# version-1
強制再作成の実行
変更の有無に関わらず、全コンテナを強制的に再作成するには--force-recreateオプションを使用する。
docker-compose up -d --force-recreate
# Container api_app Started
# Container web_app Started