无论我们使用docker pull 【具体镜像名称】命令拉取镜像,还是在Kubernetes中编写yaml文件的时候,使用image: 【具体镜像名称】,其实都是从docker公共镜像仓库拉取的,一般公共镜像仓库中有很多通用的镜像文件,比如MySQL,Redis,Nginx,busybox等等。
但是对于一个私有项目来说,不可能将定制化的应用镜像放到docker的公共镜像仓库中,这时,搭建一个私有镜像仓库就非常有必要了。
本实验主要测试一下在DockerHub上创建个人镜像仓库的操作。
实验准备:
1)DockerHub,需要注册账号,本次实验使用的账号tianyangqi.
2)Docker环境,使用docker命令测试镜像
3)K8S集群环境,用于测试从私有镜像拉取busybox镜像
步骤一:在Docker环境下,向DockerHub上推送和拉取自定义镜像。进入docker环境,确定安装了docker,然后查看本地镜像。
docker version //查看安装的Docker版本
docker images //查看下载到本地的镜像
既然看到了busybox镜像,那么就用这个镜像来制作“自定义镜像”,其实就是重命名一下。如果要制作一个纯的“自定义镜像”,那就要自己开发代码,然后通过dockerfile打包成镜像,由于本实验主要的目的是演示镜像仓库,所以就来个不纯的吧。
docker tag [本地镜像id] [账号]/[自定义镜像名称] //打包镜像
然后推送自定义镜像到DockerHub中的tianyangqi账户下的镜像仓库中,在推动镜像之前,需要通过docker login命令登录DockerHub,根据提示输入用户名和密码。否则访问会被拒绝。
登录DockerHub官网,然后可以看到已推送的“自定义镜像”——busybox-test.
验证一下拉取镜像,为了避免混淆,先删除本地刚才打包的“自定义镜像”——busybox-test,然后再从DockerHub的tianyangqi个人镜像仓库中拉取镜像。
步骤二:通过k8s集群,从DockerHub的个人镜像仓库拉取镜像。首先仍然确认docker login的,只有登录了,才会在当前账号的家目录下生成一个config.json文件,在k8s集群中要通过这个json文件制作secret凭证。
cat ~/.docker/config.json | base64 -w 0 //务必记录好生成的这串信息,不要换行
然后新建一个secret的yaml文件,就叫myregistry-secret.yaml.
apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: 替换成刚才用config.json生成的那串老长的信息。
创建并检查secret凭证
kubectl apply -f myregistry-secret.yaml //创建secret
kubectl get secret mysecret //查看secret
创建Pod资源来测试一下,看看是否可以从DockerHub的tianyangqi镜像仓库中拉取busybox-test镜像。既然前面已经演示过Deployment资源了,就索性用Deployment创建pod完成测试。此测试文件命名为dockerhub-myregistry-dep.yaml.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myreg-dep
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: tianyangqi/busybox-test:latest
imagePullSecrets:
- name: mysecret
相关代码的主要解释如下图:
创建测试deployment资源,查看pod创建信息。
kubectl apply -f dockerhub-myregistry-dep.yaml //创建
kubectl get pod //查看Pod
kubectl describe pod [pod名称] //查看具体pod的描述信息
“自定义镜像”(tianyangqi/busybox-test)确实拉取成功了,之所以由Deployment创建的两个pod的运行状态不是Running,这跟busybox镜像本身有关,此镜像就是一个包含很多Linux命令的工具包,安装完成后就结束了。
DockerHub中的tianyangqi相当于一个线上的私有镜像仓库,可以推送自定义镜像到该仓库中,而docker本身是负责推送和拉取镜像,以及打包镜像,k8s中的Secret资源就是一个在集群中的登录凭证,相当于令牌或密钥,里面包含了tianyangqi账号的相关登录信息;最后使用deployment创建pod测试镜像的拉取。
最后附上一个更换了Nginx镜像的实验截图,即tianyangqi/nginx-test(基于nginx镜像自定义的)。可以看到,Pod运行正常,处于Running状态了。