版权声明:
本文为博主原创文章,未经博主允许不得转载。关注公众号技术汇(ID: jishuhui_2015) 可联系到作者。
〇、前言
Build, Ship and Run any App, Anywhere
关于Docker更多的概念将不在本文赘述了,作为虚拟化市场的一颗冉冉升起的新星,Docker得到了越来越多企业的青睐,越来越多的开发者决定拥入Docker的怀抱。
“集装箱”是Docker设计哲学之所在,它让一台物理机(或者虚拟机)同时运行多个彼此隔离的应用变得更为轻松简单,当然这一切还是多亏Linux的相关底层技术,当然,也包括OS X,Windows这两个操作系统。
Docker的相关教程已经够多了,但是由于Docker近年来发展迅猛,版本迭代速度较快,多个版本之间还存在不兼容的情况,如果在网上找博客文章,未必能解决自己遇到的问题。
当然,对于Docker的环境安装,基础命令之类的内容,是完全没有问题的,通读官网文档内容基本都能顺利掌握。然而,当笔者尝试着搭建一套基于SSL的Docker Registry(官网推荐的做法)却遇到了不少的麻烦,对于这部分内容,大多数博客文档内容都是直接跳过了SSL的环节,采用了HTTP的访问形式。
特此分享,通读完了此篇文章后,对于搭建Docker Registry就不再是问题了。
> docker --version
Docker version 18.03.1-ce, build 9ee9f40
以上是我的Docker环境,建议安装Docker1.6+以上版本。
除此之外,读者还需要:
1、一台安装了CentOS_7_64bit操作系统的主机(或者虚拟机);
2、ドメイン名に適用されます。そうしないと、HOSTファイルを変更することができますが、成功を保証するものではありません。著者アリクラウドは5年間を含め、個人のドメイン名に適用され、¥105。
3理由は、HTTPSアクセスを達成するために必要で、SSL証明書は、あまりにも、必見です、ドメイン名のCA証明書を取得するための無料の方法を適用した場合、アリクラウド上の無料の証明書要求を持っています。そうでなければ、あなたは成功を保証するものではありません、ボーエンは述べたたくさんの練習である、自分自身を生成するためにOpenSSLを使用することができます。
図4は、次いで随意、nginxのエージェントにロードされました。
5、基本的な概念と共通のコマンドに精通しドッカーが、そうで高次の知識Dockerfile、作曲、スウォーム、Kubernetesとを理解していません。
まず、ミラーがドッカーから言えば
抽象的な概念は、私たちが感じるように私は、2つの例を与える、と言ってあまりを精緻化:
1は、我々は、ベース・オペレーティング・システムに加えて、自宅からISOファイルシステムをダウンロードし、そしておそらく内蔵のプリインストールソフトウェアの数する必要があります。
2、Mavenのジャーを使用する場合は、プロキシ倉庫を行うためにネクサスを使用して、中央リポジトリから依存関係を引っ張って各時間を回避するために、パッケージの依存関係を管理します。
それは、ソフトウェアドッカーイメージ(ファイル)のシリーズの組み合わせである、と考えることができる限り、彼らは、適切なホスト上にあるように、箱の外に行うことができます。
この記事では、5つの一般的に使用されるコマンドがある、ドッカーミラーリングについて必要です。
、ミラーを引っ張っバージョンを指定したい場合は、あなたがタグをもたらすことができ、ミラーの倉庫は名前が続き、。
> docker pull <repo>[:tag]
Bは、すべてのミラーをリスト、ミラーは、基本的な情報を得ることができます。
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest bfcb1f6df2db 3 weeks ago 107MB
registry 2 d1fd7d86a825 4 months ago 33.3MB
hyper/docker-registry-web latest 0db5683824d8 19 months ago 599MB
C、ミラーを削除します。これは、ミラーのID、名前やイメージリポジトリとして削除することができます。
> docker rmi <IMAGE ID>/<repo>
D、ミラーマーキング。この操作は、Gitのマーキング類推、ミラーリングされたバージョンを入手できる同等のリリースを行うことができます。
> docker tag <repo> <new_repo>[:tag]
E、ミラープッシュ。Gitが操作のフィールドを押して学ぶことができ、同じ、パッケージ化画像(すなわちドッカーレジストリ)リモートリポジトリにプッシュ。
> docker push <new_repo>[:tag]
概要のみ以上の5つのコマンドは、この記事の焦点ではありません。コマンドをミラーリングより、あなたは自分自身でそれにアクセスすることができます。
进行接下来的操作之前,请读者先将registry镜像pull下来。
> docker pull registry:2
2: Pulling from library/registry
81033e7c1d6a: Pull complete
b235084c2315: Pull complete
c692f3a6894b: Pull complete
ba2177f3a70e: Pull complete
a8d793620947: Pull complete
Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
Status: Downloaded newer image for registry:2
此过程会持续几分钟,视网络状况而定,请读者耐心等候。
注意:笔者在pull的时候,指定了TAG,即为使用v2版本的registry,对于v1版本的registry,读者大可不必在意了,基本上是淘汰了。
二、先睹为快
对于急切想看一下Docker Registry运行效果的读者,可以先阅读本节内容。
运行如下命令即可:
> docker run -d \
-p 5000:5000 \
-v /usr/local/registry:/var/lib/registry \
--restart=always \
--name registry \
registry:2
这是一条典型的run命令,不出意外的话,Registry就在5000端口启动了。
为了验证,读者可以拉取一个busybox镜像(因为体积小),进行实验。
> docker pull busybox
拉取最新的busybox镜像后,再给其打标,准备发布到Registry中。
> docker tag busybox localhost:5000/bosybox:v1.0
最后再推送给Registry。
> docker push localhost:5000/bosybox:v1.0
此时,Registry就有了busybox:v1.0镜像了,这时可以不用再去Docker Hub上面拉取了,通过自建的Registry即可。
> docker pull localhost:5000/bosybox:v1.0
如果想查看远程仓库有哪些镜像,可以运行如下命令:
> curl http://localhost:5000/v2/_catalog
窥一斑而见全豹,通过以上命令,我们能得出一个重要的结论:
对Registry的访问都是通过一系列REST API完成的。
到此为止,我们已经搭建了一个Docker Registry的“半成品”,说是“半成品”是因为这个Registry只能在本机正常工作,如果在其他主机上试图推送镜像上来,结果是失败的。
如果要做到externally-accessible,就必须使用CA安全证书。
三、基于SSL证书改造Registry
在进行本节的操作前,请读者确认是否满足了文章开头所列的条件。
笔者申请了一个域名:iwendao.vip,并映射出来了一个二级域名:registry.iwendao.vip,专门用来作为Docker Registry的访问,然后基于此二级域名申请CA证书。
不出意外的话,从阿里云申请的免费证书都是由Symantec颁发的,将证书下载下来后,压缩包内有两份文件:xxxxxx.pem、xxxxxx.key。
/ usr / local / certsの:それはそれがディレクトリに格納されていると仮定すると、FTPツールを介してホストにアップロードし、server.pem、server.keyのに社名を変更しました。
> ll /usr/local/certs
- rw-r--r-- 1 root root 1678 May 28 13:42 server.key
- rw-r--r-- 1 root root 3662 May 28 13:42 server.pem
問題は、中間証明書ですので、あなたが取得するには、次のコマンドを使用することができ、何のCRTファイルを見つけることになります。
> cat server.pem > server.crt
直接コンテンツファイル入力ファイルとしてのPEM CRTファイルには、をserver.crtを生成しました。
この時点で、ドメイン名と証明書が準備ができています。
あなたはnginxのプロキシを使用したい場合は、nginx.confファイルを変更する必要があり、以下では、構成要素の著者であります:
user root root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 60;
gzip on;
server {
listen 443;
server_name i-wendao;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /usr/local/certs/server.pem;
ssl_certificate_key /usr/local/certs/server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location ~ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass https://registry;
}
}
upstream registry {
server 127.0.0.1:5000;
}
}
設定ファイルのNginx.confは、次の2つの場所に注意を払う必要があります。
1、PEMおよびキーの前に、nginxののSSLを開き、ダウンロードしたファイルは、唯一のプロのテスト効果的な、公式によって与えられたアリの雲の一例である、構成する必要があります。
図2に示すように、レジストリへのアクセスがREST APIを介して行うだけでなく、HTTPSプロトコル、構成場所ノード、proxy_pass構成でアクセスされているため、HTTPS://レジストリ、構成されている場合HTTP://レジストリ、ドッカー一度にレジストリ有効なSSLた後、アクセスは真実ではありません。
ホストの構成は、ドッカーコンテナの次の設定を完了しています。
ドッカーレジストリServerの展開については、公式には二つの方法を与えました:
まず、いくつかのパラメータの場合は、ドッキングウィンドウrunコマンドで直接指定することができます。
YAMLによって別の設定ファイルは、一度に複数のパラメータを設定することができます。
このセクションでは、著者が展開最初に使用する、エンドアタッチメントの配置は、第2の実施形態のテキストに見出すことができます。
> docker run -d \
-p 5000:5000 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
--restart=always \
--name registry \
registry:2
あなたはnginxのリーダーをインストールしていない場合、このコマンドを実行することができます。
> docker run -d \
-p 443:443 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
--restart=always \
--name registry \
registry:2
あなたは、CRTにキーを2つの証明書ファイルを使用する場合ドッカーレジストリサーバーがSSLを有効にするために、見ることができます。
次に、我々は少し実験します。
> docker tag busybox registry.iwendao.vip/bosybox:v1.0
最後に、レジストリにプッシュ。
> docker push registry.iwendao.vip/bosybox:v1.0
ミラーリモートリポジトリを表示します。
> curl https://registry.iwendao.vip/v2/_catalog
別のホストでは、上記の手順を繰り返し、まだ説明が正常に設定されている、成功することができます。
四、認証祝福
レジストリサーバー上で構築することによって、我々は、セキュリティ制御のために、ドッカーをはっきりと感じることができ、ネットワーク全体のHTTPSの文脈でちょうどタイムリーなアプローチであり、十分な注意を持っています。
プラスのログイン検証メカニズム - このセクションでは、ドッカーのより徹底的なセキュリティを目的とした高度な知識です。
それはPWであるため、明らかに、それは誰もが唯一の仕事のためのログインユーザとパスワードのおかげでミラーリング提出することができることを意味します。
もちろん、ログイン検証メカニズムのHTTPSプロトコルが存在することを、そうでない場合は、ユーザー名とパスワードが平文で送信されます。
ドッカー認証メカニズムも達成するためにたくさん持っている、あなたはレジストリの直前に検証傍受する(例えばnginxのような)プロキシを使用することができ、達成することは困難で、ログオンするために許可されたユーザをガイドするためにいくつかのハイエンドトークンサーバがあります。
本論文では、最も簡単なのhtpasswdログイン検証メカニズムを達成しました。htpasswdの導入についての詳細はこの記事で、読者自身の検査の範囲ではありません。
このコマンドツールがホストにインストールされていない場合は、次のコマンドを実行できます。
> yum install httpd-tools
Apache2のは、このコマンドがインストールされるようになっている場合のApache2をhtpasswdは、子会社ツールコマンドであるため、使用することができます。
読者は、インストールしたくない、と直接レジストリミラー、内蔵のHTTPDを使用することができます。
パスワードファイルが/ usr / localに/認証ディレクトリに格納されていると仮定すると、次のコマンドを実行します。
> htpasswd -Bbn admin 123456 > /usr/local/auth/passwd
以下のように、構築されたのhttpdレジストリをミラーリング:
> docker run --entrypoint htpasswd registry:2 -Bbn admin 123456 > /usr/local/auth/passwd
二つの方法は、同じ目的を達成するために:は/ usr / local /認証/ passwdファイルにユーザー名とパスワードを生成します。
コマンド管理者のユーザー名、123456はパスワードです。
ビューpasswdファイルの内容:
> cat /usr/local/auth/passwd
admin:$2y$05$/2H8DTcY.1JROHm0MnnK8.UulmbSclib63qTe8FGyWnnE9XWBz3cy
同じオーダーであるが、異なるホストでは、生成された結果と同じではありません。このため、ホストA上の生成されたパスワード・ファイルは、ホストB上の認証に使用することはできません
次のステップは、レジストリのコンテナを開始することです:
> docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /usr/local/auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/passwd \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
registry:2
あなたがしようとした場合、以下のように正常に起動した後、直接、どのプロンプト認定しませんリモートリポジトリのミラーを表示するには:
> curl https://registry.iwendao.vip/v2/_catalog
{
"errors": [{
"code": "UNAUTHORIZED",
"message": "authentication required",
"detail": [{
"Type": "registry",
"Class": "",
"Name": "catalog",
"Action": "*"
}]
}]
}
プルを含め、プッシュ操作もによって制限されています。あなたが前にそのため、あなたは、ログインする必要があります。
> docker login https://registry.iwendao.vip
そこにログインするので、もちろん、に掲載されています。
> docker logout https://registry.iwendao.vip
レジストリのための五、WEBのUI
当我们把Registry Server搭建好了之后,就意味着要开始管理我们的镜像了。这个时候会发现,并没有一个可视化的工具帮助用户进行镜像管理。
目前已经有很多开源的WEB UI管理工具:
1、docker-registry-frontend。截止到目前(2018年5月),其功能主要是镜像列表查看,标签查看,还未开放镜像删除功能,在GitHub上开源,stars 1k+。
2、docker-registry-web。相比docker-registry-frontend项目,此项目提供了镜像删除功能,还接入了角色系统,功能有了进一步完善,在GitHub上开源,stars 300+。
3、Rancher。这个平台的定位类似Kubernetes,不仅仅是镜像管理这么简单了,对于整个Docker容器管理都是能胜任的。
4、shipyard。很可惜,作者已经没有精力维护了,从GitHub上的stars,不难看出其昔日的辉煌。
关于WEB UI的安装部署就不再赘述了,都有其对应的文档。如果对于镜像管理没有什么特别要求,可以不用WEB UI,或者使用前两个之一。
六、总结
本文详述了Docker Registry私服搭建的过程,总结了来自各类博客,官网的学习资料,帮助读者顺利搭建Docker Registry私服。
附:
1、使用yaml文件启动registry server
假设配置文件的存放路径是:/usr/local/registry/config.yml
编辑其内容,如下:
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
maxthreads: 100
delete:
enabled: true
http:
addr: 0.0.0.0:5000
host: https://registry.iwendao.vip
secret: yoogurt-taxi-123!@#
headers:
X-Content-Type-Options: [nosniff]
tls:
certificate: /certs/214709594090104.crt
key: /certs/214709594090104.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
更多配置项,可以访问Configuring a registry。
配置文件中的配置项是可以对应到前文中-e参数的环境变量,其规则就是:
1、变量名由大写字母组成;
2、前缀固定加上REGISTRY;
3、将YAML中的配置项的冒号(:)变成了下划线(_)。
比如:
REGISTRY_HTTP_TLS_CERTIFICATE,对应的是http: tls: certificate配置项;
REGISTRY_AUTH_HTPASSWD_PATH,对应的是auth: htpasswd: path配置项。
值得注意的是,配置文件中所涉及的路径都是针对容器内的,这就意味着,在启动registry镜像的时候,需要通过-v参数指定挂载目录。
保存配置文件后,即可启动容器:
> docker run -d -p 5000:5000 --restart=always --name registry \
-v /usr/local/certs:/certs
-v /usr/local/registry/config.yml:/etc/docker/registry/config.yml \
registry:2
2、介绍关于Docker的书籍
- 《第一本Docker书(修订版)》,当之无愧的Docker启蒙书。零基础入门者可以着重看前五章基础部分,掌握Docker的相关原理及其使用,可用作工具书。读此书,建议跟着内容同步进行实践,入门以后,能够建立起对Docker的兴趣,以便持续学习下去。
- 《Docker 容器与容器云(第2版)》,知识内容有所进阶。第一部分内容为基础知识,可以快速过一遍。本书对于容器云的概念做了各方面反复的解释,非常精彩,可以吸收之。接下来就是容器编排、部署的内容了,可以加之实践,培养感觉。
- 《Kubernetes权威指南(第2版)》,当之无愧的Kubernetes入门书籍。读完了《Docker 容器与容器云(第2版)》的Kubernetes部分,再来读此书,会轻松一些。