再談 Docker Repository

在上篇的 再談 Docker Container 的介紹中對於 Docker Container 有了更深入的了解,接下來換來更深入瞭解 Docker Repository 吧!下篇就是 Deploy ~快到惹www

Repository

Repository(倉庫)、Registry(伺服器),傻傻分不清楚?

每個 Registry 上可以有多個 Repository,而每個 Repository 下面有多個 Image。簡單來說,Repository 可以被認為是一個具體的專案或目錄,例如對於 Repository 位址 dl.dockerpool.com/ubuntu 來說,dl.dockerpool.com 是註冊 Registry 位址,ubuntu 是 Repository 名稱。

Docker Hub

目前 Docker 官方維護了一個 Docker Hub,其中包括了超過 15,000 的 Image。大部分需求,都可以透過 Docker Hub 直接下載 Image 來實作。

登入

可以透過執行 docker login 指令來輸入使用者名稱、密碼和電子信箱來完成註冊和登錄。 註冊成功後,本地使用者目錄的 .dockercfg 中將保存使用者的認證資訊。

或者可以直接到官方註冊帳號密碼:https://hub.docker.com/

基本操作

使用者無需登錄即可透過 docker search 指令來查詢 Docker Hub 中的 Image,並利用 docker pull 將它下載到 local 端。

1
2
3
4
5
6
7
8
docker search ruby

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ruby Ruby is a dynamic, reflective, object-orient… 1823 [OK]
circleci/ruby Ruby is a dynamic, reflective, object-orient… 67
starefossen/ruby-node Docker Image with Ruby and Node.js installed 34 [OK]
heroku/ruby Docker Image for Heroku Ruby 22 [OK]
...

下載官方 ruby Image 到 local 端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker pull ruby

Using default tag: latest
latest: Pulling from library/ruby
8f0fdd3eaac0: Pull complete
d918eaefd9de: Pull complete
43bf3e3107f5: Pull complete
27622921edb2: Pull complete
dcfa0aa1ae2c: Pull complete
0e1f1dc37f65: Pull complete
ebd3e50ed509: Pull complete
660f560ba0a3: Pull complete
Digest: sha256:...
Status: Downloaded newer image for ruby:latest
docker.io/library/ruby:latest

看看剛剛下載的 ruby Image 吧!

1
2
3
4
5
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
chestertang/sinatra v2 3bae0e76683f 8 days ago 447MB
ruby latest fb53c5f433da 3 weeks ago 842MB

反之當然,也可以在登錄後透過 docker push 將 Image 推送到 Docker Hub

自動建立

自動建立(Automated Builds)功能對於需要經常升級 Image 的人來說很方便。有時候,使用者建立了 Image,安裝了某個軟體,如果軟體發布新版本則需要手動更新 Image。

此外,也允許使用者透過 Docker Hub 指定跟蹤一個目標網站(目前支援 GitHub 或 BitBucket)上的專案,一旦專案發生新的 push,則自動執行建立。

設定自動建立,包括以下的步驟:

  • 建立並登入 Docker Hub,以及目標網站
  • 在目標網站中連接帳戶到 Docker Hub
  • 在 Docker Hub 中設定自動建立
  • 選取一個目標網站中的專案(需要含 Dockerfile)和分支
  • 指定 Dockerfile 的位置,並提交建立

之後,可以在 Docker Hub 的自動建立頁面 中跟蹤每次建立的狀態

私有 Repository

有時候使用 Docker Hub 這樣的公共 Repository 可能不方便,使用者可以建立一個本地 Repository 供私人使用。

安裝執行 docker-registry

容器執行

在安裝了 Docker 後,可以透過取得官方 registry Image 來執行

1
docker run -d -p 5000:5000 registry

這將使用官方的 registry Image 來啟動本地的私有 Repository。 使用者可以透過指定參數來設定私有 Repository 位置,例如設定 Iamge 儲存到 Amazon S3 服務。

1
2
3
4
5
6
7
8
9
docker run \
-e SETTINGS_FLAVOR=s3 \
-e AWS_BUCKET=acme-docker \
-e STORAGE_PATH=/registry \
-e AWS_KEY=AKIAHSHB43HS3J92MXZ \
-e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T \
-e SEARCH_BACKEND=sqlalchemy \
-p 5000:5000 \
registry

在私有 Repository 上傳、下載、搜索 Image

建立好私有 Repository 之後,就可以使用 docker tag 來標記一個 Image,然後推送它到 Repository,別的機器上就可以下載下了。例如私有 Repository 位址為 192.168.7.26:5000。

先來複製一個 Image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 708bc6af7e5e 7 days ago 25.8MB
chestertang/sinatra v2 3bae0e76683f 8 days ago 447MB

docker tag 708bc6af7e5e 192.168.7.26:5000/test
~

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 708bc6af7e5e 7 days ago 25.8MB
192.168.7.26:5000/test latest 708bc6af7e5e 7 days ago 25.8MB
chestertang/sinatra v2 3bae0e76683f 8 days ago 447MB

使用 docker push 上傳 192.168.7.26:5000/test Image

1
2
3
4
5
6
7
8
9
10
11
12
docker push 192.168.7.26:5000/test

The push refers to a repository [192.168.7.26:5000/test] (len: 1)
Sending image list
Pushing repository 192.168.7.26:5000/test (1 tags)
Image 511136ea3c5a already pushed, skipping
Image 9bad880da3d2 already pushed, skipping
Image 25f11f5fb0cb already pushed, skipping
Image ebc34468f71d already pushed, skipping
Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}

curl 查看倉庫中的映像檔

1
2
3
curl http://192.168.7.26:5000/v1/search

{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}

這樣就代表完成啦!

設定檔案

Docker 的 Registry 利用設定檔案提供了一些 REPOSITORY 的模組(flavor),使用者可以來進行開發或部署。

模組

config_sample.yml 檔案中,可以如下:

  • common:基礎設定
  • local:儲存資料到本地檔案系統
  • s3:儲存資料到 AWS S3 中
  • dev:使用 local 模組的基本設定
  • test:單元測試使用
  • prod:生產環境設定(基本上跟s3設定類似)
  • gcs:儲存資料到 Google 的雲端
  • swift:儲存資料到 OpenStack Swift 服務
  • glance:儲存資料到 OpenStack Glance 服務,本地檔案系統為後備
  • glance-swift:儲存資料到 OpenStack Glance 服務,Swift 為後備
  • elliptics:儲存資料到 Elliptics key/value 儲存

範例設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
common:
loglevel: info
search_backend: "_env:SEARCH_BACKEND:"
sqlalchemy_index_database: "_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db"

prod:
loglevel: warn
storage: s3
s3_access_key: _env:AWS_S3_ACCESS_KEY
s3_secret_key: _env:AWS_S3_SECRET_KEY
s3_bucket: _env:AWS_S3_BUCKET
boto_bucket: _env:AWS_S3_BUCKET
storage_path: /srv/docker
smtp_host: localhost
from_addr: [email protected]
to_addr: [email protected]

dev:
loglevel: debug
storage: local
storage_path: /home/myself/docker

test:
storage: local
storage_path: /tmp/tmpdockertmp