本地部署docker
最近,我正在研究为Fabric8开发环境 下载的Docker层缓存,以允许我丢弃运行Docker守护程序的vm,并避免每次重新创建vm时都重新下载基本映像。
像往常一样,我尝试首先打谷歌,并指出了以下几页:
和
因为我经常使用Jerome Petazzoni的方法来处理透明的Squid + iptables
以缓存和嗅探简单的HTTP流量(通常是从Java程序调用HTTP),所以我发现第一个基于解决方案的方法很有意义,因此我首先尝试了这种方法。
原来, 第二个链接是我所寻找的 ; 但是我仍然花了一些良好的学习时间,从第一个开始就不再提出建议,学习了Squid在Docker Hub所使用的Amazon Cloudfront CDN上表现不佳的艰难方式。 但是我不得不承认这很有趣 。
现在,我知道了如何将调用转发到Squid来命中一个中间拦截器,该拦截器与查询参数,标头和其他所有内容混杂在一起。
我找不到适用于Cloudfront的有效组合,但是现在我大概可以复制臭名昭著的Cats Proxy Prank 。 =)
不管怎么说,正如我所说的,我真正想要的是第二个链接,该链接向您展示如何设置中间Docker代理,您的Docker守护进程将尝试打中默认默认的Docker Hub公共服务器。
我几乎需要的所有内容都在该页面中,但是我发现该信息比所需的信息更加神秘 。 这样做的主要原因是因为该示例假定我需要安全性(TLS),但由于代理完全是本地的,所以这并不是我的情况 。 此外,它还展示了如何使用YAML configuration来配置Docker Registry。 同样,它并不是很复杂,但是确实超出了需要。 是的,因为您真正需要启动最简单的本地(非安全)Docker代理的是此oneliner :
docker run -p 5000:5000 -d --restart=always --name registry \
-e REGISTRY_PROXY_REMOTEURL=http://registry-1.docker.io \
registry:2
此处有趣的部分是registry
映像,它支持一种聪明的替代方式将配置转发给它 ,从而使您免于向其传递YAML配置文件。 这里描述的想法是,如果您遵循环境变量的命名约定,该约定反映了YAML树的层次结构,则可以执行以下操作:
...
proxy:
remoteurl: http://registry-1.docker.io
...
您应该在.yaml
文件中编写并以这种方式传递给进程:
docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/config.yml:/etc/docker/registry/config.yml \
registry:2
进入更加方便的位置-e REGISTRY_PROXY_REMOTEURL=http://registry-1.docker.io
运行时环境变量! 让我们对示例进行一些改进,以便我们还为Docker代理传递一个用于缓存层的非易失性存储位置 ,以便在调用之间不会丢失它们:
docker run -p 5000:5000 -d --restart=always --name registry \
-e REGISTRY_PROXY_REMOTEURL=http://registry-1.docker.io \
-v /opt/shared/docker_registry_cache:/var/lib/registry \
registry:2
现在,每当我们需要获取已经通过本地代理传递的某些Docker映像时,我们就拥有了节省大量带宽所需的一切。 剩下的唯一事情是告诉我们的Docker守护程序要注意新的代理 :
# update your docker daemon config, according to your distro
# content of my `/etc/sysconfig/docker` in Fedora 23
OPTIONS=" --registry-mirror=http://localhost:5000"
重新加载(或重新启动)您的Docker守护程序,您就完成了! 请注意,如果您在单个节点上工作,那么如果重新启动守护程序,则可能还需要重新启动注册表容器。
一个有趣的发现,它一直在学习Docker守护程序如果找不到指定的registry-mirror
则不会中断 。 因此,您可以添加配置,而不必理会它,因为您知道与Docker Hub的交互只会在缓存代理处于运行状态时才可能受益于您的缓存代理。
您可以看到它与以下测试一起使用:
docker logs -f registry
将记录所有传出的下载请求 ,并且构成单个pull image
操作的一组requrest将完成后,您还可以通过以下调用来检查代理现在是否已完全提供映像:
curl http://localhost:5000/v2/_catalog
# sample output
{"repositories":["drifting/true"]}
这篇文章将结束,但是由于我很难显示如何禁用Internet上的安全性 ,因此这是一个非常简短且经过全面测试的示例,说明了如何在启用TLS的情况下实现相同功能 :
# generate a self signed certificate; accept default for every value a part from Common Name where you have to put your box hostname
mkdir -p certs && openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
# copy to the locally trusted ones, steps for Fedora/Centos/RHEL
sudo cp certs/domain.crt /etc/pki/ca-trust/source/anchors/
# load the newly added certificate
sudo update-ca-trust enable
# run the registy using those keys that you have generated, mounting the files inside the container
docker run -p 5000:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
registry:2
# now you just need to remember that you are working in https, so you need to use that protocol in your docker daemon configuration, instead of plain http; also use that when you interact with the API in curl
翻译自: https://www.javacodegeeks.com/2016/04/deploy-configure-local-docker-caching-proxy.html
本地部署docker