CI/CD のために Docker Hub を使うベストプラクティス¶
2020 Jetbrains 開発者調査 によると、現在、開発者の 44% が継続的インテグレーションと開発に Docker コンテナを使っています。これは、ワークフローの一部であるコンテナ レジストリとして、 Docker Hub を多くの開発者らが利用しているものと理解しています。このガイドで扱うのは、ワークフローのいくつかのベストプラクティスと、始め方の手引きです。
また、私たちは Docker が導入したネットワーク :ruby:`出力帯域 <egress> と free ユーザに対する取得数の変更 <https://www.docker.com/blog/scaling-docker-to-serve-millions-more-developers-network-egress/>`_ に関連するフィードバックも耳にしています。ここでは、これらの制限にあたることなく、 CI/CD ワークフローの一部として Docker Hub を使うベストな方法に関連する疑問も扱います。このガイドでは扱うベストプラクティスには、それら制限にあたる危険性を回避しながら、Docker Hub の体験や合理的な使い方の改善についてや、各々の利用例によっては制限の増やし方に関する助言も含みます。
内部と外部のループ¶
始めるにあたり、CI でテストが必要な場合や、CI をローカルでする場合に、Docker とあらゆる CI/CD とが、どのようにして動作するかの理解が最も重要です。Docker では、
CI/CD の最適化を考える前に、自分の内部ループと、それが外部ループとの関係(CI そのもの)について考えるのは重要です。大部分のユーザは「CI を通したデバッグ」を好まないと私たちは知っています。つまり、内部ループと外部ループを可能な限り似せるのが、より良いです。私たちは、ユニットテストを docker build
コマンドの一部として行うよう、それらの対象を Dockerfile 内にいれるのを推奨します。この方法によって、ローカルで変更や再構築ができるのと同様に、シンプルなコマンドを使って、ローカルマシン上の CI 内で同じユニットテストを実行できるでしょう。
ブログ投稿 Go development with Docker には、Docker プロジェクト内でテストを利用し、それらを CI で再利用するための素晴らしい例があります。また、イシュー(issue)に基づく短いフィードバックループも作成しており、CI が必要とする pull と構築の量を減らしています。
CI/CD デプロイの最適化¶
いったん、実際の外部ループと Docker Hub に入れば、CI を最大限活用して、より速い Docker 体験をもたらすためにできることがいくつかあります。
第一かつ最も重要なのは、安全の維持です。CI をセットアップする時は、パスワードではなく、 Docker Hub のアクセストークンを確実に使ってください。
注釈
Docker Hub 上の セキュリティ ページから、新しい
アクセストークンを作成し、プラットフォーム上のシークレットストアに追加したら、変更が発生した時に、いつ自分の CI/CD に push や pull するか、どこから行うかの検討が必要です。
第一にできるのは、構築回数を減らし、呼び出す回数の現象であり、そのために 構築キャッシュ(build cache) を使って既に取得済みのレイヤーを再利用します。buildX(buildkits)のキャッシュ機能を使えば、多くのプラットフォームでこれが行えるようになり、どこでもプラットフォームが提供するものをキャッシュできます。例として、 構築キャッシュを使った GitHub Actions ワークフローの最適化 をご覧ください。
他の変更としては、 Docker Hub に持っていくのはリリースイメージのみにします。つまり、 PullRequest で push したイメージをローカルに保存し、より速く pull してテストする機能をセットアップするのを意味するものであり、すべてを本番環境に持っていくわけではありません。
次のステップ¶
CI で Docker を使うにあたり、多くの助言やコツがあるのを知りました。しかしながら、ある種の重要な項目である Docker Hub のレート制限(rate limits) を検討します。
注釈
認証後に、 pull 制限の問題を既に経験している場合は、 Docker サブスクリプション へのアップグレードをご検討ください。
GitHub Actions CI/CD パイプラインの設定方法に関する情報は、 GitHub Actions の設定 をご覧ください。
参考
- Best practices for using Docker Hub for CI/CD