2023年7月26日发(作者:)
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-engine2、安装dockeryum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo /linux/centos/3、配置镜像下载加速vi /etc/docker/输⼊以下内容:{ "registry-mirrors": [""]}docker安装后默认没有这个配置⽂件,需要进⾏⼿动创建。配置⽂件的默认路径:/etc/docker/该⽂件作为 Docker Engine 的配置管理⽂件, ⾥⾯⼏乎涵盖了所有 docker 命令⾏启动可以配置的参数。更多配置可参考官⽅⽂档说明: 4、启动dockersystemctl start docker5、下载、运⾏私服镜像: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.042、将镜像标记为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你需要在配置⽂件中配置:--insecure-registry如下:{ "insecure-registries": ["ip:port"], "registry-mirrors": [""]}4、删除本地镜像docker image remove ubuntu:16.04 或docker rmi ubuntu:16.04docker image remove localhost:5000/myfirstimage5、再从本地私服拉下来dockder imagesdocker pull localhost:5000/myfirstimage6、访问私服地址可以看到我们刚才推送的镜像
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.04docker image tag ubuntu:16.04 localhost:5000/myfirstimagedocker push localhost:5000/myfirstimagecd /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、申请个⼈或公司域名,笔者已经在腾讯云申请好了域名这个很多⼈都会觉得⿇烦,还要花钱去买个域名?哎不学了,放弃了。笔者这⾥给你打个⽓,域名不贵,⼀年才⼏⼗块钱。去万⽹或腾讯云买个吧,其它地⽅说不定还⽤得上,如果确实不想买也没关系,就直接跳过这章,不会影响后⾯的学习哈。2、解析⼀个⼆级域名()到node2的ip上我们私服是部署到虚拟化的节点2(node2)上的3、在本地电脑ping 测试是否解析成功4、申请ssl证书,笔者这⾥选择免费ssl证书,有效期⼀年阿⾥云或腾讯云申请免费ssl证书,具体⽅式可⾃⾏查阅⽹络资料,该⽂档是针对docker的,其它知识避免过多讲解,知识是讲不完的,我们要抓重点。5、下载申请通过的证书⽂件 (分别后缀为.key和.crt两个⽂件)笔者⽂件名为:1__ 和 2_6、开通node2 443端⼝防⽕墙7、创建⽬录mkdir -p /opt/etc/docker/registry/ssl/cert8、将.key和.crt两个⽂件上传到 /opt/etc/docker/registry/ssl/cert⽬录下⽂件上传下载可以使⽤lrzsz yum install lrzsz9、停⽌运⾏中的注册表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__ -e REGISTRY_HTTP_TLS_KEY=/certs/2_ -p 443:443 registry:2另外说明下,当同⼀台服务器安装多个应⽤且端⼝发⽣冲突时,可以通过nginx代理到registry。有兴趣的读者可⾃⾏查阅⽹络资料。
11、查看镜像列表能够看到我们之前上传的镜像就证明SSL配置成功了
12、测试使⽤域名进⾏上传镜像到私服docker pull hello-worlddocker imagesdocker tag hello-world /hello-world:1.0docker imagesdocker push /hello-world:1.0 上⾯演⽰完了配置SSL的过程,下⾯我们继续配置密码,步骤如下:13、创建⽬录mkdir -p /opt/etc/docker/registry/auth14、通过docker⾃带的htpasswd⼯具⽣成⽤户名为:lazy密码:123456⽂件docker run --rm --entrypoint htpasswd registry:2 -Bbn lazy 123456 > /opt/etc/docker/registry/auth/htpasswd15、停⽌私服docker stop registry16、重启docker registrydocker run -d --rm --name registry -v /opt/etc/docker/registry/ssl/certs/:/certs -v /var/docker/registry:/var/lib/registry -v /opt/etc/docker/registry/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/1__ -e REGISTRY_HTTP_TLS_KEY=/certs/2_ -p 443:443 registry:217、验证密码有效性docker tag hello-world /hello-world:1.1docker push /hello-world:1.1
咋整,现在连基本的push都失败了,没关系,我们下⾯通过命令⾏进⾏登录,其实这才是我们要的效果,安全性得到了保证。18、登录私服docker login er push /hello-world:1.1 19、登出私服有登录⾃然有登出,命令如下:docker logout 20、补充说明:github上还提供了配置⽂件起步配置:假定你的配置⽂件为/opt/etc/docker/,配置完成后我们只需要这样启动容器就⾏了:docker run -d -p 5000:5000 --name registry
-v /opt/etc/docker/:/etc/docker/registry/ registry:2另外,我们这⾥⽤到了-v -e -p这些选项命令,这⾥暂时简单讲解下含义:-v :将容器某个⽬录或⽂件绑定/映射到宿主机某个⽬录或⽂件上-v /opt/etc/docker/registry/ssl/certs/:/certs代表将容器的/certs⽬录绑定到宿主机的/opt/etc/docker/registry/ssl/certs这个⽬录,从Docker 17.06开始,(这⾥提⼀下,本篇教程是基于docker18.09版本的)。对于数据绑定或挂载⼤部分使⽤--mount⽅式,更加灵活,关于docker数据管理后⾯会有专门的章节来讲解。-e: 通⽤配置项⼀般都⽤-e,⼤致意思是配置某个变量为什么值,给到docker本⾝程序使⽤-p:将容器内的某个端⼝绑定到宿主机某个端⼝。这⾥涉及到docker⽹络相关的知识,笔者在后⾯章节会单独提取出来讲解,这⾥提前跟读者打个招呼,⽹络这⼀块对于学习docker来说⾄关重要。-d:以守护进程⽅式在后台运⾏,相反前台运⾏命令为: -t -i--rm:容器退出时,删除容器,如果容器⽐较稳定,建议不加--rm,下次直接docker start 容器ID/容器名称即可,⽅便很多。21、告⼀段落OK,⾄此,私服安全性已经得到正常的保障,接下来我们还要继续完善私服,想要搭好⼀个安全且好⽤的私服,真可谓千⾥迢迢啊,没办法,谁让咱们⽤的是社区版的呢,企业版的docker私服就没那么多⿇烦事了,不过⿇烦也好,可以多学习动⼿能⼒和解决问题的耐⼼,不但省钱还能学习东西,哈哈。
docker私服ui玩docker⽆⾮就是知道⼤概原理,懂得敲命令,命令如下:1、下载镜像docker pull hyper/docker-registry-web1、启动私服启动ui容器之前需要先启动实际的私服,按上⾯启动命令启动私服:docker run -d --rm --name registry -v /opt/etc/docker/registry/ssl/certs/:/certs -v /var/docker/registry:/var/lib/registry -v /opt/etc/docker/registry/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/1__ -e REGISTRY_HTTP_TLS_KEY=/certs/2_ -p 443:443 registry:22、启动uidocker run -d -p 8080:8080 --rm --name registry-web -e REGISTRY_URL=/v2 -e REGISTRY_NAME=localhost:5000 -e REGISTRY_TRUST_ANY_SSL=true -e REGISTRY_BASIC_AUTH="bGF6eToxMjM0NTY=" hyper/docker-registry-web这⾥着重讲解下下⾯两个配置含义:-e REGISTRY_TRUST_ANY_SSL=true : 注册表使⽤了可信任的任何ssl证书-e REGISTRY_BASIC_AUTH="bGF6eToxMjM0NTY=" :⽤户名:密码经过base64编码后的值,这⾥笔者直接从浏览器登录私服后的请求报⽂header auth baisc中复制过来
OK, 我们终于有个简单的ui界⾯可以看到我们的镜像列表了。但是,还不够,因为这个ui界⾯只能查看,当然对应这个不⽤登录直接就可以进去的web ui来说,只能查询可以保证镜像的安全,但是有时候我们⾃⼰想通过ui删除镜像时就显得⼒不从⼼了,所以,接下来我们继续完善这个ui,使之⽀持删除功能,但可以想象,⽀持删除功能的ui⼀定是需要登录密码的。我们这⾥将兑现上⾯对读者的承诺,使⽤配置⽂件进⾏配置,⽽不是使⽤命令⾏。但是笔者不会给出每⼀项配置的含义,请读者⾃⾏翻阅官⽅⽂档:话不多说,步骤如下:1、创建注册表配置⽂件/opt/etc/docker/registry/conf/,内容如下: version: 0.1storage: filesystem: rootdirectory: /var/lib/registry
http: addr: 0.0.0.0:443 tls: certificate: /certs/1__ key: /certs/2_
auth: token: realm: :8080/api/auth service: issuer: lazy rootcertbundle: /etc/docker/registry/g: level: info上⾯配置需要注意的是我们将注册表从密码htpasswd⽅式转为token鉴权auth的⽅式,这种⽅式更适合应⽤之间的安全访问控制。auth和htpasswd只能使⽤其中⼀种。2、重启启动私服docker stop registrydocker run -d --rm --name registry-srv -v /opt/etc/docker/registry/ssl/certs/:/certs -v /opt/etc/docker/registry/conf/:/etc/docker/registry/:ro -v /var/docker/registry:/var/lib/registry -v /opt/etc/docker/registry/ssl/certs/1__:/etc/docker/registry/:ro -p 443:443 registry:2
注意了,这⾥有坑,就是容器名称不能为registry,随便改⼀个,这⾥笔者改为registry-srv。这是个很细节的坑,务必注意。3、创建注册表ui配置⽂件/opt/etc/docker/registry/conf/,内容如下:registry:url: /v2
name: readonly: false trust_any_ssl: true
auth: enabled: true issuer: 'lazy' key: /conf/ log: level: info4、重启注册表uidocker stop registry-webdocker run -d -p 8080:8080 --rm --name registry-web -v /opt/etc/docker/registry/conf/:/conf/:ro -v /var/docker/registry-web:/data -v /opt/etc/docker/registry/ssl/certs/2_:/conf/:ro hyper/docker-registry-web
输⼊admin admin登录进去后,可以查看到我们之前推送上去的镜像。ui是搭起来了,后⾯教下⼤家怎么⽤。1、admin账号是默认账号,该账号⾓⾊不要去操作它2、创建⼀个账号,⽐如笔者这⾥为:账号:lazy 密码:lazy3、按需分配⾓⾊给账号,笔者这⾥直接分配所有⾓⾊给账号lazy4、登出admin账号,登⼊lazy账号测试是否可以登录5、回到节点2服务器执⾏如下命令:docker imagesdocker tag hello-world /hello-world:1.2docker push /hello-world:1.2提⽰没有权限,我们登录⼀下,登录⽤户名和密码是多少呢?没错,是ui创建的⽤户lazy或admin,我们知道admin没有只有后台ui_admin⾓⾊,这个⾓⾊是不能push的,因为我们没有分配对应权限的⾓⾊给admin,当然我们可以分配权限给admin但强烈不建议这么做。我们先⽤admin登录然后push,看是否跟我们预期⼀样,没有推送权限。可以看到admin是没有push权限的,现在我们登出admin,然后再登录lazy,再push OK,⾄此,我们完成了docke私服接近⽣产级的搭建,是否有感受到笔者前⾯说的繁杂了吗?当然还可以继续完善,⽐如通过命令docker create network xxx⾃定义⽹络、通过swarm集群⽅式部署、通过docker-compose在单个服务器或集群中批量部署所有相关的服务等等。这些知识后⾯笔者会将⼀⼀讲解。不过,⽬前的部署⽅式已经基本满⾜⽣产级部署。想要深⼊学好任何⼀门技术,都是这样,任重⽽道远。当然也有很多技术⼈是蜻蜓点⽔,通过某些博客直接复制跑起来就完事,这种⽅式适合⼊门时的快速体验,不能做到熟练使⽤。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690377457a340399.html
评论列表(0条)