在 Docker 中,当咱们执行 docker pull xxx 的时候,可能会比较好奇,docker 会去哪儿查找并下载镜像呢?node
它其实是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为咱们提供的公共仓库,上面的镜像,你们均可以看到,也可使用。因此,咱们也能够带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。 若是要在公司中使用 Docker,咱们基本不可能把商业项目上传到公共仓库中,那若是要多个机器共享,又能怎么办呢?nginx
正由于这种须要,因此私有仓库也就有用武之地了。docker
所谓私有仓库,也就是在本地(局域网)搭建的一个相似公共仓库的东西,搭建好以后,咱们能够将镜像提交到私有仓库中。这样咱们既能使用 Docker 来运行咱们的项目镜像,也避免了商业项目暴露出去的风险。json
下面咱们用官方提供的registry镜像来搭建私有镜像仓库,固然还有其它不少方法。vim
准备两台安装好docker的服务器: 服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器; 测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像nginx,而后上传到registry服务器进行测试;bash
下载镜像registry服务器
# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
81033e7c1d6a: Pull complete
b235084c2315: Pull complete
c692f3a6894b: Pull complete
ba2177f3a70e: Pull complete
a8d793620947: Pull complete
Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
Status: Downloaded newer image for registry:latest
复制代码
查看镜像curl
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 3 months ago 25.8 MB
复制代码
运行registry容器测试
# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
ui
06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9
参数说明 -itd:在容器中打开一个伪终端进行交互操做,并在后台运行; -v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化; -p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了; --restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器; --name registry:建立容器命名为registry,你能够随便命名; registry:latest:这个是刚才pull下来的镜像;
测试镜像仓库中全部的镜像
# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
如今是空的,由于才刚运行,里面没有任何镜像内容。
修改源和镜像仓库
# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
# systemctl restart docker
复制代码
下载nginx镜像
# docker pull nginx
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 719cd2e3ed04 2 weeks ago 109MB
复制代码
为镜像打标签
# docker tag nginx:latest registry服务器:5000/nginx:kurisu
复制代码
格式说明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
nginx:lastest
这是源镜像,也是刚才pull下来的镜像文件;
registry服务器:5000/nginx:kurisu
这是目标镜像,也是registry私有镜像服务器的IP地址和端口;
查看效果
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry服务器:5000/nginx kurisu 719cd2e3ed04 2 weeks ago 109MB
nginx latest 719cd2e3ed04 2 weeks ago 109MB
复制代码
上传到镜像服务器
# docker push registry服务器:5000/nginx
The push refers to repository [registry服务器:5000/nginx]
Get https://registry服务器:5000/v2/: http: server gave HTTP response to HTTPS client
复制代码
这是报错了,须要https的方法才能上传,咱们能够修改下daemon.json来解决:
[root@node ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "registry服务器:5000"]
}
复制代码
添加私有镜像服务器的地址,注意书写格式为json,有严格的书写要求,而后重启docker服务:
# systemctl restart docker
再次上传:
# docker push registry服务器:5000/nginx
The push refers to repository [registry服务器:5000/nginx]
d7acf794921f: Pushed
d9569ca04881: Pushed
cf5b3c6798f7: Pushed
kurisu: digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe size: 948
复制代码
测试下载镜像
上传测试没问题了,咱们接下来测试一下从registry服务器上下载刚才上传的busybox镜像,先删除node主机上的镜像:
# docker rmi -f $(docker images -aq)
Untagged: registry服务器:5000/nginx:kurisu
Untagged: registry服务器:5000/nginx@sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe
Untagged: nginx:latest
Untagged: nginx@sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
Deleted: sha256:719cd2e3ed04781b11ed372ec8d712fac66d5b60a6fb6190bf76b7d18cb50105
Deleted: sha256:e9b6506fb887de50972aefd99d7c5eb56b1a8e757ed953cdfecb86b5359bcb22
Deleted: sha256:55d9d9692a9615a28d183a42bc3881a72a39393feba3664e669e7affb78daa76
Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e
复制代码
查看一下node主机上的镜像所有删除了:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
复制代码
而后,从registry服务器上下载nginx镜像:
# docker pull registry服务器:5000/nginx:kurisu
kurisu: Pulling from nginx
fc7181108d40: Pull complete
c4277fc40ec2: Pull complete
780053e98559: Pull complete
Digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe
Status: Downloaded newer image for registry服务器:5000/nginx:kurisu
复制代码
查看node主机上的镜像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry服务器:5000/nginx kurisu 719cd2e3ed04 2 weeks ago 109MB
复制代码
# curl http://registry服务器:5000/v2/_catalog
{"repositories":["nginx"]}
复制代码
# curl http://registry服务器:5000/v2/nginx/tags/list
{"name":"nginx","tags":["kurisu"]}
复制代码