目标:掌握使用 docker commit , docker save, docker load, docker push 等命令 自制本地镜像仓库 local registry 及上传下载镜像
1.使用 docker commit 命令制作 tomcat 镜像,最新版的 tomcat 启动后,登录 localhost:8080 不会出现欢迎页面,原因是 webapps 目录是空的,所以,我对容器做了如下处理:
- 启动 tomcat 容器,将 webapps.dist 目录下的所有内容剪切到 webapps目录下,并删除默认的欢迎页面
docker run -it --name my-web tomcat /bin/bash
mv webapps.dist/* ./webapps/
rm webapps/ROOT/index.jsp
- 修改启动脚本 /usr/local/tomcat/bin/catalina.sh , 让脚本启动后自动生成 index.html 。在 脚本的 echo “Tomcat started.” 行后面加上一行: echo “hello, $(hostname -i)” > /usr/local/tomcat/webapps/ROOT/index.html 即可
echo "hello, $(hostname -i)" > /usr/local/tomcat/webapps/ROOT/index.html
- 使用 docker commit 命令将 上面修改后的 容器保存成镜像
docker commit my-web test/tomcat:t1
4. 使用 docker save 命令将 test/tomcat:t1 镜像保存成 本地 tar 文件
docker save -o tomcat-t1.tar test/tomcat:t1
- 将 tomcat-t1.tar 文件 传到 worker3 服务器上
scp tomcat-t1.tar root@192.168.250.188:/root/
6. 在 worker3 服务器 加载 test/tomcat:t1 镜像
docker load -i tomcat-t1.tar
docker images
7. 拉取 registry 镜像 ,运行 registry 容器搭建 本地 镜像仓库
### registry 是一个镜像分发服务
### 关于 registry 的用法 可以参考官方文档: https://distribution.github.io/distribution/about/deploying/
docker run -d --hostname local-registry --name my-image-repository --restart=always -p 5000:5000 -v /mnt/images/repository/:/var/lib/registry/docker/registry/ registry
8. 在 /etc/hosts 文件里面 配置 192.168.250.188 local-registry
### 192.168.250.188 为 worker3 服务器的 ip
sed -i '4a 192.168.250.188 local-registry' /etc/hosts
9. 为镜像 test/tomcat:t1 打一个新标签 ,然后将 镜像 push 到本地镜像仓库
### 第7步中设置的 --hostname local-registry 就是 本地镜像仓库的 主机名称,5000 是 registry 服务的端口
docker tag test/tomcat:t1 local-registry:5000/local/tomcat:t1
docker push local-registry:5000/local/tomcat:t1
注意:这一步报了一个错误 ‘Get “https://local-registry:5000/v2/”: http: server gave HTTP response to HTTPS client’ , 这个报错 的原因是本地仓库使用的 http协议,docker 默认的是 https 安全协议,解决这个问题,只需要在 /etc/docker/daemon.json 文件里面增加 一个 “insecure-registries”: [“local-registry:5000”] 即可
### 只需要 加 "local-registry:5000" 这一个就可以了,另外两个是其它的镜像仓库
cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.250.66:5000","my-repository:5000","local-registry:5000"]
}
### 重启 docker 服务
systemctl daemon-reload
systemctl restart docker.service
10. 将 之前的镜像 push 到本地镜像仓库,删除 镜像 再从本地镜像仓库拉取镜像
docker push local-registry:5000/local/tomcat:t1
docker images
docker rmi local-registry:5000/local/tomcat:t1
docker pull local-registry:5000/local/tomcat:t1
11. 在 worker3 服务器上 用 镜像 local-registry:5000/local/tomcat:t1 启动容器
docker run -it --name my-web local-registry:5000/local/tomcat:t1 /bin/bash
###在容器里面启动 tomcat
/usr/local/tomcat/bin/catalina.sh start
### 使用 curl 命令测试 localhost:8080
curl localhost:8080
说明:
- registry 是一个镜像分发服务,要充分理解 “docker run -d --hostname local-registry --name my-image-repository --restart=always -p 5000:5000 -v /mnt/images/repository/:/var/lib/registry/docker/registry/ registry” 的含义
例如,–hostname 指定的 是 本地镜像仓库 的 主机名,/mnt/images/repository/ 是镜像在 服务器上的存储位置
- 如果要在其它节点上 使用 local-registry:5000 镜像仓库,其它节点机器上以下两个地方需要做好相关配置:
/etc/hosts 文件要配置 192.168.250.188 local-registry
/etc/docker/daemon.json 文件需要配置
{
“insecure-registries”: [“local-registry:5000”]
}
后面会再写一篇文章介绍 在 内网环境 的 k8s 集群 中 如何使用 docker 的本地 镜像仓库