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

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

# 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](https://qiita.com/ynott/items/fd03b0341b443e617bd5)

# 1. dockerから使ってみる

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

```bash
$ 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する

```shell-session
$ docker login gitlab.example.jp
Username: tetsurou.yano
Password: XXXXXXXXXXXX
Login Succeeded
```

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/6a22526a-bf91-1722-9dad-d9968ff1f2a9.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ce90ea1f-4d02-a58f-bd93-c114be9f6c42.png)


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

```bash
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してみます。

```bash
 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/7136137a-7505-ddf6-6cc6-142eadd621ad.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