Docker⼊门篇-搭建docker私服(注册表)
在我们开始使⽤docker之前,我们先把私服搭建起来,这种顺序通常适⽤于⽣产级或实际⼯作的时使⽤docker的习惯。我们遵循这样的习惯。
概念
当我们执⾏docker pusll xxx的时候,默认是从docker公共仓库下载镜像到本地,当我们执⾏docker push xxx的时候,默认是推送到docker公共仓库中,docker 公共仓库地址:
在企业⽣产级运维中,⼀般不会随意把公司应⽤镜像推送到公共仓库中,所以我们需要搭建⾃⼰内部的仓库,我们本章就是讲解如何搭建⾃⼰的私服。其实笔者认为docker社区版搭建私服的过程还是蛮繁杂的,不过只要读者跟着笔者⼀步步操作,搭建⾃⼰的私服完全不在话下。话不多说,我们直接在创建的虚拟机节点2上进⾏如下步骤:
安装私服
我们选择在node2机⼦上安装docker私服。安装步骤如下:
1、卸载docker,主要是检查之前是否安装过,有安装的话把⽼的卸载掉
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装docker
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager \
--add-repo \
download.docker/linux/po
3、配置镜像下载加速
vi /etc/docker/daemon.json
输⼊以下内容:
{
"registry-mirrors": ["registry.docker-cn"]
}
docker安装后默认没有daemon.json这个配置⽂件,需要进⾏⼿动创建。配置⽂件的默认路径:/etc/docker/daemon.json
该⽂件作为 Docker Engine 的配置管理⽂件, ⾥⾯⼏乎涵盖了所有 docker 命令⾏启动可以配置的参数。
更多配置可参考官⽅⽂档说明:
4、启动docker
systemctl start docker
5、下载、运⾏私服镜像:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
--restart=always意思是只要该容器没有启动,总是尝试重启。
6、查看运⾏容器列表
docker container ls或docker ps
7、浏览器访问:
笔者这⾥为了⽅便,直接停掉防⽕墙服务:
systemctl stop firewalld
推送镜像到私服
1、拉ubuntu:16.04镜像
docker pull ubuntu:16.04
2、将镜像标记为localhost:5000/my-ubuntu。这会为现有镜像创建⼀个附加标记。当标记的的第⼀部分是主机名和端⼝时,Docker在推送时将其解释为注册表的位置。例如localhost:5000/my-ubuntu中的localhost:5000代表该镜像推送到localhost:5000私服。格式是固定的。官⽅约定俗成的。
docker images
创建新的镜像,镜像命名前缀指定了推送的私服地址
docker image tag ubuntu:16.04 localhost:5000/myfirstimage
3、将镜像推送到运⾏于的本地注册表localhost:5000:
docker push localhost:5000/myfirstimage
如果你的私服是在其它机⼦且⾮https协议的,push会报错:
http: server gave HTTP response to HTTPS client
你需要在daemon.json配置⽂件中配置:--insecure-registry如下:
{
"insecure-registries": ["ip:port"],
"registry-mirrors": ["registry.docker-cn"]
}
4、删除本地镜像
docker image remove ubuntu:16.04 或docker rmi ubuntu:16.04
docker image remove localhost:5000/myfirstimage
5、再从本地私服拉下来
dockder images
docker pull localhost:5000/myfirstimage
6、访问私服地址
ubuntu使用入门教程可以看到我们刚才推送的镜像
7、停⽌注册表。
8、删除容器
docker container rm -v registry
下⾯我们重启启动私服,并将容器内部镜像的存储路径映射到宿主机外⾯:
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /var/docker/registry:/var/lib/registry registry:2
-v 选项参数指定将容器内部路径映射到宿主机某个路径,上⾯命令我们将私服的镜像存在位置到宿主机/var/docker/registry下
测试下载镜像:
docker pull ubuntu:16.04
docker image tag ubuntu:16.04 localhost:5000/myfirstimage
docker push localhost:5000/myfirstimage
cd /var/docker/registry
就可以看到镜像被推送到该⽬录下,上⾯我们简单了解了docker私服的使⽤,搭建起了简单私服,为我们后⾯实战使⽤。
更多关于docker私服信息请查看官⽅⽂档:
docker私服安全性
不知读者是否发现,我们私服实在太不安全了,我们直接在浏览器回车就能看到所有的镜像列表,如果公司是内⽹,虽然⾄少对外是安全的,但始终对内部还是有可能会暴露我们应⽤存储的信息,如果是在AWS或阿⾥云等其他公⽹上部署,那就更加不安全了,我们开发的应⽤可能随时被外⼈发现并pull下来看个遍。对,实际上我们需要设置安全登录账号和密码,这样才稍微放⼼些,除了配置登录密码外,我们还要保证⽹络传输过程的安全,所以还要配置tls传输加密。
这⾥有个细节问题就是当我们配置好tls之后,访问的协议会从http变为https,除此之外,我们push进⾏时标签前缀以域名替代之前的localhost或ip,上⾯我们提过的配置项(insecure-registries)可以删除且不会报错。
注:tls是ssl标准的实现,两者之间意思⼤致相同。事实上我们现在⽤的都是TLS,但因为历史上习惯了SSL这个称呼平常很多开发同事还是以称呼SSL为多。后⾯笔者描述TLS或SSL时是同⼀个意思,不做区分。
话不多说,下⾯给出私服配置tls传输加密以及配置登录密码步骤:
1、申请个⼈或公司域名,笔者已经在腾讯云申请好了域名laizhiy
这个很多⼈都会觉得⿇烦,还要花钱去买个域名?哎不学了,放弃了。笔者这⾥给你打个⽓,域名不贵,⼀年才⼏⼗块钱。去万⽹或腾讯云买个吧,其它地⽅说不定还⽤得上,如果确实不想买也没关系,就直接跳过这章,不会影响后⾯的学习哈。
2、解析⼀个⼆级域名(registry.laizhiy)到node2的ip上
我们私服是部署到虚拟化的节点2(node2)上的
3、在本地电脑ping registry.laizhiy测试是否解析成功
4、申请ssl证书,笔者这⾥选择免费ssl证书,有效期⼀年
阿⾥云或腾讯云申请免费ssl证书,具体⽅式可⾃⾏查阅⽹络资料,该⽂档是针对docker的,其它知识避免过多讲解,知识是讲不完的,我们要抓重点。
5、下载申请通过的证书⽂件 (分别后缀为.key和.crt两个⽂件)
笔者⽂件名为:1_registry. 和 2_registry.laizhiy.key
6、开通node2 443端⼝防⽕墙
7、创建⽬录mkdir -p /opt/etc/docker/registry/ssl/cert
8、将.key和.crt两个⽂件上传到 /opt/etc/docker/registry/ssl/cert⽬录下
⽂件上传下载可以使⽤lrzsz  yum install lrzsz
9、停⽌运⾏中的注册表docker stop registry(这⾥假定你的容器名字为registry)
10、重新启动注册表
docker run -d --rm --name registry \
-v  /opt/etc/docker/registry/ssl/certs/:/certs \
-v /var/docker/registry:/var/lib/registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/1_registry. \
-e REGISTRY_HTTP_TLS_KEY=/certs/2_registry.laizhiy.key \
-p 443:443 registry:2
另外说明下,当同⼀台服务器安装多个应⽤且端⼝发⽣冲突时,可以通过nginx代理到registry。有兴趣的读者可⾃⾏查阅⽹络资料。
11、查看镜像列表
能够看到我们之前上传的镜像就证明SSL配置成功了
12、测试使⽤域名进⾏上传镜像到私服
docker pull hello-world
docker images
docker tag hello-world registry.laizhiy/hello-world:1.0
docker images
docker push registry.laizhiy/hello-world:1.0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。