docker-composeによるコンテナ更新と再作成の挙動検証

カスタムイメージの作成

検証用に異なるドキュメントルートを持つ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  

タグ: Docker docker-compose nginx Container

7月22日 00:58 投稿