仓库(Repository)就是集中存放镜像的地方。一个容易混淆的概念是注册服务器(Registry),实际上注册服务器是管理仓库的具体服务器,一个注册服务器下可以有多个仓库,一个仓库下可以有多个镜像。从这方面来说,仓库可以被认为一个具体的项目或目录,例如:dl.dockerpool.com/ubuntu
,dl.dockerpool.com
是注册服务器地址,而ubuntu
是仓库名
目前Docker官方维护了一个公共仓库Docker Hub
,其中的镜像已经超过了10w+,大部分的需求都可以通过在Docker Hub中直接下载镜像来实现:
注册:你可以在https://cloud.docker.com
免费注册一个Docker账号
登录:可以通过docker login
命令交互式的输入用户名与密码,登录Docker Hub。可以通过docker logout
退出登录
拉取镜像:你可以通过docker search
命令来查找官方仓库中的镜像,并利用docker pull
命令将它下载到本地。如下:
root@ubuntu:~# docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 8032 [OK]
dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 197 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 156 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 94 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 87 [OK]
neurodebian NeuroDebian provides neuroscience research s… 50 [OK]
ubuntu-debootstrap debootstrap --variant=minbase --components=m… 39 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 38 [OK]
nuagebec/ubuntu Simple always updated Ubuntu docker images w… 23 [OK]
tutum/ubuntu Simple Ubuntu docker images with SSH access 18
i386/ubuntu Ubuntu is a Debian-based Linux operating sys… 13
ppc64le/ubuntu Ubuntu is a Debian-based Linux operating sys… 12
1and1internet/ubuntu-16-apache-php-7.0 ubuntu-16-apache-php-7.0 11 [OK]
字段释义:
NAME
:镜像名称DESCRIPTION
:镜像描述STARS
:收藏数,表示该镜像的关注度OFFICIAL
:是否官方创建AUTOMATED
:是否自动创建,AUTOMATED
允许验证镜像的来源和内容根据是否由官方提供,可以将镜像分为两类:
ubuntu
这样的镜像,被称为基础镜像或根镜像。这些镜像有Docker公司创建、验证、支持、提供,这样的镜像往往使用单个单词作为名字i386/ubuntu
镜像。它是由Docker的用户创建并维护的,往往带有用户名称前缀。推送镜像:用户也可以在登录之后,通过docker push
命令来推送自己的镜像到Docker Hub,例如:
root@ubuntu:~# docker tag ubuntu:16.04 dockeryang/ubuntu:16.04
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockeryang/ubuntu 16.04 5e8b97a2a082 6 weeks ago 114MB
ubuntu 16.04 5e8b97a2a082 6 weeks ago 114MB
root@ubuntu:~# docker push dockeryang/ubuntu:16.04
切记,以上命令中的dockeryang
替换成你自己的Docker账号用户名
有时候使用Docker Hub
这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用
容器运行:你可以获取官方的registry
镜像来运行:
docker run -d -p 5000:5000 --name my_registry --restart=always registry
这将使用官方的registry
镜像来启动私有仓库,默认情况下,仓库会被创建在容器的/var/lib/registry
目录之下。在之前,容器存储层应该保持无状态化,容器运行时应尽量保持容器内不发生任何写入操作,我们可以通过-v
参数来将镜像存放在本地的指定目录,如下:
docker run -d -p 5000:5000 --name my_registry --restart=always -v /opt/lib/registry:/var/lib/registry registry
这样一来,镜像都会存放在本地的/opt/lib/registry
目录之下
上传镜像:建立好私有仓库之后,我们就可以使用docker tag
命令来标记一个镜像,然后将其推送到私有仓库,例如:
root@ubuntu:~# docker tag ubuntu:16.04 127.0.0.1:5000/ubuntu:16.04
root@ubuntu:~# docker push 127.0.0.1:5000/ubuntu:16.04
上传完成之后,我们可以使用curl
命令来查看仓库中的镜像:
root@ubuntu:~# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubuntu"]}
这里可以看到{"repositories":["ubuntu"]}
,表明镜像已经被成功上传了
注意:如果你不想使用127.0.0.1:5000
作为仓库地址,想让本网段的其他主机也能把镜像推送到私有仓库,你就得把例如192.168.0.89:5000
这样的内网地址作为私有仓库地址。
如果你发现使用127.0.0.1
或者你的内网地址无法推送时,不妨在/etc/docker/daemon.json
文件(如果文件不存在,请新建)中加入以下内容:
{
"registry-mirror": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.0.89:5000"
]
}
然后重启Docker服务:
systemctl restart docker
值得注意的是,上面例子中192.168.0.89
为博主机器的内网地址,需根据自己的实际情况进行替换!