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)上的專案,一旦專案發生新的提交,則自動執行建立。要設定自動建立,包括以下的步驟:- 建立並登陸 Docker Hub,以及目標網站;
- 在目標網站中連接帳戶到 Docker Hub;
- 在 Docker Hub 中 設定一個自動建立;
- 選取一個目標網站中的專案(需要含 Dockerfile)和分支;
- 指定 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
// 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
// -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
$ 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
$ 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
$ 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
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 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}
...
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"}]}
{"num_results": 1, "query": "", "results": [{"description": "", "name": "library/test"}]}
現在可以到另外一臺機器去下載這個映像檔:
// We use Centos 7 here
# docker images
# vim /etc/sysconfig/docker // Modify docker daemon configuration
# 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
# 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
補充說明#
- How To Set Up a Private Docker Registry on Ubuntu 14.04
- FAQ - Error: v1 ping attempt failed with error
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...
沒有留言:
張貼留言