アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Amazon ECR Public Gallery から Docker Official Images を利用する

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 社からそれぞれ次の発表がありました。

aws.amazon.com

www.docker.com

どちらも 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 のリストは次のページで確認できます。

gallery.ecr.aws

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 する場合にも制限に引っかかりにくくなっていくかもしれません。

参考

最後に

アクトインディではエンジニアを募集しています。

actindi.net


  1. Docker イメージのビルドや Rspec の実行で多用しています。RSpec を実行する際には MySQL や Redis などのイメージを Pull して利用しています。

  2. https://aws.amazon.com/jp/blogs/news/docker-official-images-now-available-on-amazon-elastic-container-registry-public/

  3. https://aws.amazon.com/jp/ecr/pricing/