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 では、 内部ループ(inner loop) の視点(コードを書き、構築し、実行し、テストする)と 外部ループ(outer loop) の視点(変更を push 、 CI で構築し、 CI でテストし、デプロイする)で、開発者がどのようにして働くかを考えました。

CI/CD の内部ループと外部ループ

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 上の セキュリティ ページから、新しい アクセス トークン(access token) を作成できます。

アクセストークンを作成し、プラットフォーム上のシークレットストアに追加したら、変更が発生した時に、いつ自分の 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

https://docs.docker.com/ci-cd/best-practices/