Docker实践之06-访问仓库
目录
什么是仓库
仓库(Repository)是集中存放镜像的地方。
一个容易和仓库混淆的概念是注册服务器(Registry),实际上注册服务器是管理仓库(Repository)的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。
例如:对于仓库地址dl.dockerpool.com/ubuntu
来说, dl.dockerpool.com
是注册服务器地址, ubuntu
是仓库名。大部分时候,并不需要严格区分这两者的概念。
一.Docker Hub
Docker Hub是Docker官方公开的镜像仓库服务。
注册
你可以在 https://hub.docker.com 免费注册一个Docker Hub账号。
登录
可以通过执行docker login
命令交互式的输入用户名及密码来完成在命令行界面登录Docker Hub,通过docker logout
命令退出登录。
# 为什么要登录Docker Hub呢?不登录Docker Hub也同样可以下载镜像的,但是当需要将本地镜像推送到Docker Hub仓库的时候,就需要执行登录操作了
# 登录Docker Hub
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: dockertest
Password:
WARNING! Your password will be stored unencrypted in /home/test/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 退出Docker Hub
$ docker logout
Removing login credentials for https://index.docker.io/v1/
拉取镜像
可以通过docker search
查找官方镜像库中的镜像,并通过docker pull
命令拉取镜像。
# 搜索镜像
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11260 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1582 [OK]
...
在查询结果表中有一列为"OFFICIAL",值为"[OK]"表明镜像为Docker官方上传的镜像。
# 拉取镜像
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
27833a3ba0a5: Already exists
ea005e36e544: Pull complete
d172c7f0578d: Pull complete
Digest: sha256:e71b1bf4281f25533cf15e6e5f9be4dac74d2328152edf7ecde23abc54e16c1c
Status: Downloaded newer image for nginx:latest
推送镜像
用户也可以在登录后通过docker push
命令来将自己的镜像推送到Docker Hub。
以下命令中的username请替换为自己的Docker Hub账号用户名。
# 给镜像打新的tag
$ docker tag nginx:latest username/nginx:dev
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
username/nginx dev 27a188018e18 2 days ago 109MB
nginx latest 27a188018e18 2 days ago 109MB
# 将镜像推送到Docker Hub
$ docker push username/nginx
The push refers to repository [docker.io/username/nginx]
fc4c9f8e7dac: Mounted from library/nginx
912ed487215b: Mounted from library/nginx
5dacd731af1b: Mounted from library/nginx
dev: digest: sha256:c10f4146f30fda9f40946bc114afeb1f4e867877c49283207a08ddbcf1778790 size: 948
# 搜索刚才上传的镜像
# 在实践时发现上传镜像之后并不能立即就搜索到,但是可以从Docker Hub下载
$docker search username
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# 先删除本地镜像
$ docker image rm username/nginx:dev
Untagged: username/nginx:dev
Untagged: username/nginx@sha256:c10f4146f30fda9f40946bc114afeb1f4e867877c49283207a08ddbcf1778790
# 从Docker Hub下载刚才上传的镜像
$ docker pull username/nginx:dev
dev: Pulling from username/nginx
Digest: sha256:c10f4146f30fda9f40946bc114afeb1f4e867877c49283207a08ddbcf1778790
Status: Downloaded newer image for username/nginx:dev
特别注意:
在将镜像上传到Docker Hub之前,必须给镜像打tag,且新的镜像名称格式必须为:“username/imagename:tagname”,然后登录Docker Hub,上传打完tag的镜像:docker push username/imagename:tagname
。
如果不给镜像打tag或者新的镜像名称格式不是“username/imagename:tagname”形式,则push镜像将会报错:denied: requested access to the resource is denied
。
自动创建
自动创建允许用户通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发生新的提交或者创建新的标签(tag),Docker Hub会自动构建镜像并推送到Docker Hub中。
要配置自动创建,包括如下的步骤:
- 创建账号并登录Docker Hub;
- 在Docker Hub中新建一个仓库并链接到GitHub(需要设置GitHub授权DockerHub访问);
- 选取一个目标网站中的项目(需要含Dockerfile)和分支;
- 指定Dockerfile的位置,并提交创建。
之后,可以在Docker Hub的自动创建页面中跟踪每次创建的状态。
遗憾的是,目前这个功能需要升级到专业账户才能使用了。
二.私有仓库
有时候使用Docker Hub这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人或者公司内部使用。
Docker Registry
Docker Registry是官方提供的工具,可以用于构建私有的镜像仓库,详见:https://docs.docker.com/registry/。
安装Docker Registry
可以通过获取官方registry镜像来运行私有仓库。
$ docker run -d -p 5000:5000 --restart=always --name registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
c87736221ed0: Pulling fs layer
1cc8e0bb44df: Pulling fs layer
54d33bcb37f5: Pulling fs layer
e8afc091c171: Waiting
b4541f6d3db6: Waiting
latest: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:3b00e5438ebd8835bcfa7bf5246445a6b57b9a50473e89c02ecc8e575be3ebb5
Status: Downloaded newer image for registry:latest
20e90b6c0a9a12edc44127139d54eae4affec41a03fe303078cb829f57f4e5f7
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20e90b6c0a9a registry "/entrypoint.sh /etc…" 24 seconds ago Up 23 seconds 0.0.0.0:5000->5000/tcp registry
默认情况下,镜像会被创建在容器的/var/lib/registry目录下,可以通过查看容器详细信息确认:
$ docker inspect 20e90b6c0a9a
...
"Config": {
...
"Volumes": {
"/var/lib/registry": {} ## docker-registry默认仓库位置
},
...
}
...
可以通过"-v"参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的${USER_HOME}/docker/registry目录。
$ docker run -d -p 5000:5000 -v /home/test/docker/registry:/var/lib/registry --name registry registry
bb21fd518f0868186e444081862bca6e8bce0c889202dd61426f61334382e5ae
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb21fd518f08 registry "/entrypoint.sh /etc…" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp registry
在私有仓库上传/搜索/下载镜像
创建好私有仓库之后,就可以使用docker tag
来标记一个镜像,然后推送它到仓库。
例如私有仓库地址为 127.0.0.1:5000,先在本机查看已有的镜像。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 5 weeks ago 25.8MB
hello-world latest fce289e99eb9 3 months ago 1.84kB
使用docker tag
将"hello-world:latest"这个镜像标记为:"127.0.0.1:5000/hello-world:latest".
$ docker tag hello-world:latest 127.0.0.1:5000/hello-world:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 5 weeks ago 25.8MB
hello-world latest fce289e99eb9 3 months ago 1.84kB
127.0.0.1:5000/hello-world latest fce289e99eb9 3 months ago 1.84kB
使用docker push
上传标记的镜像,格式:docker push [OPTIONS] NAME[:TAG]
.
$ docker push 127.0.0.1:5000/hello-world
The push refers to repository [127.0.0.1:5000/hello-world]
af0b15c8625b: Pushed
latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524
用curl
查看仓库中的镜像。
$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["hello-world"]}
这里可以看到 {"repositories":["hello-world"]},表明镜像已经被成功上传了。
先删除已有镜像,再尝试从私有仓库中下载这个镜像。
## 从本地删除镜像
$ docker image rm 127.0.0.1:5000/hello-world
Untagged: 127.0.0.1:5000/hello-world:latest
Untagged: 127.0.0.1:5000/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
## 确认新打tag的镜像确实是从本地已经删除
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 5 weeks ago 25.8MB
hello-world latest fce289e99eb9 3 months ago 1.84kB
## 从私有仓库中下载镜像
$ docker pull 127.0.0.1:5000/hello-world
Using default tag: latest
latest: Pulling from hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for 127.0.0.1:5000/hello-world:latest
## 确认成功从私有仓库中下载到了镜像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 5 weeks ago 25.8MB
127.0.0.1:5000/hello-world latest fce289e99eb9 3 months ago 1.84kB
hello-world latest fce289e99eb9 3 months ago 1.84kB
注意事项:
如果不想使用"127.0.0.1:5000"作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库,就需要把例如"192.168.199.100:5000"这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像,这是因为Docker默认不允许以非HTTPS方式推送镜像,可以通过Docker的配置选项来取消这个限制,或者通过配置使用HTTPS方式访问私有仓库。
# 默认情况下,Docker不允许使用非HTTPS方式推送镜像
$ docker push 192.168.199.100:5000/hello-world
The push refers to repository [192.168.199.100:5000/hello-world]
Get https://192.168.199.100:5000/v2/: http: server gave HTTP response to HTTPS client
配置私有仓库允许非HTTPS方式推送镜像
Ubuntu 14.04, Debian 7 Wheezy
对于使用upstart的系统而言,编辑/etc/default/docker文件,在其中的DOCKER_OPTS中增加如下内容:
DOCKER_OPTS="--registry-mirror=http://hub-mirror.c.163.com --insecure-registries=192.168.199.100:5000"
其中,选项”--insecure-registries“指定不需要HTTP方式访问的私有仓库地址。
# 重启Docker服务
$ sudo service docker restart
Ubuntu 16.04+, Debian 8+, centos 7
对于使用systemd的系统,请在"/etc/docker/daemon.json"中写入如下内容(如果文件不存在请新建该文件):
{
"registry-mirror": [
"http://hub-mirror.c.163.com"
],
"insecure-registries": [
"192.168.199.100:5000"
]
}
注意: 该文件必须符合json规范,否则Docker将不能启动。
# 重启Docker服务
$ sudo service docker restart
# 设置Docker允许非HTTPS方式上传镜像到私有仓库之后,可以成功上传镜像到私有仓库
$ docker push 192.168.199.100:5000/hello-world
The push refers to repository [192.168.199.100:5000/hello-world]
af0b15c8625b: Pushed
test: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524
# 验证镜像已经成功上传到私有仓库
$ curl 192.168.199.100:5000/v2/_catalog
{"repositories":["hello-world"]}
至此,使用Docker Registry搭建一个具备基础功能的私有镜像仓库已经完成。
但是,一个功能完备的Docker私有镜像仓库应该包含权限认证,支持TLS访问等功能。
私有仓库高级配置
使用Docker Compose搭建一个拥有权限认证,支持TLS的私有仓库。
新建一个文件夹,以下步骤均在该文件夹中进行。
$ mkdir registry_ssl
$ cd registry_ssl
准备站点证书
如果你拥有一个域名,国内各大云服务商均提供免费的站点证书,也可以使用openssl自行签发证书。
假设我们将要搭建的私有仓库地址为"mydocker.test.com",下面介绍使用openssl自行签发"mydocker.test.com"的站点SSL证书。
第一步: 创建CA私钥
$ openssl genrsa -out "root-ca.key" 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...................................++++
.............++++
e is 65537 (0x010001)
生成CA私钥文件:root-ca.key。
第二步: 利用私钥创建CA根证书请求文件
# 如下命令中-subj参数里的/C表示国家,如CN; /ST表示省; /L表示城市或者地区; /O表示公司或组织名称; /CN表示通用名称。
$ openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256 -subj '/C=CN/ST=Beijing/L=Beijing/O=MyCompanyName/CN=MyCompany Docker Registry CA'
Can't load /home/jenkins/.rnd into RNG
139639004279872:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/jenkins/.rnd
$ touch /home/jenkins/.rnd
$ openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256 -subj '/C=CN/ST=Beijing/L=Beijing/O=MyCompanyName/CN=MyCompany Docker Registry CA'
生成CA根证书请求文件:root-ca.csr。
第三步: 配置CA根证书,新建root-ca.cnf
$ vim 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
Signature ok
subject=C = CN, ST = Beijing, L = Beijing, O = MyCompanyName, CN = MyCompany Docker Registry CA
Getting Private key
生成根证书文件:root-ca.crt。
第五步: 生成站点SSL私钥
$ openssl genrsa -out "mydocker.test.com.key" 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...........................................++++
.............................++++
e is 65537 (0x010001)
第六步: 使用私钥生成证书请求文件
$ openssl req -new -key "mydocker.test.com.key" -out "site.csr" -sha256 -subj '/C=CN/ST=Beiing/L=Beijing/O=MyCompanyName/CN=mydocker.test.com'
第七步: 配置证书,新建site.cnf文件
$ vim site.cnf
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:mydocker.test.com.key, 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 "mydocker.test.com.crt" -extfile "site.cnf" -extensions server
Signature ok
subject=C = CN, ST = Beiing, L = Beijing, O = MyCompanyName, CN = mydocker.test.com
Getting CA Private Key
经过上述步骤的准备,这样就拥有了"mydocker.test.com"的网站SSL私钥mydocker.test.com.key和SSL证书mydocker.test.com.crt及CA根证书root-ca.crt 。
新建ssl文件夹并将mydocker.test.com.key,mydocker.test.com.crt,root-ca.crt这三个文件移入,删除其他文件。
配置私有仓库
私有仓库默认的配置文件位于/etc/docker/registry/config.yml,我们先在本地编辑config.yml,之后挂载到容器中。
$ vim 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://mydocker.test.com
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/mydocker.test.com.crt
key: /etc/docker/registry/ssl/mydocker.test.com.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
生成http认证文件
$ mkdir auth
# 将下面的username,password替换为自己的用户名和密码(这里的用户名和密码就是随后登录私有仓库时需要使用账户信息)
$ docker run --rm --entrypoint htpasswd registry -Bbn username password > auth/nginx.htpasswd
编辑docker-compose.yml
$ vim docker-compose.yml
version: '3'
services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry
volumes:
registry-data:
至此,我们应该能够在最开始新建的目录“registry_ssl”中看到如下内容:
jenkins@dev:~/docker/registry_ssl$ ll
total 16
drwxrwxr-x 2 jenkins jenkins 4096 Apr 19 18:01 auth/
-rw-rw-r-- 1 jenkins jenkins 680 Apr 19 18:01 config.yml
-rw-rw-r-- 1 jenkins jenkins 195 Apr 19 18:03 docker-compose.yml
drwxrwxr-x 2 jenkins jenkins 4096 Apr 19 18:13 ssl/
修改hosts
$ sudo vim /etc/hosts
$ 127.0.0.1 mydocker.test.com
启动
$ docker-compose up -d
这样我们就搭建好了一个具有权限认证,支持TLS的私有仓库,接下来我们测试其功能是否正常。
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------
registry_ssl_registry_1 /entrypoint.sh /etc/docker ... Up 0.0.0.0:443->443/tcp, 5000/tcp
测试私有仓库功能
由于自行签发的CA根证书不被系统信任,所以我们需要将CA根证书ssl/root-ca.crt移入/etc/docker/certs.d/mydocker.test.com文件夹中。
$ sudo mkdir -p /etc/docker/certs.d/mydocker.test.com
$ sudo cp ssl/root-ca.crt /etc/docker/certs.d/mydocker.test.com/ca.crt
1.登录到私有仓库
$ docker login mydocker.test.com:443
Username: testcch
Password:
WARNING! Your password will be stored unencrypted in /home/jenkins/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
2.尝试推送/拉取镜像
# 从Docker Hub拉取镜像
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Status: Downloaded newer image for ubuntu:18.04
# 对镜像打标签:docker tag ubuntu:18.04 mydocker.test.com:443/username/ubuntu:18.04
$ docker tag ubuntu:18.04 mydocker.test.com:443/testcch/ubuntu:18.04
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 94e814e2efa8 5 weeks ago 88.9MB
mydocker.test.com:443/testcch/ubuntu 18.04 94e814e2efa8 5 weeks ago 88.9MB
registry latest f32a97de94e1 6 weeks ago 25.8MB
# 将镜像推送到私有仓库
$ docker push mydocker.test.com:443/testcch/ubuntu:18.04
The push refers to repository [mydocker.test.com:443/testcch/ubuntu]
b57c79f4a9f3: Retrying in 6 seconds
d60e01b37e74: Retrying in 7 seconds
e45cfbc98a50: Retrying in 7 seconds
762d8e1a6054: Retrying in 7 seconds
^C
实际上,搭建基于HTTPS访问的私有仓库有2种方式可以实现:
(1) Docker Registry依然运行在5000端口,前端使用一个nginx作为反向代理,在用户到Nginx之一层配置使用HTTPS访问即可
(2) 正如上述步骤,直接将Docker Registry配置运行在443端口
参考:
https://blog.51cto.com/lisea/1934731 registry安全认证搭建
https://www.cnblogs.com/justart/p/8072530.html Docker registry自签名证书
https://www.webmaster.me/server/docker-registry-with-self-signed-ssl-certificate.html 搭建docker-registry时使用自签名ssl证书认证问题
https://jkzhao.github.io/2017/09/01/Registry私有仓库搭建及认证/ Registry私有仓库搭建及认证
Nexus3.x的私有仓库
Nexus原本是一个Maven仓库服务器,用于Java生态的jar包依赖管理。
从Nexus 3开始支持作为Docker私有镜像仓库使用,如下是Nexus官方对其支持的仓库格式说明,详见:https://help.sonatype.com/repomanager3,https://www.sonatype.com/download-oss-sonatype 。
使用Docker官方的Registry创建的仓库面临一些维护问题,比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启Registry程序。
最新版本Nexus3.x全面支持Docker的私有镜像,所以使用Nexus3.x来搭建Docker私有镜像仓库是一个很不错的选择。
启动Nexus容器
$ docker run -d --name nexus3 --restart=always -p 8081:8081 --mount src=nexus-data,target=/nexus-data sonatype/nexus3
等待3-5分钟,如果nexus3容器没有异常退出,就可以使用浏览器打开http://serverIP:8081 访问Nexus了。
第一次启动Nexus的默认帐号是admin,密码是admin123,登录以后点击页面上方的齿轮按钮进行设置。
创建仓库
创建一个私有仓库的方法: Repository -> Repositories,点击“Create repository”,选择docker (hosted),设置如下参数:
- Name: 仓库的名称
- HTTP: 仓库单独的访问端口,这是为5000。
- Enable Docker V1 API: 如果需要同时支持V1版本请勾选此项(不建议勾选)。
- Hosted -> Deployment pollcy: 请选择Allow redeploy,否则无法上传Docker镜像。
还可以创建一个docker (proxy)类型的仓库链接到Docker Hub上。
还可以创建一个docker (group)类型的仓库把刚才的hosted与proxy添加在一起。
主机在访问的时候默认下载私有仓库中的镜像,如果没有,将链接到Docker Hub中下载并缓存到Nexus中。
添加访问权限
菜单Security -> Realms把“Docker Bearer Token Realm”移到右边的框中保存。
添加用户规则: 菜单Security -> Roles -> Create role 在Privlleges选项搜索“docker”把相应的规则移动到右边的框中然后保存。
添加用户:菜单Security -> Users -> Create local user 在Roles选项中选中刚才创建的规则移动到右边的窗口保存。
访问镜像仓库
如果不启用SSL加密可以通过前面章节的方法添加信任地址到Docker的配置文件中然后重启Docker。
# 登录Docker私有仓库
$ docker login 10.111.93.12:5000
Username: admin
Password:
Error response from daemon: Get http://10.111.93.12:5000/v2/: dial tcp 10.111.93.12:5000: connect: connection refused
# 查看Docker私有仓库容器信息
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e8b1fe450b6 sonatype/nexus3 "sh -c ${SONATYPE_DI…" About an hour ago Up 4 minutes 0.0.0.0:8081->8081/tcp nexus3
# 从上述Nexnus容器信息看显然是端口映射的问题,虽然在Nexus中设置了Docker的私有仓库端口为5000,但是在启动Nexus容器时并没有将5000端口曝露出来
$ docker run -d --name nexus3 --restart=always -p 8081:8081 -p 5000:5000 --mount src=nexus-data,target=/nexus-data sonatype/nexus3
# 再次登录Nexnus私有仓库
$ docker login 10.111.93.12:5000
Username: testcch
Password:
WARNING! Your password will be stored unencrypted in /home/test/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 上传镜像
$ docker push 10.111.93.12:5000/hello-world
The push refers to repository [10.111.93.12:5000/hello-world]
af0b15c8625b: Pushed
test: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524
# 确认镜像已经成功上传到私有仓库
$ curl http://10.111.93.12:5000/v2/_catalog
{"repositories":["hello-world"]}
# 删除本地镜像
$ docker image rm 10.111.93.12:5000/hello-world:test
Untagged: 10.111.93.12:5000/hello-world:test
Untagged: 10.111.93.12:5000/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
# 重新从Nexnus私有仓库中拉取镜像
$ docker pull 10.111.93.12:5000/hello-world:test
test: Pulling from hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for 10.111.93.12:5000/hello-world:test
参考:
https://www.jianshu.com/p/28e656fc8aad 【原】nexus oss 3 搭建docker私服 dial tcp [::1]:8082: getsockopt: connection refuse
https://blog.csdn.net/sinat_31908303/article/details/79799654#实现nexus管理docker私服 nexus搭建maven私服,docker私服并与maven项目整合
同样可以使用Nginx作为Nexnus的反向代理。
Harbor
Harbor是一个可信的云原生registry项目.
https://github.com/goharbor/harbor
https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md harbor安装手册
https://blog.csdn.net/u010278923/article/details/77941995 谈谈我对Harbor认识
https://www.ywnds.com/?p=7958 Docker:企业级私有镜像仓库Harbor讲解
三. 最后总结
在执行docker pull|push repository:tag
命令时,此时不论是否已经登录了指定的私有镜像仓库,默认都是从Docker Hub(加速器)拉取或者上传镜像。
但是,当使用docker pull|push registry:port/repository:tag
这样的格式时,将会从指定的"registry:port"地址拉取或者上传镜像。
# 先登录私有仓库
$ docker login 10.111.93.12:5000
Username: testcch
Password:
WARNING! Your password will be stored unencrypted in /home/test/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 使用`docker push repository:tag`格式上传本地镜像,总是会上传到Docker Hub
$ docker push mysql:5.7
The push refers to repository [docker.io/library/mysql] ## 默认总是将镜像上传到Docker Hub
82582edf9553: Preparing
9209148debed: Preparing
364557e875f1: Preparing
5075b9328698: Preparing
97874ea0e7f9: Preparing
# 使用`docker push registry:port/repository:tag`格式上传本地镜像时,上传到指定的Docker私有镜像仓库
$ docker push 10.111.93.12:5000/mysql:5.7
The push refers to repository [10.111.93.12:5000/mysql] ## 将本地镜像上传到指定的私有镜像仓库
82582edf9553: Pushed
9209148debed: Pushed
364557e875f1: Pushed
5075b9328698: Pushed
97874ea0e7f9: Pushed
458d25c646d8: Pushed
ec41e34b35a0: Pushed
3437f67a712b: Pushed
0aa7d65147ef: Pushed
f411d8bde01c: Pushed
5dacd731af1b: Pushed
5.7: digest: sha256:e889999df625a5a358a03cc433057cb5a8d3de17fbe11a70964da0eb9c7677b1 size: 2621
【参考】
https://juejin.cn/post/6850418119240843271 Docker 国内仓库和镜像
作者:编程随笔
出处:http://www.cnblogs.com/nuccch/
声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。