跳到主要内容

docker镜像

docker镜像

1、镜像是什么

镜像是什么?
• 一个分层存储的文件,不是一个单一的文件
• 一个软件的环境
• 一个镜像可以创建N个容器
• 一种标准化的交付
• 一个不包含Linux内核而又精简的Linux操作系统

2、镜像下载

方法 1:从公网 docker hub 拉取(下载)image

[root@docker ~]## docker pull centos ##默认不加版本号的话,是使用latest版本。
Using default tag: ladockerError response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

##可能会报错,因为网络的问题,无法连接到 dockerhub 下载镜像,可以多次尝试下载下。
##下载速度很慢,真的很慢。
##解决:使用vpn或者换一个国内的 docker 镜像下载地址(常见的有阿里云,清华源,163等);

方法 2:使用阿里云 docker 镜像加速器,提升 pull 的速度【荐】

1.获取阿里云自己专有的镜像加速器地址

你只需要登录容器Hub服务 [https://cr.console.aliyun.com的控制台,使用你的支付宝帐号,第一次登录时,需要设置一个独立的密码,左侧的加速器帮助页面就会显示为你独立分配的加速地址.](https://cr.console.aliyun.xn--com-s18da6w2d20dcrxvga87aprh8yjuah7cea1nm2xdeu48c59dsk760go3av3f84rp7aeza51yl89asik2ngjucv06eewzdma428s8zl5jagndl442oxind2rra048bkq1e7m3gllya4o5coa127nvi9eeueyxs6u98ljagl.)

##本人的阿里云镜像加速器地址为:
https://kvuwuws2.mirror.aliyuncs.com

##命令如下:
sudo mkdir -p /etc/dockersudo
tee /etc/docker/daemon.json <<-'EOF
'{
"registry-mirrors": ["https://kvuwuws2.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

####### 📍 说明:docker常见国内镜像仓库源

1.默认docker镜像仓库地址:
https://index.docker.io/v1/

2.国内常见docker镜像仓库地址
https://kvuwuws2.mirror.aliyuncs.com ##自己阿里云docker镜像加速地址
http://hub-mirror.c.163.com ##网易
https://dockerhub.azk8s.cn ##上海蓝云网络科技有限公司

镜像源可以添加多个,根据自己的网络环境选择速度快的,这里给大家添加了 3 个老师常用的(阿里、网易、上海蓝云网络科技有限公司):

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://kvuwuws2.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://dockerhub.azk8s.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker

##扩展:azk8s.cn 这个域名是上海蓝云网络科技有限公司的。上海蓝云网络科技有限公司于2013年3月成立,由世纪互联与门为在中国境内提供Windows Azure和 Office 365 服务而成立,为世纪互联的全资子公司。
2.配置docker镜像地址
##直接执行如下代码即可:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://kvuwuws2.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://dockerhub.azk8s.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker


备注:
##我们在安装了docker服务后,默认在就会生成/etc/docker目录了,以上命令再次创建了/etc/docker目录,是没问题的,原来目录下的文件不会被覆盖的;

验证:

在最后,可以看到镜像仓库的地址,已经改为阿里云了,原来默认镜像仓库的地址还在,但是默认会优先使用刚添加的阿里云地址的;
[root@docker ~]##docker info

再下载,就可以了,可以发现下载速度贼快:

[root@docker ~]##docker images
[root@docker ~]##docker pull centos

  • 还有另一种方法:修改 docker 服务启动脚本**(不推荐使用)**
##以下只是提供了一种方法,本次并未采用此种方式。
[root@docker ~]## vim /usr/lib/systemd/system/docker.service
改:14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
为:14 ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://kvuwuws2.mirror.aliyuncs.com --containerd=/run/containerd/containerd.sock

重启 docker 服务使 daemon.json 生效
[root@docker ~]## systemctl daemon-reload ##叧有修改了 systemd 服务脚本,才需要重新加载。如果修改配服务的置文件,不需要执行这个。
[root@docker ~]## systemctl restart docker

方法 3:把之前下载好的 image 镜像导入:docker load命令

把 docker-Centos7.tar 镜像上传到 linux 上 参数: -i docker-Centos7.tar 指定载入的镜像归档

[root@docker ~]## docker load -i /root/docker-Centos7.tar

方法 4:直接下载其他站点的镜像

[root@docker ~]## docker pull hub.c.163.com/library/tomcat:latest

📍 如何查找某个docker镜像仓库里是否包含这个镜像?

  • docker search 镜像名默认是在dockerhub镜像仓库地址去查询的
[root@xyy admin]##docker search busybox

💖那么现在有个问题,我想知道刚才不是配置了一些国内镜像仓库源嘛,我想知道他们里面有没有我需要的镜像该怎么办呢? 好像没什么办法,只能使用docker pull 镜像名去下载看效果了,如果没有下载成功的话,说明刚才配置的国内镜像仓库和dockerhub镜像仓库都没有这个镜像。

📍 要区别软件仓库和进项仓库的区别

下面这个docker-cekubernetes是一些repo yum仓库地址,和前面配置的进项源是不是一个东西。

https://developer.aliyun.com/mirror/?spm=a2c6h.13651102.0.0.4eb31b118TdrcO&serviceType=mirror&tag=%E5%AE%B9%E5%99%A8

01.软件仓库

以centos为例,是放在/etc/yumrepo.d/下以.repo结尾的文件,可以用来下载系统所需要的各种软件包。

[root@xyy admin]##ls /etc/yum.repos.d/
backup-2021-11-15 CentOS-Base.repo docker-ce.repo epel.repo epel-testing.repo
[root@xyy admin]##

02.镜像仓库

从这些地址可以下载容器运行所需要的镜像。

[root@xyy admin]##cat /etc/docker/daemon.json 
{
"registry-mirrors":["https://kvuwuws2.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://dockerhub.azk8s.cn"]
}

https://index.docker.io/v1/ ##dockerhub官方仓库地址

3、镜像发布

方法 1:Save Image To TarBall

1.常规导出tar包(注意:这是个tar包,不是压缩包!!!)

保存 Image 到 tar 包:

1、导出镜像到本地
语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签 (tar包)
语法:docker save 本地镜像名:镜像标签 | gzip > 导出的镜像名.tar.gz (压缩包)

2、导入本地镜像
语法:docker load -i xxxx.tar/.tar.gz (本地镜像)

📍 实际测试过程

  • 先下载一个测试镜像
[root@master ~]##docker pull httpd:2
[root@master ~]##docker images

  • docker  save导出本地镜像
[root@master ~]##docker save -o docker-httpd-image.tar httpd:2 ##注意:这个是tar包,不是压缩包:

  • 查看:导出镜像成功。

  • 注意:这个是tar包,不是压缩包
docker save -o nginx.tar nginx ##导出镜像为tar包
tar xvf nginx.tar ##解压tar包

2.压缩镜像后导出tar.gz包 😋(推荐)

互劢:如果觉得导入的 tar 包太大?如何缩小?

语法:docker save 本地镜像名:镜像标签 | gzip > 导出的镜像名.tar.gz

做法:

[root@master ~]##docker save httpd:2 |gzip > docker-httpd-image2.tar.gz

查看: 注:发现少了 1 半的大小。 所以压缩效果徆明显。

3.一次性导出多个镜像
一次性导出多个包:docker save 镜像1 镜像2 -o 包名

导入:docker load -i 包名

##打包的时候是几个镜像导入就是几个镜像
4.离线docker镜像包制作方法(详细用法见自己另一篇博客)
技巧 1:批量导出机器所有镜像制作docker镜像离线包

工作中,如果想把物理机上所有镜像导出,制作成 docker 镜像离线包,可以使用以下命令:

[root@master ~]##docker save `docker images | cut -f1 -d ' ' | sed -n '2,$p'` |gzip > k8s-images-v1.20.4.tar.gz
  • 测试结果截图

  • cut命令、sed命令测试过程
[root@master ~]##docker images | cut -f1 -d ' ' | sed -n '2,$p'

## cut 参数 -f1 打印第 1 列, -d‘ ’ 以空格作为分隔符
## sed 命令参数 -n :只打印匹配的行 ; sed 的编辑命令参数 p 打印匹配行,和-n 一起合用

技巧 2:如果想把整个集群中所有机器上的镜像,都打包成一个镜像,可以执行以下命令
语法如下:docker save 镜像名 | gzip |ssh root@192.168.1.63 'cat | docker load'

1、先将 node 节点上所有镜像远程导入到 master上:
[root@xuegod64 ~]## docker save `docker images | cut -f1 -d ' ' | sed -n '2,$p'` | gzip |ssh root@192.168.1.63 'cat | docker load'

2、master 上拥有所有 docker 镜像后,再在 master 上,把镜像统一导出一下
[root@xuegod63 ~]## docker save `docker images | cut -f1 -d ' ' | sed -n '2,$p'` |gzip > k8s-images-v1.20.4.tar.gz注:我就是这样,把集群中的所有镜像,打包成一个包的。方便后期使用
  • 自己测试过程

如下,是一个已经以kubeadm搭建好的k8s集群:

master节点镜像:

node1/node2节点镜像:

  • 现在,我就针对这个v1.20.0版本的k8s集群导出一个离线镜像包,并进行kubeadm离线方式部署k8s集群实验
  • 自己实际命令如下

1、将node1的all镜像导入到master节点:

##在node1上执行:[root@k8s-node1 ~]##docker save `docker images | cut -f1 -d ' ' | sed -n '2,$p'` | gzip |ssh root@172.29.9.31 'cat | docker load'

2、将node2的all镜像导入到master节点:

##在node2上执行:[root@k8s-node2 ~]##docker save `docker images | cut -f1 -d ' ' | sed -n '2,$p'` | gzip |ssh root@172.29.9.31 'cat | docker load'

3、master 上拥有所有 docker 镜像后,再在 master 上,把镜像统一导出一下

[root@k8s-master ~]## docker save `docker images | cut -f1 -d ' ' | sed -n '2,$p'` |gzip > k8s-images-v1.20.0.tar.gz

备注:查看当前k8s版本

[root@k8s-node1 ~]##kubeadm version[root@k8s-node1 ~]##rpm -qa|grep kube

如此,可以制作离线kubeadm安装k8s集群了,good。

导入语法:

docker load -i xxxx.tar/.tar.gz(本地镜像)##说明:这里是可以导入.tar包或者.tar.gz包的
  • 查看本地镜像

  • 查看本地已经存在的镜像

  • 开始导入并观察现象

可以发现,本地镜像已经成功导入了,我们就可以方便使用镜像了。

  • 这里再次测试下看能否导入.tar.gz包(.tar.gz压缩包完全也可以导入成功)

方法 2:Push Image To Docker Hub 发布到外网

1、Signup on docker hub & create repo 注册一个帐号https://hub.docker.com/
2、Login to docker hub
## docker login -u userabc -p abc123 -e userab@gmail.com
3、Push image to docker hub
##上传镜像## docker push centos:httpd
4、Pull image from docker hub
##下载镜像## docker pull userabc/centos:httpd-v2
## 用户名/镜像名

方法 3: 使用阿里云的私有仓库来发布你的镜像

请查看我的另一篇博客:实战-使用harbor搭建Docker私有仓库和使用阿里云私有仓库存储自己的docker镜像-(超详细-成功测试-博客输出)-20210529

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://47.97.48.237/ (即将上线域名:onedayxyy.cn)

image-20230917111843405

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230912072007284

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎 https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!