(安西) 发表于 2019-2-21 11:03:24

docker 仓库及镜像的上传下载

Docker 仓库
  仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
  一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
  仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
  当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
一、搭建私有仓库
  下载registry镜像
docker pull registry
  下载完之后通过该镜像启动一个容器
  # docker run -d -p 5000:5000 --name registry registry:2.3.1
http://s1.运维网.com/images/20180619/1529407374296882.png
  查看,端口已打开

  http://s1.运维网.com/images/20180619/1529407466780808.png
  查看存在镜像

  # docker images
http://s1.运维网.com/images/20180619/1529407554703854.png

  使用docker tag 将 game2048 这个镜像标记为 localhost:5000/game2048
  格式为 docker tag IMAGE[:TAG] /]REPOSITORY[:TAG]
  
  # docker tag game2048 localhost:5000/game2048    给已存在的镜像打上tag
  http://s1.运维网.com/images/20180619/1529407684225568.png

  # docker images


  http://s1.运维网.com/images/20180619/1529407716349319.png

  使用 docker push 上传标记的镜像
  # docker push localhost:5000/game2048
  http://s1.运维网.com/images/20180619/1529408304379264.png
  
用 curl 查看仓库中的镜像
  # curl 127.0.0.1:5000/v2/_catalog
{"repositories":["game2048"]}

以看到 {"repositories":["game2048"]},表明镜像已经被成功上传了
  先删除已有镜像,再尝试从私有仓库中下载这个镜像
  # docker rmi localhost:5000/game2048
  
http://s1.运维网.com/images/20180619/1529409687864010.png
  拉取镜像
  # docker pull localhost:5000/game2048
  http://s1.运维网.com/images/20180619/1529409800835370.png

  # docker image ls   


  http://s1.运维网.com/images/20180619/1529409849318648.png

  如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.122.1:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
  这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。
  再次上传一个镜像

  http://s1.运维网.com/images/20180619/1529410475704082.png
  http://s1.运维网.com/images/20180619/1529410571462565.png
  这个问题可能是由于客户端采用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和端口

  # vim daemon.json

http://s1.运维网.com/images/20180619/1529411015639574.png
  重起服务 ,手动开启registry

  http://s1.运维网.com/images/20180619/1529411123167904.png
  再次上传

  # docker push 192.168.122.1:5000/nginx
http://s1.运维网.com/images/20180619/1529411261358956.png
  关闭和删除

  http://s1.运维网.com/images/20180619/1529411340135821.png

二、生成自签名证书
  在服务器主机上生成自签名证书,创建一个文件夹用于存放证书
  # pwd
/tmp/docker
# mkdir certs
# 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) :CN
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) :xi'an
Organization Name (eg, company) :cara
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:mycara.com
Email Address []:root@mycara.com
  certs文件夹就可以看到生成两个文件
  http://s1.运维网.com/images/20180619/1529412185875357.png
  

  运行仓库镜像
  # 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
  如下,容器启动,端口打开
http://s1.运维网.com/images/20180619/1529412775209455.png
  域名要有解析

  # vim /etc/hosts
http://s1.运维网.com/images/20180619/1529413131793520.png

配置客户端
  我做实验的是一台服务器,所以均在一台主机上进行配置的。
  如果你的服务器作为Docker仓库使用,客户端在另一台主机上作为客户端来上传或拉取镜像,则如下操作本应在客户端执行;
  创建目录
  # mkdir -p /etc/docker/certs.d/mycara.com/
# cp domain.crt /etc/docker/certs.d/mycara.com/ 服务器端生成的的.crt复制到客户端服务器的/etc/docker/certs.d/mycara.com/目录下
  将打了tag的镜像上传

  # docker tag game2048 mycara.com/game2048
# docker push mycara.com/game2048
http://s1.运维网.com/images/20180619/1529415604594225.png
  拉取镜像

  # docker pull mycara.com/game2048
http://s1.运维网.com/images/20180619/1529415656478517.png
  删除原启动的仓库容器,做下面实验
  http://s1.运维网.com/images/20180619/1529416148675843.png

  
三、私有仓库认证
  创建存放密码账号的文件
  # mkdir auth       建立目录
# ls
authcerts
# docker run \
> --entrypoint htpasswd \
> registry:2.3.1 -Bbn admin cara > auth/htpasswd

  # cd auth/
# ls
htpasswd
# cat htpasswd
admin:$2y$05$LIb4zTANf0KCSPw0IrL2zOqO9zth5XpOYpdJRh/VTcILfX3hgU0P.


  重新启动容器
  # 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

http://s1.运维网.com/images/20180619/1529417368306640.png
  现在客户端再pull、push就会提示报错,无法提交,需要登录私有仓库
  http://s1.运维网.com/images/20180619/1529419748448183.png

  # docker tag nginx mycara.com/nginx
# docker login -u admin -p cara mycara.com      登录
  Login Succeeded
# cd
# cd .docker/
# ls
config.json
# cat config.json
{
    "auths": {
      "mycara.com": {
            "auth": "YWRtaW46Y2FyYQ=="
      }
    }
}

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

  

  
退出登录
  # docker logout mycara.com   
http://s1.运维网.com/images/20180619/1529419807698948.png



页: [1]
查看完整版本: docker 仓库及镜像的上传下载