前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker实践之06-访问仓库

Docker实践之06-访问仓库

作者头像
编程随笔
发布2022-09-09 08:25:48
1.6K0
发布2022-09-09 08:25:48
举报
文章被收录于专栏:后端开发随笔

目录

什么是仓库

仓库(Repository)是集中存放镜像的地方。 一个容易和仓库混淆的概念是注册服务器(Registry),实际上注册服务器是管理仓库(Repository)的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。 例如:对于仓库地址dl.dockerpool.com/ubuntu来说, dl.dockerpool.com是注册服务器地址, ubuntu是仓库名。大部分时候,并不需要严格区分这两者的概念。

Docker镜像仓库
Docker镜像仓库

一.Docker Hub

Docker Hub是Docker官方公开的镜像仓库服务。

注册

你可以在 https://hub.docker.com 免费注册一个Docker Hub账号。

登录

可以通过执行docker login命令交互式的输入用户名及密码来完成在命令行界面登录Docker Hub,通过docker logout命令退出登录。

代码语言:javascript
复制
# 为什么要登录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
代码语言:javascript
复制
# 退出Docker Hub
$ docker logout 
Removing login credentials for https://index.docker.io/v1/

拉取镜像

可以通过docker search查找官方镜像库中的镜像,并通过docker pull命令拉取镜像。

代码语言:javascript
复制
# 搜索镜像
$ 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官方上传的镜像。

代码语言:javascript
复制
# 拉取镜像
$ 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账号用户名。

代码语言:javascript
复制
# 给镜像打新的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镜像来运行私有仓库。

代码语言:javascript
复制
$ 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目录下,可以通过查看容器详细信息确认:

代码语言:javascript
复制
$ docker inspect 20e90b6c0a9a
...
"Config": {
    ...
    "Volumes": {
        "/var/lib/registry": {} ## docker-registry默认仓库位置
    },
    ...
}
...

可以通过"-v"参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的${USER_HOME}/docker/registry目录。

代码语言:javascript
复制
$ 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,先在本机查看已有的镜像。

代码语言:javascript
复制
$ 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".

代码语言:javascript
复制
$ 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].

代码语言:javascript
复制
$ 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查看仓库中的镜像。

代码语言:javascript
复制
$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["hello-world"]}

这里可以看到 {"repositories":["hello-world"]},表明镜像已经被成功上传了。 先删除已有镜像,再尝试从私有仓库中下载这个镜像。

代码语言:javascript
复制
## 从本地删除镜像
$ 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方式访问私有仓库。

代码语言:javascript
复制
# 默认情况下,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中增加如下内容:

代码语言:javascript
复制
DOCKER_OPTS="--registry-mirror=http://hub-mirror.c.163.com --insecure-registries=192.168.199.100:5000"

其中,选项”--insecure-registries“指定不需要HTTP方式访问的私有仓库地址。

代码语言:javascript
复制
# 重启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将不能启动。

代码语言:javascript
复制
# 重启Docker服务
$ sudo service docker restart
代码语言:javascript
复制
# 设置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的私有仓库。 新建一个文件夹,以下步骤均在该文件夹中进行。

代码语言:javascript
复制
$ mkdir registry_ssl
$ cd registry_ssl
准备站点证书

如果你拥有一个域名,国内各大云服务商均提供免费的站点证书,也可以使用openssl自行签发证书。 假设我们将要搭建的私有仓库地址为"mydocker.test.com",下面介绍使用openssl自行签发"mydocker.test.com"的站点SSL证书。

第一步: 创建CA私钥

代码语言:javascript
复制
$ 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根证书请求文件

代码语言:javascript
复制
# 如下命令中-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

代码语言:javascript
复制
$ vim root-ca.cnf
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

第四步: 签发根证书

代码语言:javascript
复制
$ 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私钥

代码语言:javascript
复制
$ openssl genrsa -out "mydocker.test.com.key" 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...........................................++++
.............................++++
e is 65537 (0x010001)

第六步: 使用私钥生成证书请求文件

代码语言:javascript
复制
$ 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文件

代码语言:javascript
复制
$ 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证书

代码语言:javascript
复制
$ 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,之后挂载到容器中。

代码语言:javascript
复制
$ 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认证文件
代码语言:javascript
复制
$ mkdir auth
# 将下面的username,password替换为自己的用户名和密码(这里的用户名和密码就是随后登录私有仓库时需要使用账户信息)
$ docker run --rm --entrypoint htpasswd registry -Bbn username password > auth/nginx.htpasswd
编辑docker-compose.yml
代码语言:javascript
复制
$ 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”中看到如下内容:

代码语言:javascript
复制
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
代码语言:javascript
复制
$ sudo vim /etc/hosts
$ 127.0.0.1 mydocker.test.com
启动
代码语言:javascript
复制
$ docker-compose up -d

这样我们就搭建好了一个具有权限认证,支持TLS的私有仓库,接下来我们测试其功能是否正常。

代码语言:javascript
复制
$ 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文件夹中。

代码语言:javascript
复制
$ 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.登录到私有仓库

代码语言:javascript
复制
$ 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.尝试推送/拉取镜像

代码语言:javascript
复制
# 从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

Nexus3作为Docker私有仓库
Nexus3作为Docker私有仓库

使用Docker官方的Registry创建的仓库面临一些维护问题,比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启Registry程序。 最新版本Nexus3.x全面支持Docker的私有镜像,所以使用Nexus3.x来搭建Docker私有镜像仓库是一个很不错的选择。

启动Nexus容器
代码语言:javascript
复制
$ 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。

代码语言:javascript
复制
# 登录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
代码语言:javascript
复制
# 从上述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"地址拉取或者上传镜像。

代码语言:javascript
复制
# 先登录私有仓库
$ 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 什么是仓库
  • 一.Docker Hub
    • 注册
      • 登录
        • 拉取镜像
          • 推送镜像
            • 自动创建
            • 二.私有仓库
              • Docker Registry
                • 安装Docker Registry
                • 在私有仓库上传/搜索/下载镜像
                • 配置私有仓库允许非HTTPS方式推送镜像
                • 私有仓库高级配置
              • Nexus3.x的私有仓库
                • 启动Nexus容器
                • 创建仓库
                • 添加访问权限
                • 访问镜像仓库
              • Harbor
              • 三. 最后总结
              相关产品与服务
              容器镜像服务
              容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档