仓库(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: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd
http:
addr: :443
host: https://docker.domain.com
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.domain.com.crt
key: /etc/docker/registry/ssl/docker.domain.com.key
health:
storagedriver:
enabled: true
interval: 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: registry
ports:
- "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.04
no 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 -f
2021-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.password
9266139e-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-store
Login 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/nexus3
ExecStop=/usr/bin/docker stop nexus
LimitNOFILE=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官方镜像的改进版