Harborにコンテナイメージをpush/pullする

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

前回Rook-Cephを使ってHarborをデプロイしました。

https://qiita.com/ohtsuka-shota/items/55a85409558ee086b098

今回はこのHarborにコンテナイメージをpushしたり、pullしたりしてみたいと思います。

# 参考にしたサイト

https://zenn.dev/t_ume/articles/a8ff4b41286f05

# dockerコマンドのインストール
Harborにpush/pullするためにdockerコマンドが必要になるのでインストールしていきたいと思います。
※正確にはdockerコマンドをインストールせずともkuernetesで動いているコンテナランタイムのコマンドを使えばいいと思います。ただ、今回は使い慣れているコマンドを使いたかったのでインストールしてみました。

```
root@k8s-master:~# docker -v 
Command 'docker' not found, but can be installed with:
snap install docker         # version 20.10.24, or
apt  install docker.io      # version 20.10.21-0ubuntu1~22.04.3
apt  install podman-docker  # version 3.4.4+ds1-1ubuntu1.22.04.1
See 'snap info docker' for additional versions.
```

そのため、以下コマンドをコピペしてコマンドをインストールしました。
```
apt update
apt upgrade -y
apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

dockerコマンドがインストールされていることを確認します。versionが出力されたのでOKです。
```
root@k8s-master:~# docker -v
Docker version 24.0.4, build 3713ee1
```

dockerを起動します。
```
root@k8s-master:~# systemctl start docker
root@k8s-master:~# systemctl enable docker
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker
root@k8s-master:~# systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-07-09 02:00:31 UTC; 4s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 993911 (dockerd)
      Tasks: 17
     Memory: 26.2M
        CPU: 703ms
     CGroup: /system.slice/docker.service
             mq993911 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Jul 09 02:00:30 k8s-master systemd[1]: Starting Docker Application Container Engine...
Jul 09 02:00:30 k8s-master dockerd[993911]: time="2023-07-09T02:00:30.827408660Z" level=info msg="Starting up"
Jul 09 02:00:30 k8s-master dockerd[993911]: time="2023-07-09T02:00:30.829369823Z" level=info msg="detected 127.0.0.53 nameserver, assuming systemd-resolved, so using r>
Jul 09 02:00:31 k8s-master dockerd[993911]: time="2023-07-09T02:00:31.023471283Z" level=info msg="Loading containers: start."
Jul 09 02:00:31 k8s-master dockerd[993911]: time="2023-07-09T02:00:31.377941572Z" level=info msg="Loading containers: done."
Jul 09 02:00:31 k8s-master dockerd[993911]: time="2023-07-09T02:00:31.400456644Z" level=info msg="Docker daemon" commit=4ffc614 graphdriver=overlay2 version=24.0.4
Jul 09 02:00:31 k8s-master dockerd[993911]: time="2023-07-09T02:00:31.400704923Z" level=info msg="Daemon has completed initialization"
Jul 09 02:00:31 k8s-master dockerd[993911]: time="2023-07-09T02:00:31.466453443Z" level=info msg="API listen on /run/docker.sock"
Jul 09 02:00:31 k8s-master systemd[1]: Started Docker Application Container Engine.
```

# Docker Hubから検証用のdockerイメージをpullする
Docker Hubから検証用のイメージをpullします。今回はubuntu:latestをpullしました。
```
root@k8s-master:~# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
root@k8s-master:~# docker pull ubuntu:latest
latest: Pulling from library/ubuntu
3153aa388d02: Pull complete
Digest: sha256:0bced47fffa3361afa981854fcabcd4577cd43cebbb808cea2b1f33a3dd7f508
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
root@k8s-master:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    5a81c4b8502e   10 days ago   77.8MB
```

# HarborにProjectを作成する
HarborのWebUIにログインし、NEW PROJECTを押下します。
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5e96d642-62d9-40c5-f7aa-f7fa743f3e82.png)

今回はk8s-imagesというProjectを作成しました。Publicオプションを付けます。つけないと、pullするときにも認証が必要になります。Publicをつけていればpush時のみ認証が必要になるようです。
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1206563e-064c-5f06-6e69-f7c9f84dedb4.png)

作成できました。
![image (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/07eadd57-149d-d4ff-54a7-3b6b2e3633e9.png)

# dockerコマンドでHarborにログインするための証明書準備
以下のコマンドを実行します。証明書はharbor-nginxという名前のSecret上にありますので、それをbase64でデコードしてdockerとHarborに読み込ませているような処理だと思っています。
```
root@k8s-master:~/yaml/harbor# mkdir -p /usr/share/ca-certificates/harbor
root@k8s-master:~/yaml/harbor# kubectl get secrets -n harbor harbor-nginx -o jsonpath='{.data.ca\.crt}' | base64 -d > /usr/share/ca-certificates/harbor/harbor.crt
root@k8s-master:~/yaml/harbor# cat /usr/share/ca-certificates/harbor/harbor.crt
-----BEGIN CERTIFICATE-----
MIIDEzCCAfugAwIBAgIQXYj6XTtDZV6pP1KVd/6nvDANBgkqhkiG9w0BAQsFADAU
MRIwEAYDVQQDEwloYXJib3ItY2EwHhcNMjMwNzA5MDQ1MjA5WhcNMjQwNzA4MDQ1
MjA5WjAUMRIwEAYDVQQDEwloYXJib3ItY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQCmFplfRJUbXkHUgKcRCOAModVzpLHnQpvxi54mGgxgt2h+dFeh
VwFYLWwe53Lyu3IRqjGvvTU07QVK627W/cP1rTXgeN6W8dkN3vVWyMwR75CXwsn8
kQMVZxMwEh3Knh5Hc81snCGatzKOmPoFXMLXoq+bo5j2MM5BZXJQTZxGFRceXhSq
r1J05bLwfIjgNJURP+zEMMB/X/xb0ROJM9oIQhSQmRMBePM33b2lWI9mVN1vH+rw
fVrLUpp1sIkbp/S5ynRGjpjF7ScRBEXHjTL9ZOk1OBFI5QyB+jN26IDcgGVEHGny
+S0lvxVigYGCzGk3DGofPm3jx2SzyvKzjTxLAgMBAAGjYTBfMA4GA1UdDwEB/wQE
AwICpDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUw
AwEB/zAdBgNVHQ4EFgQUSiAwyZYykvbDD5ToAhsfoFS+BYwwDQYJKoZIhvcNAQEL
BQADggEBAHgaDDryqU4RRrpeZhOv8Vi6+A/MGqaNsSLaWSn8zFe31lCRI1a7vhxC
+jXRNRs6fBPyGNfrGKDqoVGlr7sTL3iRDrhWHBzb2rcIWt1r++AkluTwVa7rp4RO
848A1rh8lDZ10CN25gPZmGCk7AYYZGFo0ITZYf13FdyH+GqWlWovbWFVL3ZHfTjR
4yliGWKMN7GeQVySJ4i0rpT0oGnvZphZ/hNlvTuByIYm0XB3tpIhJEH96yku2K69
d+KI5llKjPk7eLUnf3KaK6iJnp0x1h2L8ZjSqHojzYs/SoKgexPUUswEKSajEalV
FCN+HZUp61bgZxWpECiFYOUEfXJnIi0=
-----END CERTIFICATE-----
root@k8s-master:~/yaml/harbor# echo harbor/harbor.crt >> /etc/ca-certificates.conf
root@k8s-master:~/yaml/harbor# update-ca-certificates
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
root@k8s-master:~/yaml/harbor# systemctl restart docker
```

# Harborにログインし、docker pushする

docker loginコマンドでHarborにログインします。
ここで指定するのはvalues.yamlで指定したexternalURLになります。ユーザ：パスはWebUIと同じで問題ありません。
```
root@k8s-master:~/yaml/harbor# docker login https://192.168.2.37:30003
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
```

pushしていきます。
```
root@k8s-master:~/yaml/harbor# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    5a81c4b8502e   10 days ago   77.8MB

root@k8s-master:~/yaml/harbor# docker tag ubuntu:latest 192.168.2.37:30003/k8s-images/ubuntu:1.0
root@k8s-master:~/yaml/harbor# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED       SIZE
192.168.2.37:30003/k8s-images/ubuntu   1.0       5a81c4b8502e   10 days ago   77.8MB
ubuntu                                 latest    5a81c4b8502e   10 days ago   77.8MB
root@k8s-master:~/yaml/harbor# docker push 192.168.2.37:30003/k8s-images/ubuntu:1.0
The push refers to repository [192.168.2.37:30003/k8s-images/ubuntu]
59c56aee1fb4: Pushed
1.0: digest: sha256:75399abc111a48bcabcfe40c8fa5d1d44fb99e078ab449338d08f06dad34127e size: 529
```

WebUIでアップロードされていることが確認できます。
![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c855a1d0-7019-7247-38ce-161927aafcab.png)

# docker pullする
Harborにアップロードしたものをローカルから削除して、再度Harborからダウンロードします。
```
root@k8s-master:~/yaml/harbor# docker rmi 192.168.2.37:30003/k8s-images/ubuntu:1.0
Untagged: 192.168.2.37:30003/k8s-images/ubuntu:1.0
Untagged: 192.168.2.37:30003/k8s-images/ubuntu@sha256:75399abc111a48bcabcfe40c8fa5d1d44fb99e078ab449338d08f06dad34127e
root@k8s-master:~/yaml/harbor# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    5a81c4b8502e   10 days ago   77.8MB
```

pull commandにある四角を押下します。
押下した結果が以下となりました。
```
docker pull 192.168.2.37:30003/k8s-images/ubuntu:1.0
```
![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/62d53ff0-ee05-58bd-3dfc-ed37cbf4a6da.png)

これを叩きます。
感覚としてはDocker Hubと同じように感じました。
```
root@k8s-master:~/yaml/harbor# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    5a81c4b8502e   10 days ago   77.8MB
root@k8s-master:~/yaml/harbor# docker pull 192.168.2.37:30003/k8s-images/ubuntu:1.0
1.0: Pulling from k8s-images/ubuntu
Digest: sha256:75399abc111a48bcabcfe40c8fa5d1d44fb99e078ab449338d08f06dad34127e
Status: Downloaded newer image for 192.168.2.37:30003/k8s-images/ubuntu:1.0
192.168.2.37:30003/k8s-images/ubuntu:1.0
root@k8s-master:~/yaml/harbor# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED       SIZE
ubuntu                                 latest    5a81c4b8502e   10 days ago   77.8MB
192.168.2.37:30003/k8s-images/ubuntu   1.0       5a81c4b8502e   10 days ago   77.8MB
```