共计 6577 个字符,预计需要花费 17 分钟才能阅读完成。
DockerHub 是什么
目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 2,650,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
我更愿意把他类比 github,docker 是存放镜像,github 是存放代码的。
这样自己制作的镜像就可以把它推送(docker push)到 DockerHub,要使用的时候直接拉取(docker pull),让开发更加灵活。
本次教程主要有三部分就教1. 如何使用 DockerHub,当然由于 DockerHub 在国内访问慢的原因,2. 将镜像推送到阿里云的 DockerHub 仓库,3. 创建一个私有 Docker 仓库。
一、使用 Docker Hub
Docker Hub 存放着 Docker 镜像 及其组件的所有资源。Docker Hub 可以帮助你与同事之间协作,并获得功能完整的 Docker。为此,它提供的服务有:
-
Docker 镜像主机
-
用户认证
-
自动镜像构建和工作流程工具,如构建触发器和 web hooks
-
整合了 GitHub 和 BitBucket
1. 创建 Docker Hub 账户
:https://hub.docker.com/,输入个人信息,如果有账号可以忽略。
2. 通过命令来登录
## 登录
# docker login
输入注册的账号和密码
账号是:starb
## 退出
# docker logout
输入用户名和密码。
3. 给镜像打个标签
你可以给现有的镜像添加标记,然后提交和构建。我们可以使用 docker tag
命令。让我们给 training/webapp
镜像添加一个新的标签。
1. 拉取镜像:
# docker pull training/webapp
Trying to pull repository docker.io/training/webapp
2. 查看镜像:
# docker images training/webapp
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/training/webapp latest 6fae60ef3446 7 years ago 349 MB
3. 重新打镜像:
# docker tag 6fae60ef3446 starb/webapp:v1.1
4. 查看新的标签:
# docker images starb/webapp
REPOSITORY TAG IMAGE ID CREATED SIZE
newtag/webapp v1.1 6fae60ef3446 7 years ago 349 MB
4. 向 Docker Hub 推送镜像
一旦你构建或创造一个新的镜像,你可以使用 docker push
命令推送到 Docker Hub。可以对其他人公开进行分享,或把它添加到你的私人仓库中。
# docker push starb/webapp:v1.1
The push refers to a repository [docker.io/newtag/webapp]
5f70bf18a086: Preparing
再进入你的 dockerHub 个人页面
有了刚才 push 的镜像。
可以把自己的
5. 把镜像设置为私有
私有需要登录之后才能拉取,免费的账号私有仓库只能是一个,公共仓库无限制。
6. 拉取刚才的镜像
在其他的服务器作为客户端就可以拉取镜像了
# docker pull starb/webapp:v1.1
二、使用阿里云 Docker 镜像仓库加速
官方镜像下载有时候实在是慢,于是开通了阿里云开发者帐号。
1. 阿里云 - 云容器 Hub 服务:
使用方法跟 DockerHub 大同小异,只是仓库地址改为阿里云的地址,速度比官网杠杠滴。
1. 登录阿里云 docker registry:
$ sudo docker login --username=funet8@163.com registry.cn-hangzhou.aliyuncs.com
登录 registry 的用户名是您的阿里云账号全名,密码是您开通服务时设置的密码。
你可以在镜像管理首页点击右上角按钮修改 docker login 密码。
2. 从 registry 中拉取镜像:
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/funetcentos6/centos7.1:[镜像版本号]
3. 将镜像推送到 registry:
$ sudo docker login --username=funet8@163.com registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/funetcentos6/centos7.1:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/funetcentos6/centos7.1:[镜像版本号]
其中 [ImageId],[镜像版本号] 请你根据自己的镜像信息进行填写。
注意您的网络环境
从 ECS 推送镜像时,可以选择走内网,速度将大大提升,并且将不会损耗您的公网流量。
如果您申请的机器是在经典网络,请使用 registry-internal.cn-hangzhou.aliyuncs.com 作为 registry 的域名登录, 并作为镜像名空间前缀
如果您申请的机器是在 vpc 网络的,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为 registry 的域名登录, 并作为镜像名空间前缀
sample:
使用 docker tag 重命名镜像,并将它通过私网 ip 推送至 registry:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry..aliyuncs.com/acs/agent:0.7-dfb6816
三、创建私有仓库 registry
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
安装运行 docker-registry
你可以使用官方 registry
镜像来运行。
# docker run -d -p 5000:5000 --restart=always --name registry registry
或者:
# docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac3a01e3641f registry "/entrypoint.sh /e..." 7 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp confident_aryabhata
这将使用官方的 registry
镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry
目录下。你可以通过 -v
参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry
目录。
在私有仓库上传、搜索、下载镜像
创建好私有仓库之后,就可以使用 docker tag
来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000
。
查看已有的镜像
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 81c944c2288b 2 weeks ago 24.1 MB
docker.io/adguard/adguardhome latest 18aae264c84e 8 weeks ago 81 MB
使用 docker tag 将 adguardhome 打标签
格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
# docker tag docker.io/adguard/adguardhome 127.0.0.1:5000/adguardhome:v1.0
查看:
# docker images|grep adguardhome
127.0.0.1:5000/adguardhome v1.0 18aae264c84e 8 weeks ago 81 MB
docker.io/adguard/adguardhome latest 18aae264c84e 8 weeks ago 81 MB
使用 docker push 上传标记的镜像
# docker push 127.0.0.1:5000/adguardhome:v1.0
The push refers to a repository [127.0.0.1:5000/adguardhome]
5f70bf18a086: Pushed
d4178a974467: Pushed
7a26e5e5ccf8: Pushed
e5bf41d9e3f6: Pushed
994393dc58e7: Pushed
v1.0: digest: sha256:2a474fedc96c41c3b1c48d1b1dacbfbe78fb194353dced082914bf5d1e5c2217 size: 1368
用 curl 查看仓库中的镜像。
$ # curl 127.0.0.1:5000/v2/_catalog
{"repositories":["adguardhome"]}
表明镜像已经被成功上传了。
删除镜像:
# docker image rm 127.0.0.1:5000/adguardhome:v1.0
# docker images|grep adguardhome
docker.io/adguard/adguardhome latest 18aae264c84e 8 weeks ago 81 MB
拉取镜像
# docker pull 127.0.0.1:5000/adguardhome:v1.0
Trying to pull repository 127.0.0.1:5000/adguardhome ...
v1.0: Pulling from 127.0.0.1:5000/adguardhome
Digest: sha256:2a474fedc96c41c3b1c48d1b1dacbfbe78fb194353dced082914bf5d1e5c2217
Status: Downloaded newer image for 127.0.0.1:5000/adguardhome:v1.0
查看镜像:
# docker images|grep adguardhome
127.0.0.1:5000/adguardhome v1.0 18aae264c84e 8 weeks ago 81 MB
docker.io/adguard/adguardhome latest 18aae264c84e 8 weeks ago 81 MB
配置非 https 仓库地址
如果你不想使用 127.0.0.1:5000
作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.1.3:5000
这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
# docker pull 192.168.1.3:5000/adguardhome:v1.0
Trying to pull repository 192.168.1.3:5000/adguardhome ...
Get https://192.168.1.3:5000/v1/_ping: http: server gave HTTP response to HTTPS client
这是因为 Docker 默认不允许非 HTTPS
方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS
访问的私有仓库。
Ubuntu 16.04+, Debian 8+, centos 7
对于使用 systemd
的系统,请在 /etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirror": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"insecure-registries": [
"192.168.1.3:5000"
]
}
再重启
测试
# docker pull 192.168.1.3:5000/adguardhome:v1.0
Trying to pull repository 192.168.1.3:5000/adguardhome ...
v1.0: Pulling from 192.168.1.3:5000/adguardhome
213ec9aee27d: Pull complete
31f9e8542749: Pull complete
35797e6c4bae: Pull complete
3c40b1afc955: Download complete
4f4fb700ef54: Download complete
Docker 镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
网易:https://hub-mirror.c.163.com/
阿里云:https://< 你的 ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com
当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。
https://cr.console.aliyun.com/
登录:
https://cr.console.aliyun.com/cn-shenzhen/instances/mirrors
配置镜像加速器
针对 Docker 客户端版本大于 1.10.0 的用户
您可以通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://otow63ff.mirror.aliyuncs.com"] # 可以设置自己的地址
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker