欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Docker笔记-04 仓库

发布时间:2023/12/20 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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,并且在Docker Hub点击右上角头像,在账号设置(Account Settings)中关联(Linked Accounts)目标网站(如Github);
  • 在目标网站中允许Docker Hub访问服务;
  • 在Docker Hub中配置一个“自动创建”类型的项目,即新建或选择已有的仓库,在Builds选项卡中选择Configure Automated Builds;
  • 选取一个目标网站中的项目(需要含Dockerfile)和分支;
  • 指定Dockerfile的位置,并提交创建。
  • 之后,可以在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 上传镜像到本地仓库

    • 先在本机查看已有的镜像。
    (base) pang@pang-HP:~$ sudo docker image ls 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:~$
    • 使用docker tag将python:3这个镜像标记为127.0.0.1:5000/python:3,语法格式docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
    (base) pang@pang-HP:~$ sudo docker tag 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:~$
    • 使用docker push上传标记的镜像
    (base) pang@pang-HP:~$ sudo docker push 127.0.0.1:5000/python:3 The push refers to repository [127.0.0.1:5000/python] 692f0d941fcb: Pushed 2ddc9f2aee6d: Pushed 3: digest: sha256:c001da366c3e68619a8bcd8a61b6a888b7e1bb3a293ac30382d865d0fad3789f size: 736 (base) pang@pang-HP:~$
    • 用curl查看仓库中的镜像
    (base) pang@pang-HP:~$ curl http://127.0.0.1:5000/v2/_catalog {"repositories":["python"]} (base) pang@pang-HP:~$

    这里可以看到 {“repositories”:[“python”]},表明镜像已经被成功上传了。

    3.2.2 搜索本地仓库镜像

    • 查询本地仓库有哪些镜像
    # 使用命令 curl -XGET http://ip:端口/v2/_catalog (base) pang@pang-HP:~$ curl -XGET http://127.0.0.1:5000/v2/_catalog {"repositories":["python"]} (base) pang@pang-HP:~$
    • 获取某个镜像的标签列表
    # 使用命令 curl -XGET http://ip:端口/v2/私有仓库镜像名称/tags/list (base) pang@pang-HP:~$ curl -XGET http://127.0.0.1:5000/v2/python/tags/list {"name":"python","tags":["3"]} (base) pang@pang-HP:~$

    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 中写入如下内容(如果文件不存在请新建该文件)
    {"registry-mirror": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com"],"insecure-registries": ["192.168.199.100:5000"] }
    • 重启docker服务:
    systemctl daemon-reload systemctl restart docker

    3.3 私有仓库高级配置

    前面搭建了一个具有基础功能的私有仓库,更安全的方式是使用自签名证书,具体可以参考docker官网介绍

    本小节我们来使用Docker Compose搭建一个拥有权限认证、TLS的私有仓库。这种方式可以在测试环境中使用,因为可信的证书颁发机构都需要有一个可用的域名,我们在内网部署的时候不一定是有域名的,可能就是一个内网IP地址。

    • 在docker registry的server上新建一个文件夹,以下步骤均在该文件夹中进行。
    mkdir -p ssl

    3.3.1 准备站点证书

    这里我们假设没有互联网域名,所以这里使用openssl自行签发证书(如果拥有一个域名,可以使用国内各大云服务商均提供免费的站点证书)。

    假设我们将要搭建的私有仓库地址为docker.domain.com,下面我们介绍使用openssl自行签发docker.domain.com的站点SSL证书。

    • 第一步创建CA私钥。
    $ openssl genrsa -out "root-ca.key" 4096
    • 第二步利用私钥创建CA根证书请求文件。
    $ openssl req \-new -key "root-ca.key" \-out "root-ca.csr" -sha256 \-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'

    以上命令中-subj参数里的/C表示国家,如CN;/ST表示省;/L表示城市或者地区;/O表示组织名;/CN通用名称。

    • 第三步配置CA根证书,新建root-ca.cnf。
    [root_ca] basicConstraints = critical,CA:TRUE,pathlen:1 keyUsage = critical, nonRepudiation, cRLSign, keyCertSign subjectKeyIdentifier=hash

    第四步签发根证书。

    $ 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私钥。
    $ openssl genrsa -out "docker.domain.com.key" 4096
    • 第六步使用私钥生成证书请求文件。
    $ openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'
    • 第七步配置证书,新建site.cnf文件。
    [server] authorityKeyIdentifier=keyid,issuer basicConstraints = critical,CA:FALSE extendedKeyUsage=serverAuth keyUsage = critical, digitalSignature, keyEncipherment subjectAltName = DNS:docker.domain.com, IP:127.0.0.1 subjectKeyIdentifier=hash
    • 第八步签署站点SSL证书。
    $ openssl x509 -req -days 750 -in "site.csr" -sha256 \-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \-out "docker.domain.com.crt" -extfile "site.cnf" -extensions server

    这样已经拥有了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认证文件
    $ mkdir auth$ docker run --rm \--entrypoint htpasswd \httpd:alpine \-Bbn username password > auth/nginx.htpasswd

    将上面的 username password 替换为你自己的用户名和密码。

    • 编辑docker-compose.yml
    version: '3'services:registry:image: registryports:- "443:443"volumes:- ./:/etc/docker/registry- registry-data:/var/lib/registry volumes:registry-data:
    • 修改hosts,编辑/etc/hosts
    127.0.0.1 docker.domain.com 启动 $ docker-compose up -d

    这样我们就搭建好了一个具有权限认证、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命令
    (base) pang@pang-HP:~$ curl -l http://10.30.185.122:5000 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <title>Error 400 Not a Docker request</title> </head> <body><h2>HTTP ERROR 400 Not a Docker request</h2> <table> <tr><th>URI:</th><td>/</td></tr> <tr><th>STATUS:</th><td>400</td></tr> <tr><th>MESSAGE:</th><td>Not a Docker request</td></tr> <tr><th>SERVLET:</th><td>-</td></tr> </table> <hr><a href="https://eclipse.org/jetty">Powered by Jetty:// 9.4.43.v20210629</a><hr/></body> </html> (base) pang@pang-HP:~$

    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中
    (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE python 3 763642b839b7 5 days ago 55.4MB debian stretch-slim a88d8e7bd33c 3 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB sonatype/nexus3 latest aab1398bb647 4 weeks ago 705MB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$ sudo docker tag python:3 10.30.185.122:5000/python:v1 (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.30.185.122:5000/python v1 763642b839b7 5 days ago 55.4MB python 3 763642b839b7 5 days ago 55.4MB debian stretch-slim a88d8e7bd33c 3 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB sonatype/nexus3 latest aab1398bb647 4 weeks ago 705MB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$ sudo docker push 10.30.185.122:5000/python:v1 The push refers to repository [10.30.185.122:5000/python] 692f0d941fcb: Pushed 2ddc9f2aee6d: Pushed v1: digest: sha256:c001da366c3e68619a8bcd8a61b6a888b7e1bb3a293ac30382d865d0fad3789f size: 736 (base) pang@pang-HP:~$
    • 检查Nexus3中镜像结果

    3.4.8 服务端启动方式改进,将Nexus3注册成系统服务

    • 编写Linux文件 vim /etc/systemd/system/nexus.service
    [Unit] Description=Nexus Documentation=https://www.sonatype.com After=network-online.target docker.service Requires=docker.service[Service] ExecStartPre=-/usr/bin/docker rm -f nexus ExecStart=/usr/bin/docker run \ -p 8081:8081 \ -p 5000:5000 \ --mount src=nexus-data,target=/nexus-data \ sonatype/nexus3ExecStop=/usr/bin/docker stop nexusLimitNOFILE=65535 Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s[Install] WantedBy=multi-user.target
    • 停止和删除命令行启动的nexus服务
    # docker stop nexus # docker rm nexus

    用systemd启动服务

    # systemctl daemon-reload # systemctl start nexus # systemctl enable nexus # systemctl status nexus

    3.4.9 改nexus仓库的http为https

    前面我们用docker容器搭建nexus服务,创建了一个的镜像仓库,仓库端口为5000,协议为http,不是https。nexsu仓库开的是http,dockr 要走https,我们是通过在客户端添加仓库信任解决的。

    那么,有没有更符合最佳实践的方式呢?有!用nexus-https镜像,nexus官方镜像的改进版

    具体可以参考:【nexus】用nexus3.x 官方镜像搭建docker私有镜像仓库

    总结

    以上是生活随笔为你收集整理的Docker笔记-04 仓库的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。