Ubuntu16.04LTS上でHarborを使ってちょっぴりSecureなPrivate Docker Registryを構築する

#1. What's Harbor
![harbor_logo.png](https://qiita-image-store.s3.amazonaws.com/0/170124/7201f6b7-bf45-ab6f-3580-5b434dff25c3.png)

VMwareによって提供されているオープンソースのPrivate Docker Registyです。
各々の機能を持ったコンテナを複数組み合わせる事で、コンテナイメージの登録だけではなく様々な機能を実現しています。公式サイトでは以下の機能を特徴に挙げています。

1. ロールベースのアクセス制御
2. ポリシーベースのイメージレプリケーション
3. LDAP/ADのサポート
4. イメージの削除とガベージコレクション
5. グラフィカルなユーザポータル(WebUI)
6. リポジトリへの操作記録
7. RESTful APIの提供
8. 簡単デプロイ

Dockerによって提供されている既存のregistryコンテナ(Private Docker Registryを構築出来る)では、コンテナイメージの登録/利用/削除などの基本的な操作しか出来ない一方で、Harborでは様々な事が出来るようになっています。
例えば、複数ユーザやプロジェクトから共同で利用する場合には、"ロールベースのアクセス制御"によって、各ユーザやプロジェクトに閉じたコンテナイメージのリポジトリを提供する事が出来ます。つまり、他ユーザやプロジェクト毎に公開するコンテナイメージを制御できます。また、"ポリシーベースのイメージレプリケーション"では、サーバを跨いだ複数のレジストリインスタンスにイメージを複製する事によって、Load BalancingやHigh Availabilityを実現する事が出来ます。
"LDAP/ADのサポート"も既存環境のユーザを再利用できる点で魅力的な機能の一つですし、何よりもWebUIがあるというのは便利ですね。"リポジトリへの操作記録"では、WebUI上から誰が何をしたかが分かるので責任範囲を明確にしたり、アカン人を明るみに出す事が出来ます（恐ろしい）

という事でHarborを使ってSecure Private Docker Registryを構築してみます。
※ 今回は最低限の設定ファイルの修正で構築しているので、実環境では色々なパラメータを修正する必要があります。
　特に今回はオレオレ証明書を使用しているので、よりセキュアな環境で構築する必要があれば、SymantecSSL (https://www.symantec.com/ja/jp/page.jsp?id=always-on-ssl) や CyberTrust (https://www.cybertrust.ne.jp) 等のセキュリティサービス事業者から証明書を購入するのが良いかと思われます。

##2. Pre-requirement
- Ubuntu 16.04 LTSを使用しました (Vagrantで構築)

```bash:UbuntuInfo
# Check Version
ubuntu@ubuntu-xenial:~$ uname -a
Linux ubuntu-xenial 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

ubuntu@ubuntu-xenial:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

# Check Network Interface
ubuntu@ubuntu-xenial:~$ ifconfig
enp0s3    Link encap:Ethernet  HWaddr 02:e4:5b:1a:6e:ce  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::e4:5bff:fe1a:6ece/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:60091 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29134 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:46640854 (46.6 MB)  TX bytes:1876488 (1.8 MB)

enp0s8    Link encap:Ethernet  HWaddr 08:00:27:32:8e:64  
          inet addr:192.168.33.10  Bcast:192.168.33.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe32:8e64/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:328 (328.0 B)  TX bytes:866 (866.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```

- Harborを動作させる上で必要なソフトウェアをインストールします

```bash:Pre-requirement
# Install Python2.x
ubuntu@ubuntu-xenial:~$ sudo apt-get update
ubuntu@ubuntu-xenial:~$ sudo apt-get install -y python

# Check Python Version
ubuntu@ubuntu-xenial:~$ python --version
Python 2.7.12

# Install Docker
ubuntu@ubuntu-xenial:~$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
ubuntu@ubuntu-xenial:~$ sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'
ubuntu@ubuntu-xenial:~$ sudo apt-get update
ubuntu@ubuntu-xenial:~$ sudo apt-get install -y docker-engine

# Check Docker Version
ubuntu@ubuntu-xenial:~$ sudo docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Feb 23 11:02:43 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   60ccb22
 Built:        Thu Feb 23 11:02:43 2017
 OS/Arch:      linux/amd64
 Experimental: false

# Install Docker Compose
ubuntu@ubuntu-xenial:~$ sudo curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
ubuntu@ubuntu-xenial:~$ sudo chmod +x /usr/local/bin/docker-compose

# Check Docker Compose Version
ubuntu@ubuntu-xenial:~$ docker-compose --version
docker-compose version 1.11.2, build dfed245
```

- 今回は証明書のサブジェクト名をIPアドレスで指定するのでその為の設定を追加します

```bash:/etc/ssl/openssl.cnf
# /etc/ssl/openssl.cnf内の[v3_ca]セクションに下記を追加
ubuntu@ubuntu-xenial:~$ sudo vim /etc/ssl/openssl.cnf 
[ v3_ca ]
subjectAltName=IP:192.168.33.10
```

##3. Install Harbor
- Harborの公式サイトから最新のインストーラをダウンロードします

```bash:Download_Installer
ubuntu@ubuntu-xenial:~$ wget https://github.com/vmware/harbor/releases/download/0.5.0/harbor-online-installer-0.5.0.tgz

ubuntu@ubuntu-xenial:~$ tar zxvf harbor-online-installer-0.5.0.tgz 
harbor/
harbor/install.sh
harbor/LICENSE
harbor/NOTICE
harbor/docker-compose.yml
harbor/common/
harbor/common/templates/
harbor/common/templates/ui/
harbor/common/templates/ui/private_key.pem
harbor/common/templates/ui/env
harbor/common/templates/ui/app.conf
harbor/common/templates/nginx/
harbor/common/templates/nginx/nginx.https.conf
harbor/common/templates/nginx/nginx.http.conf
harbor/common/templates/db/
harbor/common/templates/db/env
harbor/common/templates/jobservice/
harbor/common/templates/jobservice/env
harbor/common/templates/jobservice/app.conf
harbor/common/templates/registry/
harbor/common/templates/registry/root.crt
harbor/common/templates/registry/config.yml
harbor/prepare
harbor/harbor.cfg
```

- オレオレ証明書を作成します

```bash:Create_Certificate

# Create Directory for Certificate and Change Directory
ubuntu@ubuntu-xenial:~$ mkdir cert
ubuntu@ubuntu-xenial:~$ cd cert

# Create Certificate（証明書と鍵の名前は適宜変更）
# Input Common Name only at this time
ubuntu@ubuntu-xenial:~/cert$ openssl req -sha256 -x509 -days 365 -nodes -newkey rsa:4096 -keyout 192.168.33.10.key -out 192.168.33.10.crt
Generating a 4096 bit RSA private key
....................................................................++
.............................................................................................................................++
writing new private key to '192.168.33.10.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:192.168.33.10
Email Address []:
```

- Harborの設定ファイルを修正します

```bash:Modify_Config
# Change Directory and Modify harbor.cfg
ubuntu@ubuntu-xenial:~$ cd harbor
ubuntu@ubuntu-xenial:~/harbor$ vim harbor.cfg
< hostname = reg.mydomain.com
> hostname = 192.168.33.10

< ui_url_protocol = http
> ui_url_protocol = https

< ssl_cert = /data/cert/server.crt
> ssl_cert = /home/ubuntu/cert/192.168.33.10.crt

< ssl_cert_key = /data/cert/server.key
> ssl_cert_key = /home/ubuntu/cert/192.168.33.10.key
```

- Harbor本体をインストールします

```bash:Install_Harbor
# 正常にインストールが完了すれば最後に
# Harbor has been installed and started successfullyと表示されます
# また、現在ではインストール完了と同時にHarbor用のコンテナ群が起動されるようです

ubuntu@ubuntu-xenial:~/harbor$ sudo ./install.sh 

[Step 0]: checking installation environment ...

Note: docker version: 17.03.0

Note: docker-compose version: 1.11.2


[Step 1]: preparing environment ...
generated and saved secret key
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/ui/env
Generated configuration file: ./common/config/ui/app.conf
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/jobservice/app.conf
Generated configuration file: ./common/config/ui/private_key.pem
Generated configuration file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.


[Step 2]: checking existing instance of Harbor ...


[Step 3]: starting Harbor ...
Creating network "harbor_default" with the default driver
Pulling log (vmware/harbor-log:0.5.0)...
0.5.0: Pulling from vmware/harbor-log
93b3dcee11d6: Pull complete
5c14e4bdfb0b: Pull complete
e4dee8a574ca: Pull complete
64897311fadc: Pull complete
9b18f82d0181: Pull complete
Digest: sha256:81db268fa32ed35274f88f0e9f6e8c8fe36fdfe3247a7c75cef3d526814755ad
Status: Downloaded newer image for vmware/harbor-log:0.5.0
Pulling ui (vmware/harbor-ui:0.5.0)...
0.5.0: Pulling from vmware/harbor-ui
93b3dcee11d6: Already exists
a91de92f52f5: Pull complete
341612b46e3b: Pull complete
c1a53f812656: Pull complete
9a9aa413559a: Pull complete
e1b377650dfc: Pull complete
be5517028022: Pull complete
726f4e0b4799: Pull complete
08639f4ec97a: Pull complete
Digest: sha256:677776af19c774f665565486ef0ec3ab37e55c6738a471942e3ea841b3e1821c
Status: Downloaded newer image for vmware/harbor-ui:0.5.0
Pulling mysql (vmware/harbor-db:0.5.0)...
0.5.0: Pulling from vmware/harbor-db
43c265008fae: Pull complete
d7abd54d3b34: Pull complete
92b527830a1b: Pull complete
44839710d611: Pull complete
3828a16bed5c: Pull complete
fb91763f6b4e: Pull complete
892bfb27c685: Pull complete
02874ec7a2dc: Pull complete
861c1296cc0d: Pull complete
d611998d5598: Pull complete
09037dc5a941: Pull complete
448973dd2180: Pull complete
c0a51ede01de: Pull complete
54c4b53ba168: Pull complete
Digest: sha256:4bc45566b8aab9288e76ac8a36e604aecf05ba9b25e22f5a9cd5e9686978b78b
Status: Downloaded newer image for vmware/harbor-db:0.5.0
Pulling jobservice (vmware/harbor-jobservice:0.5.0)...
0.5.0: Pulling from vmware/harbor-jobservice
93b3dcee11d6: Already exists
a91de92f52f5: Already exists
cdeb4de41efe: Pull complete
ce3594a70659: Pull complete
Digest: sha256:9c2d927f6e59fafcc930a5f738d713bde7d101cecd4e110a570a7b499d69ff68
Status: Downloaded newer image for vmware/harbor-jobservice:0.5.0
Pulling registry (library/registry:2.5.0)...
2.5.0: Pulling from library/registry
e110a4a17941: Pull complete
2ee5ed28ffa7: Pull complete
d1562c23a8aa: Pull complete
06ba8e23299f: Pull complete
802d2a9c64e8: Pull complete
Digest: sha256:1b68f0d54837c356e353efb04472bc0c9a60ae1c8178c9ce076b01d2930bcc5d
Status: Downloaded newer image for registry:2.5.0
Pulling proxy (nginx:1.11.5)...
1.11.5: Pulling from library/nginx
386a066cd84a: Pull complete
7bdb4b002d7f: Pull complete
49b006ddea70: Pull complete
Digest: sha256:9038d5645fa5fcca445d12e1b8979c87f46ca42cfb17beb1e5e093785991a639
Status: Downloaded newer image for nginx:1.11.5
Creating harbor-log
Creating harbor-db
Creating registry
Creating harbor-ui
Creating harbor-jobservice
Creating nginx

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://192.168.33.10. 
For more details, please visit https://github.com/vmware/harbor .
```

- Harbor用のコンテナが正常に起動しているかを確認します

```bash:Check_Containers_for_Harbor
ubuntu@ubuntu-xenial:~/harbor$ sudo docker-compose top
harbor-db
UID   PID    PPID   C   STIME   TTY     TIME                         CMD                      
---------------------------------------------------------------------------------------------
999   5424   5346   0   11:42   ?     00:00:01   mysqld --init-file=/tmp/mysql-first-time.sql 

harbor-jobservice
UID    PID    PPID   C   STIME   TTY     TIME                CMD            
---------------------------------------------------------------------------
root   5697   5674   0   11:42   ?     00:00:00   /harbor/harbor_jobservice 

harbor-log
UID    PID    PPID   C   STIME   TTY     TIME                                  CMD                               
----------------------------------------------------------------------------------------------------------------
root   5160   5142   0   11:42   ?     00:00:00   /bin/sh -c crond && rm -f /var/run/rsyslogd.pid && rsyslogd -n 
root   5206   5160   0   11:42   ?     00:00:00   crond                                                          
root   5208   5160   0   11:42   ?     00:00:00   rsyslogd -n                                                    

harbor-ui
UID    PID    PPID   C   STIME   TTY     TIME            CMD        
-------------------------------------------------------------------
root   5412   5318   0   11:42   ?     00:00:00   /harbor/harbor_ui 

nginx
 UID     PID    PPID   C   STIME   TTY     TIME                        CMD                     
----------------------------------------------------------------------------------------------
root     5740   5714   0   11:42   ?     00:00:00   nginx: master process nginx -g daemon off; 
syslog   5824   5740   0   11:42   ?     00:00:00   nginx: worker process                      
syslog   5825   5740   0   11:42   ?     00:00:00   nginx: worker process                      

registry
UID    PID    PPID   C   STIME   TTY     TIME                       CMD                   
-----------------------------------------------------------------------------------------
root   5361   5271   0   11:42   ?     00:00:00   registry serve /etc/registry/config.yml 
```

これでHarborのインストールは一通り完了です。
次はWebUIにアクセスし、プロジェクトの作成等を行っていきたいと思います。

##4. Operation on WebUI

### Login and Create User
- WebUI (https://[YOUR_IP_ADDRESS]) にアクセスします（今回は https://192.168.33.10/ です）

![スクリーンショット 2017-03-24 20.55.01.png](https://qiita-image-store.s3.amazonaws.com/0/170124/645f9be8-d7e5-edfb-a37d-7a6805e5c458.png)

- `Admin`ユーザでログインしてみます。初期パスワードは`Harbor12345`です。

![スクリーンショット 2017-03-24 21.01.24.png](https://qiita-image-store.s3.amazonaws.com/0/170124/1fd24a3d-02d0-8a3b-2840-c6559439085b.png)

上図のようなダッシュボードが表示されれば成功です。特に操作を行っていないので、真っ新なページになっていますが、各種操作を実行するとログが表示されていくようになります。

- 次に`User`ユーザを作成してみます。作成するには上部のHarborロゴの隣にあるユーザ情報をクリックし、`Add User`を選択します。

![スクリーンショット 2017-03-24 21.06.38.png](https://qiita-image-store.s3.amazonaws.com/0/170124/2aa78325-d0cc-52be-9678-0b899effcc97.png)

- 以下のように適宜必要な項目を入力し、`Add`を選択します。成功すると`New user added successfully`といったメッセージが表示されます。

![スクリーンショット 2017-03-24 21.08.29.png](https://qiita-image-store.s3.amazonaws.com/0/170124/0051a7d4-62db-ccf4-2d37-c66e8318fca0.png)

![スクリーンショット 2017-03-24 21.09.09.png](https://qiita-image-store.s3.amazonaws.com/0/170124/5f849953-9982-8534-5f07-8764b7f5c9d2.png)

### Create and Check Project
- ダッシュボードの画面中部にある`New Project`を選択します。適当なプロジェクト名(今回は`first-project`を入力し、`Public`にチェックを入れて、`Save`を選択します。すると、以下のようにダッシュボードに新たなプロジェクトが表示されます。

![スクリーンショット 2017-03-24 21.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/170124/e94abca3-2250-55cf-5356-20e5ef4050b9.png)

- ダッシュボードのトップ画面に操作ログが追記されている事が確認できると思います。

![スクリーンショット 2017-03-24 21.18.09.png](https://qiita-image-store.s3.amazonaws.com/0/170124/b4642541-673e-efc9-6895-2b47f714e4b1.png)

- 次に先ほど作成した`User`ユーザから、プロジェクトがどのように見えるかを確認します。
上部メニューから`Projects`を選択し、画面中部に表示される`Public Projects`を選択すると、先ほど作成されたプロジェクト名が見えると思います。

![スクリーンショット 2017-03-24 21.21.43.png](https://qiita-image-store.s3.amazonaws.com/0/170124/36e44bb7-44b3-f472-47b7-62053d78f47b.png)

- 加えて同プロジェクトの公開範囲を`Publicity`を`OFF`にし、再度`User`ユーザからどのように見えるかを確認します。結果はお察しの通り、当該プロジェクトの情報が見えなくなっていると思います。（余談ですが、`Admin`ユーザからは全ユーザのプロジェクトを閲覧する事が出来、操作する事も出来ます。また、プロジェクト名の右の方にあるゴミ箱アイコンをクリックするとプロジェクトを削除する事ができます。）

![スクリーンショット 2017-03-24 21.25.12.png](https://qiita-image-store.s3.amazonaws.com/0/170124/2878c8bb-4a06-158d-06f5-4b5c34fb64d2.png)

### Operation in Project
- プロジェクト名を選択すると、画面中央右部に Repositories, Replication(Admin権限のみ閲覧可), Users, Logsといった項目が表示され、各種操作を行う事が出来ます。

![スクリーンショット 2017-03-24 21.40.47.png](https://qiita-image-store.s3.amazonaws.com/0/170124/222451c1-9397-a67c-9178-ff14851da362.png)


### Admin Operation
- `Admin`権限を持つユーザは、画面上部に`Admin Options`が表示されると思います。この`Admin Options`ではユーザ管理からレプリケーションの設定等を行う事が出来ますが今回は割愛します。

![スクリーンショット 2017-03-24 21.31.06.png](https://qiita-image-store.s3.amazonaws.com/0/170124/4875a450-b597-4f20-0339-616bb756190c.png)

![スクリーンショット 2017-03-24 21.31.08.png](https://qiita-image-store.s3.amazonaws.com/0/170124/8ea45b47-3d2b-99ed-df87-759293ca03ac.png)

以上で、WebUIからの操作説明は終わりです。インタフェースも操作方法も簡潔ですね。
レプリケーションの方法やユーザ制御の細かい設定等は割愛しましたが、とても便利な機能なので活用していきたいところです。
それでは、次は実際にプロジェクトにイメージをプッシュしていきたいと思います。

##5. Push Container Image to Harbor Project
- Harborが動作しているサーバ上で作成したオレオレ証明書をコピーします。証明書はHarborを利用する全クライアント上にコピーする必要があります。

```bash:Setup_Certificate
# Harborが動作しているサーバ上にあるオレオレ証明書の内容をコピーします
ubuntu@ubuntu-xenial:~/harbor$ cat /home/ubuntu/cert/192.168.33.10.crt

# Dockerの設定用ディレクトリに証明書を格納するディレクトリを作成し、オレオレ証明書の内容を別の名前で保存します
ubuntu@ubuntu-xenial:~/harbor$ sudo mkdir -p /etc/docker/certs.d/192.168.33.10
ubuntu@ubuntu-xenial:~/harbor$ sudo vim /etc/docker/certs.d/192.168.33.10/ca.crt

# 上記で作成したca.crtのシンボリックリンクをOS内の証明書を格納するディレクトリに作成した後に証明書の情報を更新します
ubuntu@ubuntu-xenial:~/harbor$ sudo ln -s /etc/docker/certs.d/192.168.33.10/ca.crt /usr/local/share/ca-certificates/192.168.33.10.crt
ubuntu@ubuntu-xenial:~/harbor$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
```

- DockerCLIからHarborにログインします。今回は`Username`は`Admin`、`Password`は`Harbor12345`でログインしてみます。成功すると`Login Succeeded`という文字が出力されるはずです。

```bash:Login_Harbor
ubuntu@ubuntu-xenial:~/harbor$ sudo docker login 192.168.33.10
Username: Admin
Password: 
Login Succeeded
```

- 適当なコンテナイメージをローカルにプルし、Harborにそのイメージをプッシュしてみます。

```bash:Push_Image
# コンテナイメージubuntu:xenialをローカルにプルします
ubuntu@ubuntu-xenial:~$ sudo docker pull ubuntu:xenial
xenial: Pulling from library/ubuntu
d54efb8db41d: Pull complete 
f8b845f45a87: Pull complete 
e8db7bf7c39f: Pull complete 
9654c40e9079: Pull complete 
6d9ef359eaaa: Pull complete 
Digest: sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535
Status: Downloaded newer image for ubuntu:xenial

# 正しくコンテナイメージをプル出来ているかを確認
ubuntu@ubuntu-xenial:~$ sudo docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
ubuntu                     xenial              0ef2e08ed3fa        3 weeks ago         130 MB
vmware/harbor-log          0.5.0               eebc987a891b        3 months ago        191 MB
vmware/harbor-jobservice   0.5.0               995368e96860        3 months ago        169 MB
vmware/harbor-ui           0.5.0               232a8664541a        3 months ago        233 MB
vmware/harbor-db           0.5.0               84c4ce8e9b6c        3 months ago        327 MB
nginx                      1.11.5              05a60462f8ba        4 months ago        181 MB
registry                   2.5.0               c6c14b3960bd        8 months ago        33.3 MB

# コンテナイメージubuntu:xenialにタグ付けします
# sudo docker tag <ローカルイメージ名> <イメージ名:タグ名> でタグ付けすることができます。
# 自作のコンテナイメージをビルドする際にタグ付けしたい場合は、
# sudo docker build -t 192.168.33.10/first-project/my-image:my-tag . になります。
ubuntu@ubuntu-xenial:~$ sudo docker tag ubuntu:xenial 192.168.33.10/first-project/my-ubuntu:0.0.1

# 正しくコンテナイメージにタグ付け出来ているかを確認
ubuntu@ubuntu-xenial:~$ sudo docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
192.168.33.10/first-project/my-ubuntu   0.0.1               0ef2e08ed3fa        3 weeks ago         130 MB
ubuntu                                  xenial              0ef2e08ed3fa        3 weeks ago         130 MB
vmware/harbor-log                       0.5.0               eebc987a891b        3 months ago        191 MB
vmware/harbor-jobservice                0.5.0               995368e96860        3 months ago        169 MB
vmware/harbor-ui                        0.5.0               232a8664541a        3 months ago        233 MB
vmware/harbor-db                        0.5.0               84c4ce8e9b6c        3 months ago        327 MB
nginx                                   1.11.5              05a60462f8ba        4 months ago        181 MB
registry                                2.5.0               c6c14b3960bd        8 months ago        33.3 MB

# 最後にHarborにコンテナイメージをプッシュします
ubuntu@ubuntu-xenial:~$ sudo docker push 192.168.33.10/first-project/my-ubuntu
The push refers to a repository [192.168.33.10/first-project/my-ubuntu]
56827159aa8b: Pushed 
440e02c3dcde: Pushed 
29660d0e5bb2: Pushed 
85782553e37a: Pushed 
745f5be9952c: Pushed 
0.0.1: digest: sha256:6b079ae764a6affcb632231349d4a5e1b084bece8c46883c099863ee2aeb5cf8 size: 1357
```

これで今回構築したHarborにコンテナイメージをプッシュする事が出来ました。
次は実際にプッシュ出来ているかどうかをWebUI上から確認してみたいと思います。

##6. Check on WebUI
- WebUI上から`Admin`ユーザでログインし、上部メニューの`Projects`内をクリックし、`first-project`を選択します。すると、先ほどの何も表示されていなかったプロジェクトに、コンテナイメージが追加されている事が分かります。

![スクリーンショット 2017-03-27 23.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/170124/3dca8075-b432-e9b0-e196-2579e4f1f150.png)

- 上記のコンテナイメージ名を選択すると、より詳細な情報が表示されます。

![スクリーンショット 2017-03-27 23.45.36.png](https://qiita-image-store.s3.amazonaws.com/0/170124/0c6cc0cc-382f-a16b-7595-4ba7128dc5f7.png)

![スクリーンショット 2017-03-27 23.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/170124/9151af7f-c028-4b7a-442d-6745db595a68.png)

##7. Create Container by Using Container Image on Harbor
- それでは最後にHarbor上にプッシュしたコンテナイメージを用いて、コンテナを作成してみます。

```bash:Create_Container
# 確認のため、ローカルに元々あるコンテナイメージの情報を削除する
ubuntu@ubuntu-xenial:~$ sudo docker rmi 192.168.33.10/first-project/my-ubuntu:0.0.1
Untagged: 192.168.33.10/first-project/my-ubuntu:0.0.1
Untagged: 192.168.33.10/first-project/my-ubuntu@sha256:6b079ae764a6affcb632231349d4a5e1b084bece8c46883c099863ee2aeb5cf8

ubuntu@ubuntu-xenial:~$ sudo docker rmi ubuntu:xenial
Untagged: ubuntu:xenial
Untagged: ubuntu@sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535
Deleted: sha256:0ef2e08ed3fabfc44002ccb846c4f2416a2135affc3ce39538834059606f32dd
Deleted: sha256:0d58a35162057295d273c5fb8b7e26124a31588cdadad125f4bce63b638dddb5
Deleted: sha256:cb7f997e049c07cdd872b8354052c808499937645f6164912c4126015df036cc
Deleted: sha256:fcb4581c4f016b2e9761f8f69239433e1e123d6f5234ca9c30c33eba698487cc
Deleted: sha256:b53cd3273b78f7f9e7059231fe0a7ed52e0f8e3657363eb015c61b2a6942af87
Deleted: sha256:745f5be9952c1a22dd4225ed6c8d7b760fe0d3583efd52f91992463b53f7aea3

# 関連するコンテナイメージがローカルに無い事を確認する
ubuntu@ubuntu-xenial:~$ sudo docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
vmware/harbor-log          0.5.0               eebc987a891b        3 months ago        191 MB
vmware/harbor-jobservice   0.5.0               995368e96860        3 months ago        169 MB
vmware/harbor-ui           0.5.0               232a8664541a        3 months ago        233 MB
vmware/harbor-db           0.5.0               84c4ce8e9b6c        3 months ago        327 MB
nginx                      1.11.5              05a60462f8ba        4 months ago        181 MB
registry                   2.5.0               c6c14b3960bd        8 months ago        33.3 MB

# Harborにプッシュしたコンテナイメージでコンテナを作成、そしてアタッチしてみる。
ubuntu@ubuntu-xenial:~$ sudo docker run --rm -it 192.168.33.10/first-project/my-ubuntu:0.0.1 /bin/bash
Unable to find image '192.168.33.10/first-project/my-ubuntu:0.0.1' locally
0.0.1: Pulling from first-project/my-ubuntu
fec6b243e075: Pull complete 
190e0e9a3e79: Pull complete 
0d79cf192e4c: Pull complete 
38398c307b51: Pull complete 
356665655a72: Pull complete 
Digest: sha256:6b079ae764a6affcb632231349d4a5e1b084bece8c46883c099863ee2aeb5cf8
Status: Downloaded newer image for 192.168.33.10/first-project/my-ubuntu:0.0.1
root@413a97aa7dcc:/# Succeeded!

# ローカルにHarbor上のコンテナイメージが存在するかを確認する
ubuntu@ubuntu-xenial:~$ sudo docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
192.168.33.10/first-project/my-ubuntu   0.0.1               0ef2e08ed3fa        3 weeks ago         130 MB
vmware/harbor-log                       0.5.0               eebc987a891b        3 months ago        191 MB
vmware/harbor-jobservice                0.5.0               995368e96860        3 months ago        169 MB
vmware/harbor-ui                        0.5.0               232a8664541a        3 months ago        233 MB
vmware/harbor-db                        0.5.0               84c4ce8e9b6c        3 months ago        327 MB
nginx                                   1.11.5              05a60462f8ba        4 months ago        181 MB
registry                                2.5.0               c6c14b3960bd        8 months ago        33.3 MB
```

##8. 終わりに
以上で、Harborを使ったちょっぴりSecureなPrivate Docker Registryの構築は終わりです。
HarborのインストールからWebUIの使い方までをさらっと書いてみましたが、私自身まだよく理解していない箇所もあるので、これからも色々と調べていきたいと思います。こういった便利なOSSは積極的に使っていきたいですね。

## 参考サイト
- https://vmware.github.io/harbor/
- https://github.com/vmware/harbor
- https://jaco.udcp.info/docker-registry-harbor/