Ubuntu14.04에서 개인 도커 레지스트리를 설정하는 방법
원본 주소: https://www.digitalocean.com/community/tutorials/how-to-set-up-a -private -docker-registry-on-ubuntu-14-04
저자: Nik van der Ploeg
번역자: Chen Zhengwen(awenchen)
소개
Docker는 서버 배포를 위한 강력한 도구입니다. docker.io는 사용자에게 공식 레지스트리에 이미지 리소스를 업로드할 수 있는 무료 서비스를 제공합니다. 그러나 레지스트리는 모든 사람에게 열려 있습니다. 아마도 오픈 소스가 아닌 프로젝트에서는 이 작업을 수행하고 싶지 않을 수도 있습니다.
이 기사에서는 개인용 Docker 레지스트리를 구축하고 보안을 보장하는 방법을 안내합니다. 이 튜토리얼이 끝나면 직접 만든 Docker 이미지를 개인 레지스트리에 업로드하고 다른 머신에서 안전하게 가져오는 실습 경험을 갖게 됩니다.
이 튜토리얼에서는 애플리케이션 서비스를 컨테이너화하는 방법을 다루지 않지만, 배포하려는 서비스 리소스를 저장할 레지스트리를 생성하는 방법을 안내하기 위한 것입니다. docker에 대한 입문 튜토리얼을 원한다면 이것이 도움이 될 수 있습니다.
Ubuntu14.04 시스템의 단일 레지스트리 및 단일 클라이언트 모드를 기반으로 하는 이 튜토리얼은 테스트를 거쳤으며 다른 Debian 기반 배포판에서도 계속 작동할 수 있습니다.
Docker 개념
이전에 docker를 접해본 적이 없다면 docker의 주요 개념을 익히는 데 몇 분 정도 걸릴 것입니다. 이미 docker에 익숙하고 프라이빗 레지스트리를 구축하는 방법만 알고 싶다면 다음 섹션으로 바로 이동할 수 있습니다.
Docker 사용 방법에 대한 초보자라면 여기에서 훌륭한 docker Notes를 사용해 보는 것이 좋습니다.
Docker의 핵심은 운영 체제에서 애플리케이션과 애플리케이션 종속성을 분리하는 것입니다. 위의 목적을 달성하기 위해 docker는 컨테이너 및 미러링 메커니즘을 사용합니다. 도커 이미지는 기본적으로 파일 시스템용 템플릿입니다. docker run 명령을 통해 docker 이미지를 실행하면 파일 시스템의 인스턴스가 활성화되고 시스템의 docker 컨테이너에서 실행됩니다. 기본적으로 컨테이너는 원본 이미지의 파일 시스템과 Docker 자체가 실행 중인 호스트를 건드릴 수 없습니다. 이는 독립된 환경입니다.
컨테이너에 대한 모든 변경 사항은 컨테이너 자체 내에 저장되며 원본 이미지에는 영향을 주지 않습니다. 이러한 변경 사항을 유지하려면 docker commit 명령을 통해 컨테이너를 이미지로 저장할 수 있습니다. 즉, 원래 컨테이너(또는 이미지)에 영향을 주지 않고 기존 컨테이너에서 새 컨테이너를 파생할 수 있습니다. git
에 익숙하다면 이 프로세스가 매우 익숙할 것입니다. 모든 컨테이너에서 새 브랜치를 생성합니다(여기서 브랜치는 docker의 이미지를 의미합니다). 이미지 실행은 git checkout 작업을 수행하는 것과 유사합니다.
에서는 개인 도커 레지스트리를 실행하는 것이 도커 이미지용 개인 git
웨어하우스를 실행하는 것과 같다고 자세히 설명합니다.
1단계 - 필요한 소프트웨어 설치
Docker 레지스트리 서버에서 sudo
권한이 있는 사용자를 생성해야 합니다(가능한 경우 클라이언트 시스템에서도).
docker 레지스트리 소프트웨어는 python
애플리케이션이므로 실행하려면 python
개발 환경과 필요한 라이브러리를 설치해야 합니다.
<code>sudo apt-get update sudo apt-get -y install build-essential python-dev libevent-dev python-pip liblzma-dev </code>
2단계— — 도커 레지스트리 설치 및 구성
안정적인 최신 도커 레지스트리 릴리스(작성 당시 0.7.3, 번역 당시 0.9.1)를 설치하기 위해 python
패키지 관리를 사용합니다. 도구 pip
:
<code>sudo pip install docker-registry </code>
docker-registry
에는 구성 파일이 필요합니다.
기본적으로 pip
는 시스템에서 python
가 설치된 위치에 따라 이 구성 파일을 상당히 먼 위치에 배치합니다. 따라서 경로를 찾기 위해 registry
을 실행하여 관련 출력을 확인합니다.
<code>gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application </code>
구성 파일이 올바른 위치에 있지 않기 때문에 위의 시도는 실패합니다. message 다음과 같은 FileNotFoundError
오류 메시지가 포함되어 있습니다. [일부 버전에서는 다음 정보가 출력되지 않습니다. 번역자 참고 사항]:
<code>FileNotFoundError: Heads-up! File is missing: /usr/local/lib/python2.7/dist-packages/docker_registry/lib/../../config/config.yml </code>
registry
동일한 경로에 샘플 구성 파일이 포함되어 있으며 파일 이름은 다음과 같습니다. config_sample.yml
따라서 위에 제공된 경로 이름을 통해 샘플 구성 파일을 찾을 수 있습니다.
오류 메시지(이 경우 /usr/local/lib/python2.7/dist-packages/docker_registry/lib/../../config/config.yml
)에서 경로 정보를 복사한 다음 해당 경로로 전환할 수 있도록 config.yml
부분을 제거하세요.
<code>cd /usr/local/lib/python2.7/dist-packages/docker_registry/lib/../../config/ </code>
config_sample.yml
파일의 내용을 config.yml
에 복사합니다.
<code>sudo cp config_sample.yml config.yml </code>
기본적으로 docker
의 데이터 파일은 /tmp
폴더에 저장됩니다. , 그러나 Linux
과 유사한 많은 시스템에서는 시스템을 다시 시작하면 폴더가 지워지는데 이는 우리가 원하는 것이 아닙니다. 따라서 데이터를 저장할 영구 폴더를 만듭니다.
<code>sudo mkdir /var/docker-registry </code>
자, 이제 config.yml
파일을 구성하고 /tmp
폴더에 대한 참조를 /var/docker-registry
으로 변경합니다. 먼저, 파일 시작 부분 근처에서 sqlalchemy_index_database
로 시작하는 줄을 찾아서 시작합니다:
<code>sqlalchemy_index_database: _env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db </code>
. 그리고 /var/docker-registry
를 가리키도록 변경합니다.
<code>sqlalchemy_index_database: _env:SQLALCHEMY_INDEX_DATABASE:sqlite:////var/docker-registry/docker-registry.db </code>
向下一点,到local:
部分,重复上述操作,更改如下内容:
<code>local: &local storage: local storage_path: _env:STORAGE_PATH:/tmp/registry </code>
为:
<code>local: &local storage: local storage_path: _env:STORAGE_PATH:/var/docker-registry/registry </code>
样例配置文件中的其他默认值均无需修改。一目十行即可。然而,如果你想要做一些复杂的配置,诸如采用扩展存储装置来存储docker数据,那么该文件正具有此功能。当然,这已超出本教程的范围,你可以查看docker-registry
文档以获取更多的帮助。
既然配置文件已置于正确的位置,那么再一次尝试来测试docker registry
服务器:
<code>gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 docker_registry.wsgi:application </code>
你会看到如下的输出:
<code>2014-07-27 07:12:24 [29344] [INFO] Starting gunicorn 18.0 2014-07-27 07:12:24 [29344] [INFO] Listening at: http://0.0.0.0:5000 (29344) 2014-07-27 07:12:24 [29344] [INFO] Using worker: gevent 2014-07-27 07:12:24 [29349] [INFO] Booting worker with pid: 29349 2014-07-27 07:12:24,807 DEBUG: Will return docker-registry.drivers.file.Storage </code>
棒极了!现在我们已经拥有一个运行着的docker registry
。下面执行Ctrl+C终止该程序。
到目前为止,docker registry
并不是那么有用。它并不会自行启动除非我们执行上述gunicorn
命令。另外,docker registry
不没有引入任何的内置的认证机制,因此,其当前状态下是不安全并且对外部完全开放的。
第三步——以服务的形式启动docker registry
通过创建Upstart脚本,设置docker registry
在系统的启动程序中开始运行。
首先,创建日志文件目录:
<code>sudo mkdir -p /var/log/docker-registry </code>
然后,用一款你拿手的文本编辑器来创建Upstart
脚本:
<code>sudo nano /etc/init/docker-registry.conf </code>
将如下内容写入上述脚本中:
<code>description "Docker Registry" start on runlevel [2345] stop on runlevel [016] respawn respawn limit 10 5 script exec gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b localhost:5000 -w 8 docker_registry.wsgi:application end script </code>
更多关于Upstart
脚本的内容,请阅读该教程。
此时,执行如下命令:
<code>sudo service docker-registry start </code>
将看到下面的输出:
<code>docker-registry start/running, process 25303 </code>
当然,你也可以通过运行下面的命令查看server.log
日志文件,验证docker-registry
服务是否正在运行:
<code>tail /var/log/docker-registry/server.log </code>
如果一切正常的话,你会看到像之前执行gunicorn
命令时输出的文本信息。
既然docker-registry
服务器已在后台运行,那么下面我们来配置Nginx
,以使registry
更加安全。
第四步——通过Nginx
来保障docker registry
的安全性
为了避免任何人都能登陆我们的docker registy
服务器,首先要做的就是建立认证机制。
下面安装Nginx
和apache2-utils
包(通过该包,可以轻松创建Nginx
能够读取的权限文件)。
<code>sudo apt-get -y install nginx apache2-utils </code>
现在来创建docker
用户。
通过下面的命令来创建第一个用户:
<code>sudo htpasswd -c /etc/nginx/docker-registry.htpasswd USERNAME </code>
当跳出命令行时,轻给出该用户的密码。
如果将来想添加更多的用户,只需要在去除可选参数c
的前提下,重新运行上述命令:
<code>sudo htpasswd /etc/nginx/docker-registry.htpasswd USERNAME_2 </code>
现在,我们拥有了一个创建用户的文件dokcer-registry.htpasswd
,以及可用的docker registry
服务器。如果你想了解你的用户的话你可以随意查看该文件(如果想收回权限的话可以删除掉该用户)。
下面,我们需要告诉Nginx
去利用权限文件,并且将请求转发给docker registry
。
那么,我们来创建一个Nginx
的配置文件。创建一个新的docker-registry
文件,必要时可能需要输入执行sudo
命令的密码:
<code>sudo nano /etc/nginx/sites-available/docker-registry </code>
将如下内容添加到该文件中。注释也包含在其中。更多关于Nginx
虚拟主机配置文件的内容,可查阅该教程。
<code># For versions of Nginx > 1.3.9 that include chunked transfer encoding support # Replace with appropriate values where necessary upstream docker-registry { server localhost:5000; } server { listen 8080; server_name my.docker.registry.com; # ssl on; # ssl_certificate /etc/ssl/certs/docker-registry; # ssl_certificate_key /etc/ssl/private/docker-registry; proxy_set_header Host $http_host; # required for Docker client sake proxy_set_header X-Real-IP $remote_addr; # pass on real client IP client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads # required to avoid HTTP 411: see Issue #1486 (https://github.com/dotcloud/docker/issues/1486) chunked_transfer_encoding on; location / { # let Nginx know about our auth file auth_basic "Restricted"; auth_basic_user_file docker-registry.htpasswd; proxy_pass http://docker-registry; } location /_ping { auth_basic off; proxy_pass http://docker-registry; } location /v1/_ping { auth_basic off; proxy_pass http://docker-registry; } } </code>
对该文件建立链接,这样Nginx
就可以使用该配置文件:
<code>sudo ln -s /etc/nginx/sites-available/docker-registry /etc/nginx/sites-enabled/docker-registry </code>
然后,重启Nginx
以激活虚拟主机配置:
<code>sudo service nginx restart </code>
让我们确保每一环节都准确无误。Nginx
服务器监听端口8080,而初始的docker-registry
服务器监听本地端口5000。
我们可以通过curl
命令来测试整个环节的准确性:
<code>curl localhost:5000 </code>
你应当看到下述输出:
<code>"docker-registry server (dev) (v0.8.1)" </code>
不错,docker-registry
正在运行。现在检查Nginx
是否工作:
<code>curl localhost:8080 </code>
这次,你将得到HTML
格式的无权限访问的消息:
<code><html> <head><title>401 Authorization Required</title></head> <body bgcolor="white"> <center><h1>401 Authorization Required</h1></center> <hr><center>nginx/1.4.6 (Ubuntu)</center> </body> </html> </code>
同样的,也可以通过远端的机器运行上述两个测试命令来验证端口是否正确设置,不过需要将localhost
更改为主机的IP
地址。
在Upstart
配置文件中,我们设置docker-registry
仅仅监听来自localhost
的请求,这意味着外网将无法通过端口5000
来访问docker-registry
。另一方面,Nginx
监听来自端口8080
的请求,并且对外网开放。如果并非如此,你需要调整你的防火墙权限设置。
好了,权限设置已建立起来。那么,现在我们尝试使用先前创建的某个用户名来登陆Nginx
:
<code>curl USERNAME:PASSWORD@localhost:8080 </code>
如果正确运行,你将看到如下信息:
<code>"docker-registry server (dev) (0.8.1)" </code>
第五步——建立SSL
到目前为止,我们已经搭建起了registry
服务,并且运行在Nginx
后面,通过HTTP
基础认证机制连接二者。然而,由于连接是未加密的,所以该服务仍然是不安全的。也许你已经主要到了先前创建的Nginx
配置文件中被注释掉的关于SSL
的部分。
激活SSL
。首先,打开Nginx
文件以备编辑:
<code>sudo nano /etc/nginx/sites-available/docker-registry </code>
找到下述内容:
<code>server { listen 8080; server_name my.docker.registry.com; # ssl on; # ssl_certificate /etc/ssl/certs/docker-registry; # ssl_certificate_key /etc/ssl/private/docker-registry; </code>
删除SSL
行首的#
。如果你的服务器有自己的域名的话,将server_name
更改为你的域名。完成后应当如下所示:
<code>server { listen 8080; server_name yourdomain.com; ssl on; ssl_certificate /etc/ssl/certs/docker-registry; ssl_certificate_key /etc/ssl/private/docker-registry; </code>
保存该文件。现在,Nginx
已经被配置使用SSL
,下面将会分别从/etc/ssl/certs/docker-registry
和/etc/ssl/private/docker-registry
文件中搜索SSL
证书和秘钥。
如果你已经拥有了一个SSL
证书或者正准备去购买一个的话,你仅需要将证书和秘钥拷贝到上述所列的路径下(ssl_certificate
和ssl_certficate_key
)
也可以免费获得一个签名SSL
证书。
或者,使用一个自签名的SSL
证书。由于docker当前不允许使用自签名的SSL
证书,这将带来加倍的复杂度,因为我们必须去搭建系统来充当我们已具有签名权限的证书。
建立签名证书
首先,创建存放证书的目录并进入该目录:
<code>mkdir ~/certs cd ~/certs </code>
生成一个新的根秘钥:
<code>openssl genrsa -out devdockerCA.key 2048 </code>
生成一个根证书(跳入命令行时可输入任何内容):
<code>openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt </code>
然后,为服务器生成一个秘钥(稍后会将该文件拷贝到/etc/ssl/private/docker-registry
给Nginx
使用):
<code>openssl genrsa -out dev-docker-registry.com.key 2048 </code>
现在,我们必须生成证书签名请求。
在输入下面的OpenSSL
命令后,将会跳入命令行模式,需要你输入一些问题的答案。对于前面的一些问题,可随意编辑,但是当要求你键入“Common Name”时,确保输入的是你的服务器的域名。
<code>openssl req -new -key dev-docker-registry.com.key -out dev-docker-registry.com.csr </code>
例如,你的docker-registry
将以www.ilovedocker.com
为域名运行,然后你的输入应当如下所示:
<code>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) []:www.ilovedocker.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: </code>
切勿输入挑战码。然后,我们需要对证书的请求进行签名:
<code>openssl x509 -req -in dev-docker-registry.com.csr -CA devdockerCA.crt -CAkey devdockerCA.key -CAcreateserial -out dev-docker-registry.com.crt -days 10000 </code>
既然我们已生成了所需的证书文件,下面就将它们拷贝到正确的位置。
首先,将证书和秘钥拷贝到Nginx
预期的路径:
<code>sudo cp dev-docker-registry.com.crt /etc/ssl/certs/docker-registry sudo cp dev-docker-registry.com.key /etc/ssl/private/docker-registry </code>
由于生成的这些证书并没有得到任何一个著名的证书认证机构(例如,VeriSign
)验证,我们需要告诉那些即将连接该docker-registry
的客户机,该证书是合法的。我们本地做出上述认证,以便可以在docker-registry
服务器上使用docker
:
<code>sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert sudo cp devdockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert sudo update-ca-certificates </code>
你可能必须在每一台想要连接该docker-registry
的主机上执行上述操作。否则,你将得到SSL
错误并且无法取得连接,这些步骤将在客户端测试小节中再次出现。
SSL
测试
重启Nginx
以重新载入配置文件和SSL
秘钥:
<code>sudo service nginx restart </code>
再次执行curl
测试(仅此次使用https
)以验证SSL
正确工作。必须记住的是,为了让SSL
能够正确运行,你必须使用在创建SSL
证书的之前,在Common Name
域输入的域名。
<code>curl https://USERNAME:PASSWORD@YOUR-DOMAIN:8080 </code>
例如,若用户名和密码分别为nik
和test
,并且SSL
证书是为域名www.ilovedocker.com
,那么,你将输入如下的命令:
<code>curl https://nik:test@www.ilovedocker.com:8080 </code>
如果一切顺利的话,你会看到熟悉的内容:
<code>"docker-registry server (dev) (v0.8.1)" </code>
否则,重新检查建立SSL
的相关步骤,以及Nginx
配置文件,以确保一切正常。
到目前为止,我们已经建立了运行在Nginx
服务器后面的docker regsitry
,而Nginx
通过SSL
可以提供权限认证和加密。
第六步——通过其他主机访问docker registry
为了能够访问docker registry
,首先要将先前创建的SSL
证书添加到新的主机中。该证书文件位于~/certs/devdockerCA.crt
。可以选择直接将其复制到新的机器中,或者根据以下说明来进行拷贝粘贴:
在registry
服务器上,查看证书:
<code>cat ~/certs/devdockerCA.crt </code>
可得到类似如下的输出:
<code>-----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJANiXy7fHSPrmMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQwHhcNMTQwOTIxMDYwODE2WhcNNDIwMjA2MDYwODE2WjBF MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAuK4kNFaY3k/0RdKRK1XLj9+IrpR7WW5lrNaFB0OIiItHV9FjyuSWK2mj ObR1IWJNrVSqWvfZ/CLGay6Lp9DJvBbpT68dhuS5xbVw3bs3ghB24TntDYhHMAc8 GWor/ZQTzjccHUd1SJxt5mGXalNHUharkLd8mv4fAb7Mh/7AFP32W4X+scPE2bVH OJ1qH8ACo7pSVl1Ohcri6sMp01GoELyykpXu5azhuCnfXLRyuOvQb7llV5WyKhq+ SjcE3c2C+hCCC5g6IzRcMEg336Ktn5su+kK6c0hoD0PR/W0PtwgH4XlNdpVFqMST vthEG+Hv6xVGGH+nTszN7F9ugVMxewIDAQABo1AwTjAdBgNVHQ4EFgQULek+WVyK dJk3JIHoI4iVi0FPtdwwHwYDVR0jBBgwFoAULek+WVyKdJk3JIHoI4iVi0FPtdww DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAkignESZcgr4dBmVZqDwh YsrKeWSkj+5p9eW5hCHJ5Eg2X8oGTgItuLaLfyFWPS3MYWWMzggxgKMOQM+9o3+k oH5sUmraNzI3TmAtkqd/8isXzBUV661BbSV0obAgF/ul5v3Tl5uBbCXObC+NUikM O0C3fDmmeK799AM/hP5CTDehNaFXABGoVRMSlGYe8hZqap/Jm6AaKThV4g6n4F7M u5wYtI9YDMsxeVW6OP9ZfvpGZW/n/88MSFjMlBjFfFsorfRd6P5WADhdfA6CBECG LP83r7/MhqO06EOpsv4n2CJ3yoyqIr1L1+6C7Erl2em/jfOb/24y63dj/ATytt2H 6g== -----END CERTIFICATE----- </code>
拷贝该输出到粘贴板,并且连接到客户机。
在客户机上,创建证书目录:
<code>sudo mkdir /usr/local/share/ca-certificates/docker-dev-cert </code>
打开证书文件以备编辑:
<code>nano /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt </code>
粘贴证书内容[已在粘贴板上,译者注]。
通过查看给文件来验证证书已保存到客户机上:
<code>cat /usr/local/share/ca-certificates/docker-dev-cert/devdockerCA.crt </code>
如果一切顺利的话,你会看到和之前一样的输出文本:
<code>-----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJANiXy7fHSPrmMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV ... ... LP83r7/MhqO06EOpsv4n2CJ3yoyqIr1L1+6C7Erl2em/jfOb/24y63dj/ATytt2H 6g== -----END CERTIFICATE----- </code>
现在,更新证书:
<code>sudo update-ca-certificates </code>
会得到形如下文的输出(主要这里的”1 added”)
<code>Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d....done. </code>
如果你到现在还没有安装docker
在这台客户机上的,马上安装吧。
在Ubuntu
的大多数版本中,你仅需下面这几个命令就能够快速安装最新版的docker
。如果你的是其他的发布或者遇到了一些难题,那么你可以查看docker
安装指南,以寻其他出路。
添加仓库秘钥:
<code>sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9; </code>
创建一个文件来罗列docker
仓库:
<code>sudo nano /etc/apt/sources.list.d/docker.list </code>
将以下内容添加到该文件中:
<code>deb https://get.docker.io/ubuntu docker main </code>
更新包列表:
<code>sudo apt-get update </code>
安装docker
:
<code>sudo apt-get install -y --force-yes lxc-docker </code>
为了使docker
能更快的工作起来,将当前用户加入到docker
组中,并且重开一个新的命令行模式:
<code>sudo gpasswd -a ${USER} docker sudo su -l $USER #(必要时需键入密码) </code>
重启docker
以确保其重新载入系统的CA
证书。
<code>sudo service docker restart </code>
此时,你应当能够从该客户机登陆docker registry
服务器:
<code>docker login https://YOUR-HOSTNAME:8080 </code>
注意,此时应当使用https://
以及端口8080
。输入先前设置的用户名和密码(邮件地址可随意输入)。这时,你应当看到Login Succeeded
的成功登陆消息。
此时,docker registry
以构建并运行起来。让我们来做个测试的镜像推送到registry
上。
第七步——发布到docker registry
上
在客户机上,创建一个小的、空的镜像,然后推送到registry
上。
<code>docker run -t -i ubuntu /bin/bash </code>
在完成下载之后,你就进入docker
命令行模式。对该文件系统做一些小的改变:
<code>touch /SUCCESS </code>
从docker
容器中退出:
<code>exit </code>
将所做的更改提交:
<code>docker commit $(docker ps -lq) test-image </code>
如果此时执行docker images
命令,你会在镜像列表里,看到已经拥有了一个新的test-image
镜像。
<code># docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test-image latest 1f3ce8008165 9 seconds ago 192.7 MB ubuntu trusty ba5877dc9bec 11 days ago 192.7 MB </code>
此时,该镜像只存在于本地。那么我们将其推送到新建的registry
上。
首先,从docker
登陆registry
。注意,你要用https://
以及8080
端口:
<code>docker login https://<YOUR-DOMAIN>:8080 </code>
输入已设置的用户名和密码:
<code>Username: USERNAME Password: PASSWORD Email: Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it. </code>
docker
有一个非同寻常的机制来明确将镜像推送的哪里的registry
。必须将镜像打上私有registry
路径标签才能实现将其推送上去。那么我们将该镜像打上我们私有registry
的标签:
<code>docker tag test-image YOUR-DOMAIN:8080/test-image </code>
注意,先给出镜像的本地名称,然后给出想要将其打成的标签。该标签上不包含https://
,仅有域名,端口和镜像名字。
现在可以将镜像推送到registry
上了。此时,仅使用标签名:
<code>docker push <YOUR-DOMAIN>:8080/test-image </code>
该过程会花费一些时间将镜像上传到registry
上。你也会看到包含Image successfully pushed
输出消息。
第八步——从docker registry
拉去镜像
为了确保一切运行正常,让我们回到初始的服务器上(安装docker regsitry
的机器上),将从客户机推送上来的镜像拉去下来。你也可以从第三方的服务器上来测试这一步。
如果在即将测试拉去的服务器上还没有安装docker
,回到第六步去参看安装说明(如果是第三方的服务器,那么参看SSL
说明一节)。
使用之前创建的用户名和密码登陆:
<code>docker login https://<YOUR-DOMAIN>:8080 </code>
现在来拉去镜像。仅需要使用打标签的镜像的名字,包括域名,端口号以及镜像名(而没有https://
):
<code>docker pull <YOUR-DOMAIN>:8080/test-image </code>
docker
会执行一些下载任务并回退会命令行模式。如果你在这个新的机器上运行该镜像的话,你会看到之前创建的SUCCESS
文件:
<code>docker run -t -i <YOUR-DOMAIN>:8080/test-image /bin/bash </code>
罗列文件:
<code>ls </code>
你会看到我们之前创建的SUCCESS
文件:
<code>SUCCESS bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var </code>
恭喜你!你已经使用私有的docker registry
实现了推送和拉去镜像。Happy Docker-ing!
!
以上就介绍了如何在Ubuntu14.04上搭建私有docker registry,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。