程式扎記: Docker Practice - Repository

標籤

2015年5月22日 星期五

Docker Practice - Repository

(Source)

Docker Repository#

倉庫(Repository)是集中存放映像檔的地方。

一個容易混淆的概念是註冊伺服器(Registry)。實際上註冊伺服器是管理倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個映像檔。從這方面來說,倉庫可以被認為是一個具體的專案或目錄。例如對於倉庫位址 dl.dockerpool.com/ubuntu 來說, dl.dockerpool.com 是註冊伺服器位址, ubuntu 是倉庫名。 

大部分時候,並不需要嚴格區分這兩者的概念。

Docker Hub#

Docker 官方維護了一個公共倉庫 Docker Hub,其中包括了超過 15,000 的映像檔。大部分需求,都可以透過在 Docker Hub 中直接下載映像檔來實作。

登錄#

可以透過執行 docker login 命令來輸入使用者名稱、密碼和電子信箱來完成註冊和登錄:
Usage: docker login [OPTIONS] [SERVER]
Register or log in to a Docker registry server, if no server is
specified "https://index.docker.io/v1/" is the default.

  -e, --email=""       Email
  -p, --password=""    Password
  -u, --username=""    Username

註冊成功後,本地使用者目錄的 .dockercfg 中將保存使用者的認證訊息。

基本操作#

使用者無需登錄即可透過 docker search 命令來查詢官方倉庫中的映像檔 (See Find Public Images on Docker Hub for more details on finding shared images from the command line.):
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images

  --automated=false    Only show automated builds
  --no-trunc=false     Don't truncate output
  -s, --stars=0        Only displays with at least x stars

並可以利用 docker pull 命令來將它下載到本地:
Usage: docker pull [OPTIONS] NAME[:TAG]
Pull an image or a repository from the registry

  -a, --all-tags=false    Download all tagged images in the repository

例如以 centos 為關鍵字進行搜索:


可以看到顯示了很多包含關鍵字的映像檔,其中包括映像檔名字、描述、星級(表示該映像檔的受歡迎程度)、是否官方建立、是否自動建立。 官方的映像檔說明是官方專案組建立和維護的,automated 資源允許使用者驗證映像檔的來源和內容。

根據是否由官方提供,可將映像檔資源分為兩類。 一種是類似 centos 這樣的基礎映像檔,被稱為基礎或根映像檔。這些基礎映像檔是由 Docker 公司建立、驗證、支援、提供。這樣的映像檔往往使用單個單詞作為名字。 還有一種類型,比如 tianon/centos 映像檔,它是由 Docker 的使用者建立並維護的,往往帶有使用者名稱前綴。可以透過前綴 user_name/ 來指定使用某個使用者提供的映像檔,比如 tianon 使用者。

另外,在查詢的時候透過 -s N 參數可以指定僅顯示評價為 N 星以上的映像檔:

-s, --stars=0
 Only displays with at least xxx stars

下面命令下載官方 centos 映像檔到本地:
# docker pull centos

使用者也可以在登錄後透過 docker push 命令來將映像檔推送到 Docker Hub:
Usage: docker push NAME[:TAG]
Push an image or a repository to the registry

自動建立#

自動建立(Automated Builds)功能對於需要經常升級映像檔內程式來說,十分方便。 有時候,使用者建立了映像檔,安裝了某個軟體,如果軟體發布新版本則需要手動更新映像檔。而 "自動建立" 允許使用者透過 Docker Hub 指定跟蹤一個目標網站目前支援 GitHub 或 BitBucket上的專案,一旦專案發生新的提交,則自動執行建立。要設定自動建立,包括以下的步驟:
  1. 建立並登陸 Docker Hub,以及目標網站;
  2. 在目標網站中連接帳戶到 Docker Hub;
  3. 在 Docker Hub 中 設定一個自動建立
  4. 選取一個目標網站中的專案(需要含 Dockerfile)和分支;
  5. 指定 Dockerfile 的位置,並提交建立。

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

私有倉庫#

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

docker-registry 是官方提供的工具,可以用於建立私有的映像檔倉庫:

安裝執行 docker-registry#

容器執行
在安裝了 Docker 後,可以透過取得官方 registry 映像檔來執行:
// -p, --publish= Publish a container's port to the host 
// format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 
// -d, --detach=false Detached mode: Run container in the background, print new container id 

# docker run -d -p 5000:5000 registry
... 
# docker ps 
... 
fbf8e78e32a6 registry:latest docker-registry 9 minutes ago Up 9 minutes 0.0.0.0:5000->5000/tcp insane_mccarthy

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


此外,還可以指定本地路徑( /home/user/registry-conf )下的設定檔案。
// -p, --publish= Publish a container's port to the host 
// -v, --volume= Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container) 
// -e, --env= Set environment variables 

# docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG

預設情況下,倉庫會被建立在容器的 /tmp/registry 下。可以透過 -v 參數來將映像檔檔案存放在本地的指定路徑。 例以下面的例子將上傳的映像檔放到/opt/data/registry 目錄:
# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

本地安裝#

對於 Ubuntu 或 CentOS 等發行版,可以直接透過套件庫安裝:
  • Ubuntu
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev 
$ sudo pip install docker-registry

  • CentOS
$ sudo yum install -y python-devel libevent-devel python-pip gcc xz-devel 
$ sudo python-pip install docker-registry

也可以從 docker-registry 專案下載原始碼進行安裝:
$ sudo apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev swig 
$ git clone https://github.com/docker/docker-registry.git 
$ cd docker-registry 
$ sudo python setup.py install

然後修改設定檔案,主要修改 dev 模板段的 storage_path 到本地的儲存倉庫的路徑:
$ cp config/config_sample.yml config/config.yml

之後啟動 Web 服務:
$ sudo gunicorn -c contrib/gunicorn_config.py docker_registry.wsgi:application

或者:
$ sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100

此時使用連結本地的 5000 連接埠,看到輸出 docker-registry 的版本訊息說明執行成功!

在私有倉庫上傳、下載、搜索映像檔#

建立好私有倉庫之後,就可以使用 docker tag 來標記一個映像檔:
Usage: docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
Tag an image into a repository

  -f, --force=false    Force

然後推送它到倉庫,別的機器上就可以下載下來了。例如私有倉庫位址為 192.168.140.133:5000, 先在本機查看已有的映像檔:
# docker images | grep johnklee 
johnklee/tutorial v2 0664466a35f7 6 days ago 318 MB 
johnklee/tutorial latest 3c6f5bae3aca 6 days ago 452 MB

使用 docker tag 將 3c6f 這個映像檔標記為 192.168.140.133:5000/test:
# docker tag 3c6f 192.168.140.133:5000/test 
# docker images | grep "192.168.140.133:5000" 
192.168.140.133:5000/test latest 3c6f5bae3aca 6 days ago 452 MB

使用 docker push 上傳標記的映像檔:
Usage: docker push NAME[:TAG]
Push an image or a repository to the registry

# docker push 192.168.140.133:5000/test 
... 
Pushing tag for rev [3c6f5bae3aca] on {http://192.168.140.133:5000/v1/repositories/test/tags/latest}

用 curl 查看倉庫中的映像檔:
# curl http://192.168.140.133:5000/v1/search 
{"num_results": 1, "query": "", "results": [{"description": "", "name": "library/test"}]}

現在可以到另外一臺機器去下載這個映像檔:
// We use Centos 7 here 
# docker images 
# vim /etc/sysconfig/docker // Modify docker daemon configuration 
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--insecure-registry 192.168.140.133:5000'
...

# service docker restart // Restart docker daemon 
# docker pull 192.168.140.133:5000/test // Start to pull images from our private repo 
# docker images | grep 192.168.140.133:5000/test // Make sure the image has been pulled successfully. 
192.168.140.133:5000/test latest 3c6f5bae3aca 7 days ago 452 MB

可以使用 這個腳本 批次上傳本地的映像檔到註冊伺服器中,預設為本地註冊伺服器 127.0.0.1:5000 。例如:

倉庫設定檔案#

Docker 的 Registry 利用設定檔案提供了一些倉庫的模組(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 儲存

使用者也可以新增自定義的模版段. 預設情況下使用的模組是 dev ,要使用某個模組作為預設值,可以新增 SETTINGS_FLAVOR 到環境變數中,例如:
# export SETTINGS_FLAVOR=dev

另外,設定檔案中支援從環境變數中載入值,語法格式為 _env:VARIABLENAME[:DEFAULT]

範例設定#

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: docker@myself.com
    to_addr: my@myself.com
dev:
    loglevel: debug
    storage: local
    storage_path: /home/myself/docker
test:
    storage: local
    storage_path: /tmp/tmpdockertmp

補充說明#

FATA[0000] Error: v1 ping attempt failed with error: Get https://192.168.140.133:5000/v1/_ping: dial tcp 192.168.140.133:5000: connection refused. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.140.133:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.140.133:5000/ca.crt
There are a number of ways to configure the daemon flags and environment variables for your Docker daemon...

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!