目录

什么是仓库

仓库(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中。

要配置自动创建,包括如下的步骤:

  1. 创建账号并登录Docker Hub;
  2. 在Docker Hub中新建一个仓库并链接到GitHub(需要设置GitHub授权DockerHub访问);
  3. 选取一个目标网站中的项目(需要含Dockerfile)和分支;
  4. 指定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 国内仓库和镜像

Docker实践之06-访问仓库的更多相关文章

  1. Docker 系列四(自定义仓库).

    一.Docker hub 交互 Docker hub 是 Docker 官方维护的一个公共仓库,大部分需求都可以通过在 Docker hub 中直接下载镜像来完成.接下来,来看一下怎么与 Docker ...

  2. docker实践之docker-compose部署mysql

    文章目录 docker实践之docker-compose部署mysql 1.安装部署docker 2.编写docker-compose文件 3.编写配置文件和初始化文件 4.启动数据库 5.检查初始化 ...

  3. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  4. Docker实践之02-使用镜像及定制

    目录 一.获取镜像 二.使用镜像启动容器实例 三.列出镜像 四.删除本地镜像 五.定制镜像 通过commit命令定制镜像 通过Dockerfile定制镜像 docker build的工作原理 dock ...

  5. Docker 镜像、容器、仓库的概念及基本操作

    Docker 包括三个基本概念: 镜像(Image)容器(Container)仓库(Repository) 这三部分组成了Docker的整个生命周期,如下图所示,容器是由镜像实例化而来的,这和我们学习 ...

  6. docker 系列 - 企业级私有镜像仓库Harbor部署(转载)

     本文转载自 搜云库 的文章 https://www.jianshu.com/p/7d76850de03f  , 感谢作者 3.png 上一篇文章搭建了一个具有基础功能,权限认证.TLS 的私有仓库, ...

  7. Docker创建镜像以及私有仓库

    Docker的安装及镜像.容器的基本操作详见博客https://blog.51cto.com/11134648/2160257下面介绍Docker创建镜像和创建私有仓库的方法,详细如下: 创建镜像 创 ...

  8. 解决Windows10下无法对docker容器进行端口访问(端口映射的问题)

    解决Windows10下无法对docker容器进行端口访问(端口映射的问题) 问题详情 在Windows10系统服务器中安装了docker和docker-compose 并尝试在其中运行Nginx服务 ...

  9. Docker学习(五): 仓库与数据管理

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  10. docker 查询或获取私有仓库(registry)中的镜像

    docker 查询或获取私有仓库(registry)中的镜像,使用 docker search 192.168.1.8:5000 命令经测试不好使. 解决: 1.获取仓库类的镜像: [root@sha ...

随机推荐

  1. [转帖]Jmeter笔记:使用Jmeter向kafka发送消息

    https://www.cnblogs.com/daydayup-lin/p/14124816.html 日常工作中有时候需要向kafka中发送消息来测试功能或者性能,这时候我们怎么办呢?我之前是自己 ...

  2. 【转帖】Dockerfile文件指令介绍

    https://blog.whsir.com/post-5327.html Dockerfile其实就是一个文本文件,这个文本文件名称叫Dockerfile,里面包含了一些指令(可以理解成多个指令集合 ...

  3. Docker 部署 Ceph的简单方法

    https://zhuanlan.zhihu.com/p/390377674 学习一下. docker部署 部署的思路和网络架构和前面分布式是一样的,区别在于命令的形式. 在每个节点安装 docker ...

  4. @Transaction注解的失效场景

    作者:京东物流 孔祥东 背景 事情是这样,最近在实现一个需求的时候,有一个定时异步任务会捞取主表的数据并置为处理中(为了防止任务执行时间过长,下次任务执行把本次数据重复捞取),然后根据主表关联明细表数 ...

  5. 用户 'NT Service\SSISScaleOutMaster140' 登录失败

    用户 'NT Service\SSISScaleOutMaster140' 登录失败. 原因: 找不到与提供的名称匹配的登录名. 项目情况: 用户 'NT Service\SSISScaleOutMa ...

  6. Mysql 为现有数据生成Guid

    GUID 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...

  7. Unity中的string gc优化

    在项目中如果有大量的字符串拼接,比如每秒执行的倒计时,协议中的日志输出,每次拼接会产生大量的gc,尤其是在ILRuntime下执行 gc alloc的次数会更加频繁. zstring 有两个字符串处理 ...

  8. go中bytes.Buffer使用小结

    buffer 前言 例子 了解下bytes.buffer 如何创建bytes.buffer bytes.buffer的数据写入 写入string 写入[]byte 写入byte 写入rune 从文件写 ...

  9. VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等

    VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答.图文匹配.图片分类.常识推理等 多模态预训练模型通过在多种模态的大规模数据上的预训练,可以综合利用来自不同模态的信息,执行各种 ...

  10. 从嘉手札<2023-11-20>

    写给十年如一日的偶像--Faker "我看了一下,觉得视频还不够清晰,等我换一个清晰点的摄像头再回来直播,不要走开~" 繁星满天,流光飞逝. 世界是一场盛大的表演, 舞台上熙熙攘攘 ...