参考文章:[Docker 技术入门与实战第3版]
仓库(Repository)是集中存放镜像的地方,又分公共仓库和私有仓库。
有时候容易把仓库与注册服务器(Registty) 混淆。实际上注册服务器是存放仓库的具体服务器,一个注册服务器上可以有多个仓库,而每个仓库下面可以有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或者目录。例如对于仓库地址 private-docker.com/ubuntu
来说,private-docker.com
是注册服务器地址,ubuntu
是仓库名。
Docker Hub 公共镜像市场
Docker Hub 是 Docker 官方提供的最大的公共镜像仓库,目前包括了超过 100000 的镜像,地址为 https://hub.docker.com
。 大部分对镜像的需求,都可以通过在 Docker Hub 中直接下载镜像来实现。
登录
可以通过命令行执行 docker login
命令来输入用户名,密码和邮箱来完成注册和登录。注册成功后,本地用户目录下会创建 .docker/config.json
文件,保存用户的认证信息。
登录成功的用户可以上传个人制作的镜像到 Docker Hub。
基本操作
用户无需登录即可通过 docker search
命令来查找官方仓库中的镜像,并利用 docker [image] pull
命令来将它下载到本地。
1 | $ docker search centos |
根据是否为官方提供,可将这些镜像资源分为两类:
- 一种类似于
centos
这样的基础镜像,也称为根镜像。这些镜像是由 Docker 公司创建,验证,支持,提供,这样的镜像往往使用单个单词作为名字; - 另一种类型的镜像,比如
ansible/centos7-ansible
镜像,是由 Docker 用户ansible
创建并维护的,带有用户名成为前缀,表明是某用户下的某仓库。可以通过用户名前缀"user_name/镜像名"
来指定使用某个用户提供的镜像。
例如,下载官方的 centos 镜像到本地:
1 | $ docker pull centos |
用户也可以在登录后通过 docker push
命令将本地的镜像推送到 Docker Hub。
自动创建
自动创建(Automated Builds)是 Docker Hub 提供的自动化服务,这一功能可以自动跟随项目代码的变更而重新构建镜像。
例如,用户构建了某应用镜像,如果应用发布新版本,用户需要手动更新镜像。而自动创建则允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 GitHub 或 BitBucket)上的项目,一旦项目发生新的提交,则自动执行创建。
要配置自动创建,包括以下的步骤:
- 创建并登陆 Docker Hub,以及目标网站如 GitHub;
- 在目标网站中允许 Docker Hub 访问服务;
- 在 Docker Hub 中配置一个 “自动创建” 类型的项目;
- 选取一个目标网站中的项目(需要含 Dockerfile)和分支;
- 指定 Dockerfile 的位置,并提交创建;
之后,可以在 Docker Hub 的 “自动创建” 页面中跟踪每次创建的状态。
第三方镜像市场
国内不少云服务商都提供了 Docker 镜像市场,包括腾讯云,网易云,阿里云等。下面以时速云为例,介绍如何使用这些市场。
查看镜像
访问 https://hub.tenxcloud.com
,即可看到已存在的仓库和存储的镜像,包括 Ubuntu
, Java
, Mongo
, MySQL
, Nginx
等热门仓库和镜像。
以 MongoDB 仓库为例,其中包括了 2.6,3.0 和 3.2 等镜像。
下载镜像
下载镜像也是使用 docker pull
命令,但是要在镜像名称前添加注册服务器的具体地址。格式为:
1 | index.tenxcloud.com/<namespace>/<repository>:<tag> |
例如,要下载 Docker 官方仓库中的 node:latest
镜像,可以使用如下命令:
1 | docker pull index.tenxcloud.com/docker_library/node:latest |
正常情况下,镜像下载会比直接从 Docker Hub 下载快得多。
下载后,可以更新镜像的标签,与官方标签保持一致,方便使用:
1 | docker tag index.tenxcloud.com/docker_library/node:latest node:latest |
搭建本地私有仓库
使用 registry 镜像创建私有仓库
安装 Docker 后,可以通过官方提供的 registry
镜像来简单搭建一套本地私有仓库环境:
1 | docker run -d -p 5000:5000 registry:2 |
这将自动下载并启动一个 registry
容器,创建本地的私有仓库服务。
默认情况下,仓库会被创建在容器的 /var/lib/registry
目录下。可以通过 -v
参数将镜像文件放在本地的指定路径。
例如下面的例子会将上传的镜像放到 /opt/data/registry
目录:
1 | docker run -d -p 5000:5000 --name hub.59izt.com -v /opt/data/registry:/var/lib/registry registry:2 |
此时,在本地将启动一个私有仓库服务,监听端口为 5000
管理私有仓库
首先部署私有仓库,查看其地址为 192.168.1.100:5000
,然后在虚拟机上测试上传和下载镜像。
- 先在虚拟机上查看已有的镜像:
1 | $ docker images |
- 使用
docker tag
命令将test
镜像标记为192.168.1.100:5000/test
1 | docker tag test:v0.1 192.168.1.100:5000/test |
- 使用
docker push
上传标记的镜像
1 | docker push 192.168.1.100:5000/test |
- 用
curl
查看仓库192.168.1.100:5000
中的镜像:
1 | $ curl http://192.168.1.100:5000/v2/search |
从结果中可以看到 {"description": "", "name": "library/test"}
,表明镜像已经成功上传了。现在可以在任意一台能访问到 192.168.1.100
地址的机器去下载这个镜像了。
比较新的 Docker 版本对安全性要求较高,会要求仓库支持 SSL/TLS
证书。对于内部使用的私有仓库,可以自行配置证书或关闭对仓库的安全性检查。
- 首先,修改 Docker
daemon
的启动参数,添加如下参数,表示信任这个私有仓库,不进行安全证书检查:
1 | DOCKER_OPTS="--insecure-registry 192.168.1.100:5000" |
之后,重启 Docker 服务,并从私有仓库下载镜像到本地
1 | docker pull 192.168.1.100:5000/test |