morishitaです。
サーバーサイドの開発では Docker コンテナを利用することが一般的になりました。
本番環境はもちろん、開発環境も Docker Compose などコンテナで構築することが多いのではないでしょうか。
その際、Ruby や Node.js といったプログラミング言語や MySQL や Redis などのミドルウェアは Dockerhub で提供されている Docker Official Imagesをそのまま利用したり、自前のイメージをビルドする際のベースに使うことが多いと思います。
一方、2020 年 11 月から Dockerhub からイメージを Pull する際に回数に制限がかかるようになりました。
ログインしない状態だと IP アドレスあたり 6 時間で 100 回までとなっています。
便利で利用頻度も高い Docker Official Images を Pull する場合にもその制限の範囲内でしか Pull できません。
個人だとそんな回数 Pull しないだろうし厳しい制限ではないかもしれないですが、AWS などのパブリッククラウドでは他のユーザと共有している IP アドレスからイメージを Pull する可能性があり、意外と制限に引っかかったりします。
例えば、AWS CodeBuild で Docker イメージを Pull するような処理をしていると、まれに制限に引っかかったります1。
Amazon ECR Public Gallery から Docker Official Images が Pull 可能に!
2021 年 11 月の re:Invent で AWS と Docker 社からそれぞれ次の発表がありました。
どちらも Dockerhub 上で提供されてきた Docker Official Images が Amazon ECR Public からも Pull できますよという内容です。
AWS によると「Amazon ECR Public から任意の AWS リージョンにイメージをプルするお客様は、事実上無制限にダウンロードできます」2とのことです。
もともと Amazon ECR Public は「任意の AWS リージョンの AWS コンピューティングリソースにデータを転送する際には、コスト無しで無制限の帯域幅を得ることができます」3という無料枠がありました。この枠内で Docker Official Images を Pull できるということのようです。
ただし、AWS リージョン以外から AWS アカウントへのログインなしにイメージを Pull する際には 500GB/月、ログインしても 5TB/月に制限されますのでご注意を。
ECR Public での Docker Official Images のリストは次のページで確認できます。
Ruby、PHP、Python、Node といったプログラミング言語、MySQLや PostgreSQL、Tomcat といったミドルウェアから Wordpress や Drupal といった CMSアプリケーションまで色々ありますね。
まあ、もともと Docker Official Images として存在していたものなのんですが。
Amazon ECR Public Gallery からイメージを Pull してみる
弊社開発でよく使う Ruby で試してみました。
Dockerhub、ECR Public それぞれの Web ページの URL は次の通りです。
まずは Dockerhub から Pull してみます。
❯ docker pull ruby:3.1.0 3.1.0: Pulling from library/ruby 94a23d3cb5be: Pull complete ac9d381bd1e9: Pull complete aa9c5b49b9db: Pull complete 841dd868500b: Pull complete d4bb9078a4a2: Pull complete a0c2758411b7: Pull complete 0e64e6848085: Pull complete 1b8402df0f54: Pull complete Digest: sha256:e806e97b4a00c6b00f8baf36331f8798ab2d60b7d49f43a79577f7e7e3ab2623 Status: Downloaded newer image for ruby:3.1.0 docker.io/library/ruby:3.1.0
続いて ECR Public から Pull してみます。
Dockerhub でのイメージにの前に public.ecr.aws/docker/library/
をつければ ECR Public でのイメージ名になるようです。
❯ docker pull public.ecr.aws/docker/library/ruby:3.1.0 3.1.0: Pulling from docker/library/ruby Digest: sha256:e806e97b4a00c6b00f8baf36331f8798ab2d60b7d49f43a79577f7e7e3ab2623 Status: Downloaded newer image for public.ecr.aws/docker/library/ruby:3.1.0 public.ecr.aws/docker/library/ruby:3.1.0
表示される Digest の値が同じなので同じイメージだとわかります。
そもそも改めてダウンロードもされてないですね。
もう少しわかりやすく確認してみましょう。
❯ docker images --digests |grep ruby ruby 3.1.0 sha256:e806e97b4a00c6b00f8baf36331f8798ab2d60b7d49f43a79577f7e7e3ab2623 802a366aecf3 11 days ago 839MB public.ecr.aws/docker/library/ruby 3.1.0 sha256:e806e97b4a00c6b00f8baf36331f8798ab2d60b7d49f43a79577f7e7e3ab2623 802a366aecf3 11 days ago 839MB
同じですね。全く同じイメージが取得できることが確認できました。
Node.js や MySQL でも試してみましたが、いずれも同じ Digest の同じイメージが Pull できました。
まあ、当たり前といえば当たり前なのですが。
気づいた点
2022 年 1 月時点でDockerhub の Docker Official Images を見ると 172 種類のイメージが公開されているようです。
しかし、ECR の Docker の Publisher ページ には 139 種類しかないようです。
今後、差がなくなっていくのかもしれないですが、現時点ではすべての Docker Official Images が ECR Public からも Pull できるというわけではないようです。
また、古いイメージも ECR Public からは Pull できないようです。
Ruby、Node.js、MySQL のそれぞれのレジストリから Pull できる最も古いバージョンは次の通りです。
プロダクト | Dockerhub | ECR Public |
---|---|---|
Ruby | ruby:2.0.0-p647 | public.ecr.aws/docker/library/ruby:2.5.9 |
Node.js | node:4.2.1 | public.ecr.aws/docker/library/node:10.23-slim |
MySQL | mysql:5.5.49 | public.ecr.aws/docker/library/mysql:5.6.50 |
これらよりメジャーバージョン、マイナーバージョンが新しいものでも古いパッチバージョンが ECR Public にはなかったりします。
そのような古いバージョンはアップデートすべきとは思うのですが、やむを得ず使っているという場合もあるかと思います。
どうしても古いバージョンが必要な場合には ECR Public にないかもしれないということに注意が必要です。
まとめ
Docker Official Images を Amazon Elastic Container Registry Public から Pull できるようになりました。
ECR Public を利用することで AWS リージョンから Docker Official Images を Pull する場合には制限がなくなります。
AWS と Docker 社が公式に協力しているので安心して利用できそうです。
また、ECR Public の利用が広がれば Dockerhub からイメージを Pull する総回数も減るでしょう。
そうすれば Codebuild などで Docker Official Images 以外のイメージを Dockerhub から Pull する場合にも制限に引っかかりにくくなっていくかもしれません。
参考
- Docker Official Images | Docker Documentation
- docker-library/official-images: Primary source of truth for the Docker "Official Images" program
- Amazon ECR Public Gallery
最後に
アクトインディではエンジニアを募集しています。
-
Docker イメージのビルドや Rspec の実行で多用しています。RSpec を実行する際には MySQL や Redis などのイメージを Pull して利用しています。↩
-
https://aws.amazon.com/jp/blogs/news/docker-official-images-now-available-on-amazon-elastic-container-registry-public/↩