このシナリオを想像してみてください。 Dockerコンテナで実行されているいくつかのWebサービスをホストします。 Webサービスに新しいバージョンのリリースがある場合は、Dockerイメージをフェッチし、コンテナーを更新してサービスを更新します。
ダウンタイムなしでDockerコンテナーを更新することについては前に説明しましたが、この記事はWebアプリのアップグレードに関するものではありません。これは、オペレーティングシステムコンテナ自体の更新に関するものです。
コンテナで実行されているOSを手動でアップグレードすることは、困難な作業になることがあります。これを実現するには、実行中のコンテナで関連するアップグレードコマンドを個別に実行する必要があります。
この余分な手順を削除し、OSの更新とサービスの更新を組み合わせてみませんか?
これは、DockerComposeでデプロイされたWebサービスを更新するときに使用する自動化のトリックです。
この展開に基づく実際の例として、GhostCMSを使用します。
DigitalOcean –開発者クラウド何百万もの開発者があらゆるサイズのアプリケーションを簡単に構築、テスト、管理、スケーリングできるように支援します–これまでになく高速に。DigitalOceanlogoRoxanaCiobanu、CTOWebサービスの更新中にOSコンテナを自動的にアップグレードする
この記事を読んで、私が何をしているのかを理解することができます。しかし、それをフォローしたい場合は、それも可能です。
2つの異なる例を示します:
- DebianベースのDockerコンテナの場合
- アルパインベースのDockerコンテナの場合
この手順では、次の2つの手順を実行する必要があります。
ステップ1:CMD命令に注意してください
WebAppDockerfile内で最終的に指定されたCMD命令をメモします。
これを行うには、イメージが構築されたDockerfile(この例ではGhost)を確認する必要があります:
したがって、ここでの実際のコマンドはnode current/index.js
です。 。
ステップ2:「自動アップグレード」設定を追加する
DockerComposeファイルのGhostサービスセクション内にアップグレードコマンドと注記されたCMD命令を追加します。
command: sh -c "apt update && apt -y upgrade && node current/index.js"
それが最終的にどのようになるか見てみましょう。たとえば、上記のガイドのGhostサービスのDockerComposeエントリを検討するとします。チュートリアルに基づく更新バージョンは次のようになります:
ghost:
image: ghost:4.20.4
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
command: sh -c "apt update && apt -y upgrade && node current/index.js"
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
ここでは、volumes
の直後にコマンドを指定しました セクション。
この手順でも、2つの同様の手順を実行する必要があります。
ステップ1:CMD命令に注意してください
WebAppDockerfile内で最終的に指定されたCMD命令をメモします。
これを行うには、Dockerfile(この例ではGhost Alpine)を確認する必要があります:
明らかに、ここでのコマンドは以前のDebianバージョンで見られたものと同じです:node current/index.js
。
ステップ2:「自動アップグレード」設定を追加する
DockerComposeファイルのGhostサービスセクション内にアップグレードコマンドと注記されたCMD命令を追加します。
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
アルパインアップグレードリファレンス。
最終的にどのようになるか見てみましょう(今回はGhostに高山の画像を使用することに注意してください)。たとえば、上記のガイドのGhostサービスのDockerComposeエントリを検討するとします。チュートリアルに基づく更新バージョンは次のようになります:
ghost:
image: ghost:4.20.4-alpine
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
それでおしまいです。この時点から、ダウンタイムなしでWebAppを更新するたびに、コンテナーのアップグレードコマンドが自動的に呼び出され、Webアプリが実行されます。
注:docker composeファイルのイメージのバージョン番号を変更してアプリを更新する場合は、ここでハッシュタグを使用して説明しているコマンドオプションを一時的に無効にする必要があります。 Webアプリの更新が完了したら、同じ行を再度有効にして、コンテナー自体を更新します。これらの手順(アプリとコンテナーの更新)はどちらも、スケーリングによるダウンタイムなしで実現できます。
NextcloudやRocket.Chatなどの他の人気のあるアプリのコマンドのリストは次のとおりです。これらは、Ghostの例で見たのと同じように追加されることを忘れないでください。
Debianの場合:
command: sh -c "apt update && apt -y upgrade && apache2-foreground"
アルパインの場合:
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && apache2-foreground"
Rocket.Chat
command: sh -c "apt update && apt -y upgrade && node main.js"
この記事が日常のシステム管理者の活動に役立つことを願っています。ご質問、ご意見、ご提案がございましたら、下のコメント欄にご意見をお寄せください。