有时候使用 DockerHub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
docker官方提供了一个docker-registry工具,可以用于构建私有的镜像仓库。
安装运行 docker-registry
[root@DockerImages ~]# yum -y install docker-registry
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.cn99.com
* updates: mirrors.163.com
软件包 docker-registry 已经被 docker-distribution 取代,改为尝试安装 docker-distribution-2.6.2-2.git48294d9.el7.x86_64
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-distribution.x86_64.0.2.6.2-2.git48294d9.el7 将被 安装
--> 解决依赖关系完成
...
下载并运行容器
在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。
[root@DockerImages ~]# docker pull registry:latest
Unable to find image 'registry:latest' locally
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:f87f2b82b4873e0651f928dcde9556008314543bd863b3f7e5e8d03b04e117f7
Status: Downloaded newer image for docker.io/registry:latest
bd54cb4ae7e5340318384ca7c786285ca6de9ba8ee46cf43d1704ef3e442676a
[root@DockerImages ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu 14.04 2c5e00d77a67 10 days ago 188 MB
docker.io/registry latest f32a97de94e1 2 months ago 25.8 MB
docker.io/ubuntu 12.04 5b117edd0b76 2 years ago 104 MB
[root@DockerImages ~]# docker run -d -p 5000:5000 docker.io/registry:latest
[root@DockerImages ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd54cb4ae7e5 registry "/entrypoint.sh /e..." 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp eager_kare
此外,还可以指定本地路径(如 /home/user/registry-conf )下的配置文件。
默认情况下,仓库会被创建在容器的/tmp/registry下。可以通过-v参数来将镜像文件存放在本地的指定路径。
#例如下面的例子将上传的镜像放到/opt/data/registry 目录:
[root@DockerImages ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry docker.io/registry:latest
如果在启动过程中出现如下错,
[root@DockerImages ~]# docker run -d -p 5000:5000 docker.io/registry:latest
b65bbf3963e4f87b66fce6ea87763c42ef6ac272c8eae51a431fd2f9a6a8da66
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint sad_wright (daceb29865bbf0e3702a8f2ec20f452f4d1a1518def975b139091715416cf591): Bind for 0.0.0.0:5000 failed: port is already allocated.
解决办法:这是由于来自守护进程的错误响应,而致使外部连接失败。解决的办法就是将其docker进程
kill掉,然后再 清空掉iptables下nat表下的所有链(规则)
。最后,将 docker的网桥删除,并重启docker服务
[root@DockerImages ~]# pkill docker #终止进程
[root@DockerImages ~]# iptables -t nat -F #清空nat表的所有链
[root@DockerImages ~]# ifconfig docker0 down #停止docker默认网桥
[root@DockerImages ~]# yum install bridge-utils -y # 部分机器是无法使用brctl,所以需要提前安装
[root@DockerImages ~]# brctl delbr docker0 #删除网桥
[root@DockerImages ~]# systemctl restart docker #重启docker
[root@DockerImages ~]# docker run -d -p 5000:5000 --restart=always --name registry docker.io/registry
在私有仓库上传、下载、搜索镜像
创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 192.168.13.133:5000 。
私有仓库
第一步:给镜像打标记
使用 docker tag 将 5b117edd0b76 这个镜像标记为 192.168.13.133:5000/ubuntu3 (格式为 docker tag
IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] )。
[root@DockerImages ~]# docker tag docker.io/ubuntu:12.04 192.168.13.133:5000/ubuntu3:latest12
第二步:上传标记的镜像
使用 docker push 上传标记的镜像。
[root@DockerImages ~]# docker push 192.168.13.133:5000/ubuntu3:latest12
The push refers to a repository [192.168.13.133:5000/ubuntu3]
3efd1f7c01f6: Pushed
73b4683e66e8: Pushed
ee60293db08f: Pushed
9dc188d975fd: Pushed
58bcc73dcf40: Pushed
latest12: digest: sha256:ff38d3ab43a1f8ff7a83312369313e5b1b913df56d19c21b12029fc682783df4 size: 1359
用 curl 查看仓库中的镜像。
[root@DockerImages ~]# curl 192.168.13.133:5000/v2/_catalog
{"repositories":["ubuntu3"]}
[root@DockerImages ~]#
出现epositories":["ubuntu3"]}表明镜像已经被成功上传了,里面有一个名叫ubuntu3的镜像。
现在可以到另外一台机器去下载这个镜像。
注意:重要的是事情说三遍,这里有一个坑,在下载前需要修改/etc/docker/daemon.json文件,将文件内容{}替换为{ "insecure-registries":["192.168.13.133:5000"]},修改完后重启docker服务
注意:重要的是事情说三遍,这里有一个坑,在下载前需要修改/etc/docker/daemon.json文件,将文件内容{}替换为{ "insecure-registries":["192.168.13.133:5000"]},修改完后重启docker服务
注意:重要的是事情说三遍,这里有一个坑,在下载前需要修改/etc/docker/daemon.json文件,将文件内容{}替换为{ "insecure-registries":["192.168.13.133:5000"]},修改完后重启docker服务
如果没有修改daemon.json文件,在下载镜像时出现“Get https://192.168.13.133:5000/v1/_ping: http: server gave HTTP response to HTTPS client” ,表示下载失败
[root@DockerOne ~]# docker pull 192.168.13.133:5000/ubuntu3:latest12
Trying to pull repository 192.168.13.133:5000/ubuntu3 ...
latest12: Pulling from 192.168.13.133:5000/ubuntu3
Digest: sha256:ff38d3ab43a1f8ff7a83312369313e5b1b913df56d19c21b12029fc682783df4
Status: Downloaded newer image for 192.168.13.133:5000/ubuntu3:latest12
[root@DockerOne ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.13.133:5000/ubuntu3 latest12 5b117edd0b76 2 years ago 104 MB
如有问题,可在下方留言或加qq:1421691474咨询。