Docker笔记-04 仓库
文章目录
- 1 DockerHub公共镜像市场
- 1.1 登录
- 1.2 基本操作
- 1.3 自动创建
- 2 第三方镜像市场
- 2.1 查看镜像
- 2.2 下载镜像
- 3 搭建本地私有仓库
- 3.1 使用registry镜像创建私高仓库
- 3.2 管理私有仓库
- 3.2.1 上传镜像到本地仓库
- 3.2.2 搜索本地仓库镜像
- 3.2.3 下载本地仓库镜像
- 3.2.4 配置非https仓库地址
- 3.3 私有仓库高级配置
- 3.3.1 准备站点证书
- 3.3.2 配置私有仓库
- 3.3.3 测试私有仓库功能
- 3.4 Nexus3
- 3.4.1 启动Nexus容器
- 3.4.2 创建仓库
- 3.4.3 添加访问权限
- 3.4.4 重启nexus服务,开放5000端口
- 3.4.5 测试
- 3.4.6 docker登录仓库
- 3.4.7 操作镜像
- 3.4.8 服务端启动方式改进,将Nexus3注册成系统服务
- 3.4.9 改nexus仓库的http为https
仓库(Repository)是集中存放镜像的地方,又分公共仓库和私有仓库。
有时候容易把仓库与注册服务器(Registry)混淆 。 实际上注册服务器是存放仓库的具体服务器,一个注册服务器上可以有多个仓库,而每个仓库下面可以有多个镜像。
从这方面来说,仓库可以被认为是一个具体的项目或目录。 例如对于仓库地址private-docker.com/ubuntu来说,private-docker.com是注册服务器地址,ubuntu是仓库名。
1 DockerHub公共镜像市场
Docker Hub是Docker官方提供的最大的公共镜像仓库,目前包括了超过100000的镜像,地址为https://hub.docker.com。 大部分对镜像的需求,都可以通过在Docker Hub中直接下载镜像来实现。
1.1 登录
可以通过命令行执行docker login命令来输入用户名、密码和邮箱来完成注册和登录。
注册成功后,本地用户目录下会自动创建.docker/config.jon文件,保存用户的认证信息。登录成功的用户可以上传个人制作的镜像到Docker Hub。
1.2 基本操作
用户无须登录即可通过docker search命令来查找官方仓库中的镜像,并利用docker [image] pull命令来将它下载到本地。
(base) pang@pang-HP:~$ sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 7191 [OK] centos/systemd systemd enabled base container. 108 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 95 kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 21 centos/mongodb-36-centos7 MongoDB NoSQL database server 8 kasmweb/core-centos-7 CentOS 7 base image for Kasm Workspaces 3 continuumio/centos5_gcc5_base 3 couchbase/centos7-systemd centos7-systemd images with additional debug… 1 [OK] spack/centos7 CentOS 7 with Spack preinstalled 1 spack/centos-stream 0 couchbase/centos-72-jenkins-core 0 fnndsc/centos-python3 Source for a slim Centos-based Python3 image… 0 [OK] couchbase/centos-72-java-sdk 0 couchbase/centos-69-sdk-nodevtoolset-build 0 couchbase/centos-70-sdk-build 0 datadog/centos-i386 0 spack/centos6 CentOS 6 with Spack preinstalled 0 starlingx/stx-centos StarlingX centos 0 ibmcom/fhe-toolkit-centos-amd64 The IBM Fully Homomorphic Encryption (FHE) T… 0 ibmcom/fhe-toolkit-centos The IBM Fully Homomorphic Encryption (FHE) T… 0 apache/couchdbci-centos Apache CouchDB CI CentOS 0 silintl/openldap OpenLDAP base image on Centos 6 0 [OK] bitnami/centos-extras-base 0 bitnami/centos-base-buildpack Centos base compilation image 0 [OK] couchbase/centos-69-sdk-build 0 (base) pang@pang-HP:~$根据是否为官方提供,可将这些镜像资源分为两类:
- 一种是类似于centos这样的基础镜像,也称为根镜像。这些镜像是由Docker公司创建、验证、支持、提供 ,这样的镜像往往使用单个单词作为名字;
- 另一种类型的镜像,比如ansible/centos7-ansible镜像,是由Docker用户ansible创建并维护的,带有用户名称为前缀,表明是某用户下的某仓库。 可以通过用户名称前缀"user_name/镜像名"来指定使用某个用户提供的镜像。
用户也可以在登录后通过docker push命令来将本地镜像推送到Docker Hub。
1.3 自动创建
2021年7月26日之后,该项功能仅限付费用户使用。
自动创建( Automated Builds)是Docker Hub提供的自动化服务,这一功能可以自动跟随项目代码的变更而重新构建镜像 。
例如,用户构建了某应用镜像,如果应用发布新版本,用户需要手动更新镜像。 而自动创建则允许用户通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建。
要配置自动创建,包括如下的步骤:
之后,可以在Docker Hub的“自动创建”页面中跟踪每次创建的状态 。
2 第三方镜像市场
国内不少云服务商都提供了Docker镜像市场包括腾讯云、网易云、阿里云等。下面以时速云为例,介绍如何使用这些市场。
2.1 查看镜像
访问https://hub.tenxcloud.com,即可看到己存在的仓库和存储的镜像,包括Ubuntu、Java、Mongo、MySQL、Nginx等热门仓库和镜像。 时速云官方仓库中的镜像会保持与DockerHub中官方镜像的同步。
以MongoDB仓库为例,其中包括了2.6、3.0和3.2等镜像。
2.2 下载镜像
下载镜像也是使用docker pull命令,但是要在镜像名称前添加注册服务器的具体地址。格式为index.tenxcloud.com/<namespace>/<repository>:<tag>。
例如,要下载Docker官方仓库中的node:latest镜像,可以使用如下命令 :
$ docker pull index.tenxcloud.com/docker_library/node:latest正常情况下,镜像下载会比直接从Docker Hub下载快得多。通过docker images命令来查看下载到本地的镜像:
$ docker images REPOSITORY TAG IMAGE ID CREATED S 工 ZEindex tenxcloud.com/docker_library/node latest e79fe5711c94 4 weeks ago 660 7 MB下载后,可以更新镜像的标签,与官方标签保持一致,方便使用:
$ docker tag index.tenxcloud.com/docker_library/node:latest node:latest除了每次在pull中填写注册地址外,也可以如第1章2.2.4节说明的,配置加速服务。
另外,除了使用这些公共镜像服务外,还可以搭建本地的私有仓库服务器,将在下一节介绍。
3 搭建本地私有仓库
有时候使用Docker Hub这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
3.1 使用registry镜像创建私高仓库
docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。本节内容基于docker-registry v2.x版本。
安装Docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:
$ docker run -d -p 5000:5000 registry:2这将自动下载井启动一个registry容器,创建本地的私有仓库服务。
例如:
(base) pang@pang-HP:~$ sudo docker run -d -p 5000:5000 registry:2 Unable to find image 'registry:2' locally 2: Pulling from library/registry 2408cc74d12b: Pull complete ea60b727a1ce: Pull complete c87369050336: Pull complete e69d20d3dd20: Pull complete fc30d7061437: Pull complete Digest: sha256:bedef0f1d248508fe0a16d2cacea1d2e68e899b2220e2258f1b604e1f327d475 Status: Downloaded newer image for registry:2 557793dbfb9533ec8559bc8b0a88e882d4e4ed1638f13835a7b375012e76f425 (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE python 3 763642b839b7 2 days ago 55.4MB debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB hello-world latest feb5d9fea6a5 8 months ago 13.3kB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 557793dbfb95 registry:2 "/entrypoint.sh /etc…" 44 minutes ago Up 44 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp wonderful_shannon 98bbce6f5691 centos:7 "/bin/bash" 24 hours ago Up 24 hours reverent_morse (base) pang@pang-HP:~$默认情况下,仓库会被创建在容器的/var/lib/registry目录下。可以通过-v参数来将镜像文件存放在本地的指定路径 。
例如下面的例子将上传的镜像放到/opt/data/registry目录:
$ docker run -d -p 5000 5000 -v /opt/data/registry:/var/lib/registry registry:2此时,在本地将启动一个私有仓库服务,监听端口为5000。
3.2 管理私有仓库
私有仓库可以通过registry提供的api来操作,可以参考官网的api文档,链接如下:https://docs.docker.com/registry/spec/api/#detail
3.2.1 上传镜像到本地仓库
- 先在本机查看已有的镜像。
- 使用docker tag将python:3这个镜像标记为127.0.0.1:5000/python:3,语法格式docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
- 使用docker push上传标记的镜像
- 用curl查看仓库中的镜像
这里可以看到 {“repositories”:[“python”]},表明镜像已经被成功上传了。
3.2.2 搜索本地仓库镜像
- 查询本地仓库有哪些镜像
- 获取某个镜像的标签列表
3.2.3 下载本地仓库镜像
先删除已有镜像,再尝试从私有仓库中下载这个镜像。
(base) pang@pang-HP:~$ sudo docker rmi 127.0.0.1:5000/python:3 Untagged: 127.0.0.1:5000/python:3 Untagged: 127.0.0.1:5000/python@sha256:c001da366c3e68619a8bcd8a61b6a888b7e1bb3a293ac30382d865d0fad3789f (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE python 3 763642b839b7 2 days ago 55.4MB debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB hello-world latest feb5d9fea6a5 8 months ago 13.3kB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$ sudo docker pull 127.0.0.1:5000/python:3 3: Pulling from python Digest: sha256:c001da366c3e68619a8bcd8a61b6a888b7e1bb3a293ac30382d865d0fad3789f Status: Downloaded newer image for 127.0.0.1:5000/python:3 127.0.0.1:5000/python:3 (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE 127.0.0.1:5000/python 3 763642b839b7 2 days ago 55.4MB python 3 763642b839b7 2 days ago 55.4MB debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB hello-world latest feb5d9fea6a5 8 months ago 13.3kB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$3.2.4 配置非https仓库地址
如果不想使用127.0.0.1:5000作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。就得把例如192.168.199.100:5000这样的内网地址作为私有仓库地址,这时会发现无法成功推送镜像。
这是因为Docker默认不允许非HTTPS方式推送镜像。我们可以通过Docker的配置选项来取消这个限制。
- Ubuntu 16.04+, Debian 8+, centos7等使用systemd的系统
请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
- 重启docker服务:
3.3 私有仓库高级配置
前面搭建了一个具有基础功能的私有仓库,更安全的方式是使用自签名证书,具体可以参考docker官网介绍
本小节我们来使用Docker Compose搭建一个拥有权限认证、TLS的私有仓库。这种方式可以在测试环境中使用,因为可信的证书颁发机构都需要有一个可用的域名,我们在内网部署的时候不一定是有域名的,可能就是一个内网IP地址。
- 在docker registry的server上新建一个文件夹,以下步骤均在该文件夹中进行。
3.3.1 准备站点证书
这里我们假设没有互联网域名,所以这里使用openssl自行签发证书(如果拥有一个域名,可以使用国内各大云服务商均提供免费的站点证书)。
假设我们将要搭建的私有仓库地址为docker.domain.com,下面我们介绍使用openssl自行签发docker.domain.com的站点SSL证书。
- 第一步创建CA私钥。
- 第二步利用私钥创建CA根证书请求文件。
以上命令中-subj参数里的/C表示国家,如CN;/ST表示省;/L表示城市或者地区;/O表示组织名;/CN通用名称。
- 第三步配置CA根证书,新建root-ca.cnf。
第四步签发根证书。
$ openssl x509 -req -days 3650 -in "root-ca.csr" \-signkey "root-ca.key" -sha256 -out "root-ca.crt" \-extfile "root-ca.cnf" -extensions \root_ca- 第五步生成站点SSL私钥。
- 第六步使用私钥生成证书请求文件。
- 第七步配置证书,新建site.cnf文件。
- 第八步签署站点SSL证书。
这样已经拥有了docker.domain.com的网站SSL私钥docker.domain.com.key和SSL证书docker.domain.com.crt及CA根证书root-ca.crt。
新建ssl文件夹并将docker.domain.com.key、docker.domain.com.crt、root-ca.crt这三个文件移入,删除其他文件。
3.3.2 配置私有仓库
私有仓库默认的配置文件位于容器内的/etc/docker/registry/config.yml,我们先在本地编辑config.yml,之后挂载到容器中。
version: 0.1 log:accesslog:disabled: truelevel: debugformatter: textfields:service: registryenvironment: staging storage:delete:enabled: truecache:blobdescriptor: inmemoryfilesystem:rootdirectory: /var/lib/registry auth:htpasswd:realm: basic-realmpath: /etc/docker/registry/auth/nginx.htpasswd http:addr: :443host: https://docker.domain.comheaders:X-Content-Type-Options: [nosniff]http2:disabled: falsetls:certificate: /etc/docker/registry/ssl/docker.domain.com.crtkey: /etc/docker/registry/ssl/docker.domain.com.key health:storagedriver:enabled: trueinterval: 10s threshold: 3- 生成http认证文件
将上面的 username password 替换为你自己的用户名和密码。
- 编辑docker-compose.yml
- 修改hosts,编辑/etc/hosts
这样我们就搭建好了一个具有权限认证、TLS的私有仓库,接下来我们测试其功能是否正常。
3.3.3 测试私有仓库功能
由于自行签发的CA根证书不被系统信任,所以我们需要将CA根证书ssl/root-ca.crt移入/etc/docker/certs.d/docker.domain.com文件夹中。
$ sudo mkdir -p /etc/docker/certs.d/docker.domain.com$ sudo cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt登录到私有仓库。
$ docker login docker.domain.com尝试推送、拉取镜像。
$ docker pull ubuntu:18.04$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04$ docker push docker.domain.com/username/ubuntu:18.04$ docker image rm docker.domain.com/username/ubuntu:18.04$ docker pull docker.domain.com/username/ubuntu:18.04如果我们退出登录,尝试推送镜像。
$ docker logout docker.domain.com$ docker push docker.domain.com/username/ubuntu:18.04no basic auth credentials发现会提示没有登录,不能将镜像推送到私有仓库中。
3.4 Nexus3
使用Docker官方的Registry创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启Registry。在企业中把内部的一些工具包放入Nexus中是比较常见的做法,最新版本Nexus3.x 全面支持Docker的私有镜像。所以使用Nexus3.x一个软件来管理Docker,Maven,Yum,PyPI等是一个明智的选择。
3.4.1 启动Nexus容器
$ docker run -d --name nexus3 --restart=always \-p 8081:8081 \--mount src=nexus-data,target=/nexus-data \sonatype/nexus3首次运行需等待3-5分钟,你可以使用docker logs nexus3 -f查看日志:
$ docker logs nexus3 -f2021-03-11 15:31:21,990+0000 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer - -------------------------------------------------Started Sonatype Nexus OSS 3.30.0-01-------------------------------------------------如果你看到以上内容,说明Nexus已经启动成功,你可以使用浏览器打开http://YourIP:8081访问Nexus了。例如:http://10.30.185.122:8081/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nx0jnLRP-1655689956680)(https://note.youdao.com/yws/res/25638/WEBRESOURCEea1c7e91e13c438d318aa0c9acd07a6d)]
其数据目录为:
root@pang-HP:/var/lib/docker/volumes/nexus-data# ll 总用量 12 drwx-----x 3 root root 4096 6月 17 14:41 ./ drwx-----x 4 root root 4096 6月 17 14:41 ../ drwxr-xr-x 15 200 200 4096 6月 17 16:09 _data/ root@pang-HP:/var/lib/docker/volumes/nexus-data#首次运行请通过以下命令获取初始密码:
$ docker exec nexus3 cat /nexus-data/admin.password9266139e-41a2-4abb-92ec-e4142a3532cb首次启动Nexus的默认帐号是admin,密码则是上边命令获取到的,点击右上角登录,首次登录需更改初始密码。
登录之后可以点击页面上方的齿轮按钮按照下面的方法进行设置。
3.4.2 创建仓库
创建一个私有仓库的方法:Repository->Repositories点击右边菜单Create repository选择docker (hosted)
- Name: 仓库的名称
- HTTP: 仓库单独的访问端口(例如:5000)
- Hosted -> Deployment pollcy: 请选择Allow redeploy否则无法上传Docker镜像。
其它的仓库创建方法请各位自己摸索,还可以创建一个docker (proxy) 类型的仓库链接到DockerHub上。再创建一个 docker (group) 类型的仓库把刚才的hosted与proxy添加在一起。主机在访问的时候默认下载私有仓库中的镜像,如果没有将链接到DockerHub中下载并缓存到Nexus中。
3.4.3 添加访问权限
菜单Security->Realms把Docker Bearer Token Realm移到右边的框中保存。
添加用户规则:菜单Security->Roles->Create role在Privlleges选项搜索docker把相应的规则移动到右边的框中然后保存。
添加用户:菜单Security->Users->Create local user在Roles选项中选中刚才创建的规则移动到右边的窗口保存。
3.4.4 重启nexus服务,开放5000端口
(base) pang@pang-HP:~$ sudo docker stop nexus3 nexus3 (base) pang@pang-HP:~$ sudo docker rm nexus3 nexus3 (base) pang@pang-HP:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98bbce6f5691 centos:7 "/bin/bash" 3 days ago Up 3 days reverent_morse (base) pang@pang-HP:~$ (base) pang@pang-HP:~$ sudo docker run -d --name nexus3 --restart=always \-p 8081:8081 \-p 5000:5000 \--mount src=nexus-data,target=/nexus-data \sonatype/nexus3 9a102684ab20514cad0e84617f4f4185120a23b306d76f12f920152c6c0acb6f (base) pang@pang-HP:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a102684ab20 sonatype/nexus3 "sh -c ${SONATYPE_DI…" 9 seconds ago Up 9 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp nexus3 98bbce6f5691 centos:7 "/bin/bash" 3 days ago Up 3 days reverent_morse (base) pang@pang-HP:~$ ss -tan State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ... LISTEN 0 4096 0.0.0.0:5000 0.0.0.0:* ... LISTEN 0 4096 0.0.0.0:8081 0.0.0.0:* ... (base) pang@pang-HP:~$3.4.5 测试
- curl命令
3.4.6 docker登录仓库
(base) pang@pang-HP:~$ sudo docker login http://10.30.185.122:5000 Username: pang Password: Error response from daemon: Get "https://10.30.185.122:5000/v2/": http: server gave HTTP response to HTTPS client (base) pang@pang-HP:~$nexsu仓库开的是http,docker要走https。参考3.2.4节处理。处理后重新登录:
(base) pang@pang-HP:/etc/docker$ sudo docker login http://10.30.185.122:5000 Authenticating with existing credentials... Login did not succeed, error: Error response from daemon: Get "http://10.30.185.122:5000/v2/": dial tcp 10.30.185.122:5000: connect: connection refused Username (admin): pang Password: Error response from daemon: Get "http://10.30.185.122:5000/v2/": dial tcp 10.30.185.122:5000: connect: connection refused (base) pang@pang-HP:/etc/docker$此时发现,创建的账户pang无法登录(无法登录原因未解决 ???)。重新使用admin登录成功:
(base) pang@pang-HP:/etc/docker$ sudo docker login http://10.30.185.122:5000 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded (base) pang@pang-HP:/etc/docker$3.4.7 操作镜像
- 上传镜像到Nexus3中
- 检查Nexus3中镜像结果
3.4.8 服务端启动方式改进,将Nexus3注册成系统服务
- 编写Linux文件 vim /etc/systemd/system/nexus.service
- 停止和删除命令行启动的nexus服务
用systemd启动服务
# systemctl daemon-reload # systemctl start nexus # systemctl enable nexus # systemctl status nexus3.4.9 改nexus仓库的http为https
前面我们用docker容器搭建nexus服务,创建了一个的镜像仓库,仓库端口为5000,协议为http,不是https。nexsu仓库开的是http,dockr 要走https,我们是通过在客户端添加仓库信任解决的。
那么,有没有更符合最佳实践的方式呢?有!用nexus-https镜像,nexus官方镜像的改进版
具体可以参考:【nexus】用nexus3.x 官方镜像搭建docker私有镜像仓库
总结
以上是生活随笔为你收集整理的Docker笔记-04 仓库的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: shell - 循环的2种方式
- 下一篇: 学习OpenCV3——图像旋转算法实现