简介
仓库(Repository)是集中存放镜像的地方。
一个容易与之混淆的概念是注册服务器(Registry)。实际上注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址hub.docker.com/_/ubuntu来说,hub.docker.com是注册服务器地址,ubuntu是仓库名。
仓库又分公共仓库和私有仓库,在本文将展示如何使用DockerHub官方仓库进行登录、下载等基本操作;最后还将介绍创建和使用私有仓库的基本操作。
Docker Hub
目前Docker官方维护了一个公共仓库https:/hub.docker.com,其中已经包括15000多个的镜像。大部分需求都可以通过在Docker Hub中直接下载镜像来实现。
登录
可以通过执行docker login命令来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的.dockercfg中将保存用户的认证信息。
基本操作
用户无需登录即可通过docker search命令来查找官方仓库中的镜像,并利用docker pull命令来将它下载到本地。
在前面博文中,已经具体介绍了如何使用docker pull命令。例如以centos为关键词进行搜索:
[root@gavin ~]# sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 5488 [OK] ansible/centos7-ansible Ansible on Centos7 122 [OK] jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.6.1810 x86… 111 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC session… 96 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 59 imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 57 [OK]...
根据是否为官方提供,可将这些镜像资源分为两类。一种是类似centos这样的基础镜像,称为基础或根镜像。这些镜像是由Docker公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
还有一种类型,比如ansible/centos7-ansible镜像,它是由DockerHub的用户ansible创建并维护的,带有用户名称为前缀,表明是某用户的某仓库。可以通过用户名称前缀user_
name/来指定使用某个用户提供的镜像,比如ansible用户的镜像前缀为ansible/。
另外,在查找的时候通过-s N参数可以指定仅显示评价为N星以上的镜像。
下载官方centos镜像到本地如下所示:
[root@gavin ~]# sudo docker pull centos Using default tag: latest latest: Pulling from library/centos 8ba884070f61: Pull complete Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c Status: Downloaded newer image for centos:latest
用户也可以在登录后通过docker push命令来将本地镜像推送到Docker Hub。
自动创建
自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说十分方便。有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像。
而自动创建功能使得用户通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发现新的提交,则自动执行创建。
要配置自动创建,包括如下的步骤:
- 创建并登录Docker Hub,以及目标网站;*在目标网站中连接帐户到Docker Hub。
- 在Docker Hub中配置一个自动创建。
- 选取一个目标网站中的项目(需要含Dockerfile)和分支。
- 指定Dockerfile的位置,并提交创建。
之后,可以在Docker Hub的“自动创建”页面中跟踪每次创建的状态。
创建和使用私有仓库
使用registry 镜像创建私有仓库
安装Docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:
[root@gavin ~]# sudo docker run -d -p 5000:5000 registry
这将自动下载并启动一个registry容器,创建本地的私有仓库服务。
默认情况下,会将仓库创建在容器的/tmp/registry目录下。可以通过-v参数来将镜像文件存放在本地的指定路径上。
例如下面的例子将上传的镜像放到/opt/data/registry目录:
[root@gavin ~]# sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此时,在本地将启动一个私有仓库服务,监听端口为5000。
管理私有仓库镜像
首先在A虚拟机中搭建私有仓库,查看其地址为192.168.1.16:5000。然后在B虚拟中测试上传和下载镜像。
在B虚拟机中查看已有镜像:
[root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 9f38484d220f 5 months ago 202MB
使用docker tag命令将这个镜像标记为192.168.1.16:5000/test(格式为docker tag IMAGE[:TAG] [REGISTRYHOST/] [USERNAME/]NAME[:TAG]):
[root@gavin ~]# sudo docker tag centos:latest 192.168.1.16:5000/test [root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE192.168.1.16:5000/test latest 9f38484d220f 5 months ago 202MB centos latest 9f38484d220f 5 months ago 202MB
使用docker push上传标记的镜像:
[root@gavin ~]# sudo docker push 192.168.1.16:5000/test The push refers to repository [192.168.1.16:5000/test] d69483a6face: Pushed latest: digest: sha256:ca58fe458b8d94bc6e3072f1cfbd334855858e05e1fd633aa07cf7f82b048e66 size: 529
现在可以到任意一台能访问到192.168.1.16地址的机器去下载这个镜像了:
[root@gavin /]# sudo docker pull 192.168.1.16:5000/test Using default tag: latest latest: Pulling from test Digest: sha256:ca58fe458b8d94bc6e3072f1cfbd334855858e05e1fd633aa07cf7f82b048e66 Status: Downloaded newer image for 192.168.1.16:5000/test:latest [root@gavin /]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE192.168.1.16:5000/test latest 9f38484d220f 5 months ago 202MB
遇到的问题
推送镜像到私服报错:
The push refers to repository [192.168.1.16:5000/test] Get https://192.168.1.16:5000/v2/: http: server gave HTTP response to HTTPS client
原因:
docker私有仓库服务器,默认是基于https传输的,所以我们需要在客户端做相关设置,不使用https传输
解决步骤:
[root@gavin ~]# vim /etc/docker/daemon.json
将下面的代码放进去保存并退出
"insecure-registries":["192.168.1.16:5000"]
最终如下所示:
{ "registry-mirrors": ["https://9pcu7szd.mirror.aliyuncs.com"], "insecure-registries":["192.168.1.16:5000"] }
依次执行下面两条命令,重新启动docker:
[root@gavin ~]# systemctl daemon-reload [root@gavin ~]# systemctl restart docker
这篇文章是我学习 Docker 的记录,内容参考自《Docker技术入门与实战》
来源:https://www.cnblogs.com/gavin-guo/p/11318664.html