一、仓库说明
仓库(Repository)是集中存放镜像的地方。相对镜像和容器来说,对仓库的操作来说相对较少。
官方的镜像仓库地址为:https://hub.docker.com/,缺点,位于国外,有时候不能访问,而且速度有时候很慢。在使用kubeadm搭建k8s集群时,我一般都是用的阿里提供的公共镜像仓库registry.aliyuncs.com/google_containers下载相关k8s的基础组件,速度快 (无须注册,直接配置使用)。下图为使用阿里云提供的个人私有镜像仓库地址截图。
二、Docker Hub
官方维护的镜像库是Docker Hub,大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
1、注册
可以自行注册一个账号,收藏一些自己经常使用的镜像。
2、登陆
可以通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub,
登陆后就可以指定从自己的镜像仓库拉取推送镜像。可以通过 docker logout 退出登录。
[root@k8s-m1 ~]# docker login -u 332772194
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@k8s-m1 ~]# docker search centos #从官方仓库查找
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos DEPRECATED; The official build of CentOS. 7588 [OK]
kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 38
couchbase/centos7-systemd centos7-systemd images with additional debug… 7 [OK]
dokken/centos-stream-9 6
eclipse/centos_jdk8 CentOS, JDK8, Maven 3, git, curl, nmap, mc, … 5 [OK]
dokken/centos-7 CentOS 7 image for kitchen-dokken 5
dokken/centos-stream-8 4
continuumio/centos5_gcc5_base 3
dokken/centos-8 CentOS 8 image for kitchen-dokken 3
adoptopenjdk/centos7_build_image 1
spack/centos7 CentOS 7 with Spack preinstalled 1
spack/centos6 CentOS 6 with Spack preinstalled 1
......
[OK]
[root@k8s-m1 ~]# docker search docker.io/332772194/centos #从自己的仓库查找,需要详细指明
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
332772194/centos 0
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数、是否官方创建(OFFICIAL)、是否自动构建 (AUTOMATED)。
根据是否是官方提供,可将镜像分为两类。
一种是类似 centos 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 官方创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字,这类镜像往往比较大,镜像里面各种命令比较齐全,但不太适合做业务的基础镜像。
还有一种类型,比如eclipse/centos_jdk8 镜像,它是由 Docker Hub 的注册用户创建并维护的,往往带有用户名称前缀。可以通过前缀 username/ 来指定使用某个用户提供的镜像,比如eclipse用户。
另外,在查找的时候通过 --filter=stars=N 参数可以指定仅显示收藏数量为 N 以上的镜像。
3、拉取镜像
下载官方 centos 镜像到本地。
[root@k8s-m1 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos #可以看到官方镜像默认的下载地址为library
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Image is up to date for centos:latest
docker.io/library/centos:latest
[root@k8s-m1 ~]# docker tag centos:latest 332772194/centos:latest
[root@k8s-m1 ~]# vim initconfig.yaml ^C
[root@k8s-m1 ~]# docker push 332772194/centos:latest
The push refers to repository [docker.io/332772194/centos]
74ddd0ec08fa: Mounted from library/centos
latest: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529
4、推送镜像
用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。
[root@k8s-m1 ~]# docker tag centos:latest 332772194/centos:latest
[root@k8s-m1 ~]# docker push 332772194/centos:latest
The push refers to repository [docker.io/332772194/centos]
74ddd0ec08fa: Mounted from library/centos #可以看到其实推送也就是从官方仓库挂载到自己的仓库,节约空间
latest: digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc size: 529
三、私有仓库
有时候我们需要自己的私有仓库做业务使用,公司一般也不会允许将自己的业务镜像放在共有镜像库。在这先简单简绍一下用如何使用docker-registry搭建一个自己的私有仓库。缺点,删仓库里面的已有镜像麻烦,无法通过UI界面查看。
1、容器运行
使用官方提供的registry 镜像来搭建。
[root@k8s-m1 ~]# docker run -d -p 5000:5000 --restart=always --name registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete
0d96da54f60b: Pull complete
5b27040df4a2: Pull complete
e2ead8259a04: Pull complete
3790aef225b9: Pull complete
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
d7e4249bc56197893f8d3e7aff1f377da5988caaffb222d49f34619280a53dd4
这将使用官方的registry镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。可以通过 -v 参数来将镜像文件存放在本地的指定路径,防止容器异常时数据丢失。如下将上传的镜像放到本地的 /opt/data/registry 目录。
[root@k8s-m1 ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
在私有仓库上传、搜索、下载镜像
创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后使用 docker push上传标记的镜像到私有仓库。私有仓库地址为 127.0.0.1:5000。
[root@k8s-m1 ~]# docker tag registry:latest 127.0.0.1:5000/registry:latest
[root@k8s-m1 ~]# docker push 127.0.0.1:5000/registry:latest
The push refers to repository [127.0.0.1:5000/registry]
aeccf26589a7: Pushed
f640be0d5aad: Pushed
aa4330046b37: Pushed
ad10b481abe7: Pushed
69715584ec78: Pushed
latest: digest: sha256:36cb5b157911061fb610d8884dc09e0b0300a767a350563cbfd88b4b85324ce4 size: 1363
用 curl 查看仓库中的镜像。
[root@k8s-m1 ~]# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["registry"]}
这里可以看到 {“repositories”:[“registry”]},表明镜像已经被成功上传了。
先删除已有镜像,再尝试从私有仓库中下载这个镜像。
[root@k8s-m1 ~]# docker rmi 127.0.0.1:5000/registry:latest
Untagged: 127.0.0.1:5000/registry:latest
Untagged: 127.0.0.1:5000/registry@sha256:36cb5b157911061fb610d8884dc09e0b0300a767a350563cbfd88b4b85324ce4
[root@k8s-m1 ~]# docker pull 127.0.0.1:5000/registry:latest
latest: Pulling from registry
Digest: sha256:36cb5b157911061fb610d8884dc09e0b0300a767a350563cbfd88b4b85324ce4
Status: Downloaded newer image for 127.0.0.1:5000/registry:latest #可以看到是从自己搭建的私有仓库拉取的镜像
127.0.0.1:5000/registry:latest
配置非 https 仓库地址(重要)
默认情况下,只能使用 127.0.0.1:5000 作为仓库地址,但是这样的话就只能本机能使用仓库。但是如果我们想让本网段的其他主机也能把镜像推送到私有仓库。例如192.168.2.140:5000 这样的内网地址作为私有仓库地址,默认情况下我们会发现无法成功推送镜像。这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者通过添加证书相关的配置就能够使用 HTTPS 访问的私有仓库(后续分享)。
以 centos 7为例
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
[root@k8s-m1 ~]# docker tag registry:latest 192.168.2.140:5000/registry:latest
[root@k8s-m1 ~]# docker push 192.168.2.140:5000/registry:latest
The push refers to repository [192.168.2.140:5000/registry]
Get https://192.168.2.140:5000/v2/: http: server gave HTTP response to HTTPS client #默认的报错信息
[root@k8s-m1 ~]# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://fz5yth0r.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com/",
"https://docker.mirrors.ustc.edu.cn/",
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.2.140:5000"
],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
[root@k8s-m1 ~]# systemctl restart docker
#需重启使配置生效,注意该文件必须符合 json 规范,否则 Docker 将不能启动,此处我原先加入了一些额外的配置,
不需要可以删除,但是注意格式注意格式注意格式!!!!
[root@k8s-m1 ~]# docker push 192.168.2.140:5000/registry:latest
The push refers to repository [192.168.2.140:5000/registry]
aeccf26589a7: Layer already exists
f640be0d5aad: Layer already exists
aa4330046b37: Layer already exists
ad10b481abe7: Layer already exists
69715584ec78: Layer already exists
latest: digest: sha256:36cb5b157911061fb610d8884dc09e0b0300a767a350563cbfd88b4b85324ce4 size: 1363