4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GitLabAdvent Calendar 2020

Day 12

オンプレGitLabで依存関係プロキシ(Dependency Proxy)を利用する(docker pull利用編)

Last updated at Posted at 2020-12-31

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

0. はじめに

GitLabのDependency Proxyの話です。
GitLab Premiumの機能でしたが、13.6(2020年11月)からCommunity EditionのCoreの無料版で使えるようになりました。
社内のオンプレGitLabに設定してみたという話になります。(GitLab.comでは2020年11月から利用可能になっています)

The Dependency Proxy is moving to open source | GitLab
https://about.gitlab.com/blog/2020/10/30/minor-breaking-change-dependency-proxy/

Using the Dependency Proxy to improve your pipelines | GitLab
https://about.gitlab.com/blog/2020/12/15/dependency-proxy-updates/

こちらは利用編でオンプレGitLabに導入する設定編はこちらです。

オンプレGitLabで依存関係プロキシ(Dependency Proxy)を設定してDockerHubのダウンロード制限を回避する(設定編) - Qiita

1. dockerから使ってみる

1-1. docker loginせずにRateLimitを確認する

$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4379    0  4379    0     0   6141      0 --:--:-- --:--:-- --:--:--  6133
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 100;w=21600

RateLimit-Remaining: 100;w=21600だから残り100ですね。

1-2. docker pullしてからRateLimit-Remaining:を見る

$ docker pull alpine:latest
latest: Pulling from library/alpine
801bfaa63ef2: Already exists
Digest: sha256:3c7497bf0c7af93428242d6176e8f7905f2201d8fc5861f45be7a346b5f23436
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4379    0  4379    0     0   6202      0 --:--:-- --:--:-- --:--:--  6202
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 99;w=21600

RateLimit-Remaining: 99;w=21600になっています。

1-3. Dependency Proxyを設定したGitLabにdocker loginする

$ docker login gitlab.example.jp
Username: tetsurou.yano
Password: XXXXXXXXXXXX
Login Succeeded

1-4. docker pullする前のDependency Proxy画面を確認

以下の通り、何もダウンロードされていません。

image.png

1-5. Dependency Proxy経由で docker pullしてみる

docker pullしてみます。ついでにtimeも測ってみましょう。

今回設定したGitLabのDependency ProxyのURLは以下の通りです。

https://gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers

このURLに取得したいDockerHubのイメージを追加します。
テストしてalpine:latestをpullしてみましょう。
URLは以下のようになります。

gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/apline:latest

docker pull する場合は以下のようになります。

docker pull gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/apline:latest

■実行結果(Docker Ver.20.10.0)

$ docker pull gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
latest: Pulling from dependencyproxytestgroup/dependency_proxy/containers/alpine
ba3557a56b15: Already exists
Digest: sha256:4661fb57f7890b9145907a1fe2555091d333ff3d28db86c3bb906f6a2be93c87
Status: Downloaded newer image for gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest

GitLab 13.10からDocker 20系にも対応しました。

image.png

■下記のエラーはGitLab 13.9までです。

docker pull gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
Error response from daemon: received unexpected HTTP status: 500 Internal Server Error

あら?エラーですね。。。
調べてみるとDocker 20系にはまだ対応してないのだそうで。

Support "pull-by-digest" in the Dependency Proxy (#290944) · 課題 · GitLab.org / GitLab · GitLab
https://gitlab.com/gitlab-org/gitlab/-/issues/290944

■再度実行結果(Docker Ver.19.03.6)

気を取り直して、バージョン19系のdockerからdocker pullしてみます。

 time docker pull gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
latest: Pulling from dependencyproxytestgroup/dependency_proxy/containers/alpine
801bfaa63ef2: Pull complete
Digest: sha256:77593302d30498d9b13d69c2fa68d22fd0e8223a19b51846cbf9c11644958adb
Status: Downloaded newer image for gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest

real	0m4.238s
user	0m0.027s
sys	0m0.015s
$ docker images
REPOSITORY                                                                        TAG                                               IMAGE ID            CREATED             SIZE
gitlab.example.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine   latest                                            389fef711851        2 weeks ago         5.58MB

上手くいきました。

1-6. Dependency Proxy画面を確認する

image.png

イメージが1つ増えました。

1-7. 再度、docker pullしてみる

一旦ローカルのイメージを削除して再度pullしてみます。

$ time docker pull gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
latest: Pulling from dependencyproxytestgroup/dependency_proxy/containers/alpine
801bfaa63ef2: Pull complete
Digest: sha256:77593302d30498d9b13d69c2fa68d22fd0e8223a19b51846cbf9c11644958adb
Status: Downloaded newer image for gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest
gitlab.example.co.jp/dependencyproxytestgroup/dependency_proxy/containers/alpine:latest

real	0m3.255s
user	0m0.013s
sys	0m0.030s

先ほどは、4.2秒だったので1秒ほど早くなりました。
大きなDockerイメージだともっと顕著に差が出るはずです。

1-8. RateLimit-Remaining:を再度確認する

$ TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4378    0  4378    0     0   6063      0 --:--:-- --:--:-- --:--:--  6055
RateLimit-Limit: 100;w=21600
RateLimit-Remaining: 99;w=21600

2. まとめ

長くなったので、docker pull利用編はここで終了します。
GitLab CI/CD利用編は別途書きたいと思います。

追記: GitLab CI/CDのパイプライン編を書きました

GitLab CI/CDのパイプラインでDependency Proxyを利用する - Qiita
https://qiita.com/ynott/items/9407abd6fec369ad7a55

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?