docker 仓库及镜像的上传下载

                                                                       Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

一、搭建私有仓库

下载registry镜像

docker pull registry

下载完之后通过该镜像启动一个容器

[[email protected] ~]# docker run -d -p 5000:5000 --name registry registry:2.3.1

查看,端口已打开

查看存在镜像

[[email protected] ~]# docker images

使用 docker tag 将 game2048 这个镜像标记为 localhost:5000/game2048

格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]


[[email protected] ~]# docker tag game2048 localhost:5000/game2048    给已存在的镜像打上tag


[[email protected] ~]# docker images


使用 docker push 上传标记的镜像

[[email protected] ~]# docker push localhost:5000/game2048

curl 查看仓库中的镜像

[[email protected] ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["game2048"]}

以看到 {"repositories":["game2048"]},表明镜像已经被成功上传了

先删除已有镜像,再尝试从私有仓库中下载这个镜像

[[email protected] ~]# docker rmi localhost:5000/game2048

拉取镜像

[[email protected] ~]# docker pull localhost:5000/game2048


[[email protected] ~]# docker image ls


如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.122.1:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。

再次上传一个镜像

这个问题可能是由于客户端采用https,docker registry未采用https服务所致。一种处理方式是把客户对地址“192.168.1.100:5000”请求改为http。

目前很多文章都是通过修改docker的配置文件“etc/systemconfig/docker",重启docker来解决这个问题。但发现docker1.12.3版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。

解决方法:

在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:

{ "insecure-registries":["192.168.122.1:5000"] }

保存退出后,重启docker。

编辑daemon文件 ,写入本地ip和端口

[[email protected] docker]# vim daemon.json

重起服务 ,手动开启registry

再次上传

[[email protected] docker]# docker push 192.168.122.1:5000/nginx

关闭和删除


二、生成自签名证书

在服务器主机上生成自签名证书,创建一个文件夹用于存放证书

[[email protected] docker]# pwd
/tmp/docker
[[email protected] docker]# mkdir certs
[[email protected] docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
Generating a 4096 bit RSA private key
................................................................................++
................................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:cara
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:mycara.com
Email Address []:[email protected]

certs文件夹就可以看到生成两个文件 

运行仓库镜像

[[email protected] docker]# docker run -d \
> --restart=always \
> --name registry \
> -v `pwd`/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
> -p 443:443 \
> registry:2.3.1

如下,容器启动,端口打开

域名要有解析

[[email protected] docker]# vim /etc/hosts

配置客户端

我做实验的是一台服务器,所以均在一台主机上进行配置的。

如果你的服务器作为Docker仓库使用,客户端在另一台主机上作为客户端来上传或拉取镜像,则如下操作本应在客户端执行;

创建目录

[[email protected] certs]# mkdir -p /etc/docker/certs.d/mycara.com/
[[email protected] certs]# cp domain.crt /etc/docker/certs.d/mycara.com/ 服务器端生成的的.crt复制到客户端服务器的/etc/docker/certs.d/mycara.com/  目录下

将打了tag的镜像上传

[[email protected] certs]# docker tag game2048 mycara.com/game2048
[[email protected] certs]# docker push mycara.com/game2048

拉取镜像

[[email protected] certs]# docker pull mycara.com/game2048

删除原启动的仓库容器,做下面实验


三、私有仓库认证

创建存放密码账号的文件

[[email protected] docker]# mkdir auth       建立目录
[[email protected] docker]# ls
auth  certs
[[email protected] docker]# docker run \
> --entrypoint htpasswd \
> registry:2.3.1 -Bbn admin cara > auth/htpasswd

[[email protected] docker]# cd auth/
[[email protected] auth]# ls
htpasswd
[[email protected] auth]# cat htpasswd
admin:$2y$05$LIb4zTANf0KCSPw0IrL2zOqO9zth5XpOYpdJRh/VTcILfX3hgU0P.

重新启动容器

[[email protected] opt]# docker run -d --restart=always --name registryauth -v /tmp/docker/certs:/certs -v /opt/registryauth:/var/lib/registry -v /tmp/docker/auth:/auth -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2.3.1
9b12ab89f5a4c0434bad1b09e7bbde24c7c6a3d02a94d928719e85ff41c15339

现在客户端再pull、push就会提示报错,无法提交,需要登录私有仓库


[[email protected] opt]# docker tag nginx mycara.com/nginx
[[email protected] opt]# docker login -u admin -p cara mycara.com        登录

Login Succeeded
[[email protected] opt]# cd
[[email protected] ~]# cd .docker/
[[email protected] .docker]# ls
config.json
[[email protected] .docker]# cat config.json
{
    "auths": {
        "mycara.com": {
            "auth": "YWRtaW46Y2FyYQ=="
        }
    }
}


上传成功

[[email protected] .docker]# docker push mycara.com/nginx     
The push refers to a repository [mycara.com/nginx]
5f70bf18a086: Pushed
3f3324023e75: Pushed
f0d7d68f89e5: Pushed
917c0fc99b35: Pushed
latest: digest: sha256:e59bbe13ca0c309644d9bca972c1b660c170fbdee7ff81eda9ff966b86f14e63 size: 1978
[[email protected] .docker]# cd /opt/registryauth/docker/registry/v2/repositories/
[[email protected] repositories]# ls
nginx

退出登录

[[email protected] opt]# docker logout mycara.com   

原文地址:http://blog.51cto.com/13362895/2130744

时间: 2024-09-28 22:02:55

docker 仓库及镜像的上传下载的相关文章

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. NameNode与各DataNode使用心跳机制来获取DataNode信息.NameNode收到Client请求后,

C#的FTP上传下载的实验

前段时间做了一个FTP操作服务器文件的实验,现在把一些经验写下来,免得忘记. 1.上传的处理:目标文件夹A上传到服务器指定目录.先检索服务器目录中有无同名文件夹,若有,则先改名,上传成功后再删除,上传失败则回复文件夹名. 1).检查文件夹是否存在 /// <summary> /// 检查文件夹在服务器上是否已存在 /// </summary> /// <param name="path"></param> /// <returns&

fastDFS与java整合文件上传下载

准备 下载fastdfs-client-java源码 源码地址 密码:s3sw 修改pom.xml 第一个plugins是必需要的,是maven用来编译的插件,第二个是maven打源码包的,可以不要. <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactI

轻松实现函数计算文件上传下载

简介:这是一个包含了函数计算每种 Runtime 结合 HTTP Trigger 实现文件上传和文件下载的示例集.我们知道不同语言在处理 HTTP 协议上传下载时都有很多中方法和社区库,特别是结合函数计算的场景,开发人员往往需要耗费不少精力去学习和尝试.本示例集编撰的目的就是节省开发者甄别的精力和时间,为每种语言提供一种有效且符合社区最佳实践的方法,可以拿来即用. 这是一个包含了函数计算每种 Runtime 结合 HTTP Trigger 实现文件上传和文件下载的示例集.每个示例包括: 一个公共

python之实现ftp上传下载代码(含错误处理)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kaituorensheng/p/4480512.html#_label2 import ftplib import socket import os def ftpconnect(ftp_info): try: ftp = ftplib.FTP(ftp_info[0]) except (socket.er

用struts2实现文件的上传下载

在做B/S系统时经常会有文件上传下载的需求,现就基于struts2框架实现其功能 Struts2框架默认采用Commons-fileupload组件完成文件上传功能.? 使用Struts2框架实现文件上传功能,只需在Action中定义一个java.io.File类型的成员并为之设立setter方法,方法名要和参数名对应.? 客户端上传的文件, Struts2框架会自动将其保存在临时文件中,封装成java.io.File类对象.如果还想得到上传的文件名和文件类型,需按照如下命名规则在Action中

SFTP上传下载文件

secureCRT SFTP上传/下载文件 远程登陆IP secureCRT会话中点击SFTP 3.cd  /home/dowload       linux平台切换到/home/dowload目录 4.cd d:\   windows平台切换到d盘 5.put 文件名           上传 /home/dowload目录下 6.get 文件名   下载文件到windows平台 d盘

sercurityCRT 上传下载文件

[安装rz sz 命令] 在linux下安装rz很方便,使用yum install lrzsz [设置上传下载地址] [执行下载命令] [上传文件] 点击ok完成上传

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.