镜像管理
镜像概述
-
镜像就是创建容器所需要的模板,与容器是一对多的关系
-
镜像还可以在创建镜像时被其他镜像所调用,成为要创建镜像的父镜像
-
所有基础镜像的父镜像都为scratch,scratch是一个空的镜像 用于作为构建其他基础镜像的父镜像。
- scratch类似于 Java 中的object(Java 中所有类的父类),也类似于系统中的systemd进程
-
镜像中主要包含基础操作系统和所需要的内容
-
镜像是由 UnionFS 联合文件系统将多层文件系统叠加而成,这个虚拟文件系统加上宿主机的内核就形成了一个完整的虚拟Linux环境
- docker 默认的联合文件系统是 overlay2
-
镜像中的每一层都是只读的,镜像可以推送到docker仓库中被他人所拉取 生成容器
镜像 REPOSITORY
- 一个 Registry 中可以存在多个 Repository;
- Repository 可分为 “顶级仓库” 和 “用户仓库”;
- 用户仓库名称一般格式为:“用户名/仓库名”
- 每个 Repository 可以包含多个 Tag,每个 Tag 对应一个镜像
镜像管理相关命令:
- docker 命令有两种使用风格,以拉取镜像为例:
- 方法一:
docker image pull nginx:1.23 - 方法二:
docker pull nginx:1.23 - 以上两种写法均可以完成对镜像的拉取操作,但方法二比较简便,因此使用较多。
- 方法一:
- 获取帮助:
docker --helpdocker inspect --help
不同主机快速传输镜像
# 在存在镜像的主机执行:
docker save 镜像A 镜像B 镜像X | ssh root@目标IP 'docker load'
# 方法二,在存在镜像的主机执行:
docker images | grep -E 镜像名称 | awk '{print $1":"$2}' | xargs docker save | ssh -C root@目标IP "docker load"导出镜像
docker save可以将现有的镜像打包成tar格式的文件
#导出方法一
docker save -o /locadir/savefile.tar IMAGE1 [IMAGE2...]
#导出方法二
docker save IMAGE1 [IMAGE2...] > /locadir/savefile.tar
#导出多个镜像
docker save busybox nginx > /locadir/all.tar
或
docker save -o /locadir/all.tar busybox nginx导出镜像并压缩
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
...
nginx 1.23 ac8efec875ce 7 days ago 142MB
# 正常打包后的大小
# docker save nginx:1.23 -o ./nginx:1.23.tar
# ll -h ./nginx:1.23.tar
-rw------- 1 root root 140M Dec 13 22:47 ./nginx:1.23.tar
# 压缩成gz格式
# docker save nginx:1.23 | gzip > ./nginx:1.23.tar.gz
root@gitlab-server:~# ll -h ./nginx:1.23.tar.gz
-rw-r--r-- 1 root root 53M Dec 13 22:51 ./nginx:1.23.tar.gz
# 还原镜像:
gunzip -c ./nginx:1.23.tar.gz | docker load导入镜像
docker load可以将打包的镜像导入
# 导入镜像方法一
docker load -i /locadir/imagesfile
# 导入镜像方法二
docker load < /locadir/imagesfile删除镜像
-
docker rmi可以实现删除镜像 -
镜像对应容器正在运行则不能删除,除非将对应容器全部关闭 或者 -f 强制删除
- -f 强制删除时也会同时删除正在运行的容器
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest beae173ccac6 2 weeks ago 1.24MB
alpine latest c059bfaa849c 8 weeks ago 5.59MB
hello-world latest feb5d9fea6a5 3 months ago 13.3kB
centos latest 5d0da3dc9764 4 months ago 231MB
#删除镜像方法一
docker rmi centos
#删除镜像方法二
docker rmi alpine:latest
#删除多个镜像
docker rmi nginx tomcat
#删除全部镜像,慎用!
docker rmi `docker images -q`
或
docker images -q | xargs docker rmi
#批量删除<none>开头的镜像,方法一:
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
#批量删除<none>开头的镜像,方法二:
docker rmi $(docker images |grep '<none>'|awk '{print $3}')搜索镜像
-
docker search -
使用较少,通常都是在官方仓库官网上寻找合适的镜像
# 搜索镜像,官方镜像在official处会显示OK
docker search imagename下载镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]- docker 默认下载的镜像保存于:
/var/lib/docker/overlay2/镜像ID目录下
#下载镜像,不指定版本则下载最新版
docker pull alpine
#指定版本下载
docker pull alpine:6.6.6docker pull 下载镜像时提示 Error response from daemon: Get https://172.16.0.120:30002/v2/: http: server gave HTTP response to HTTPS client 的解决办法
这个错误的原因可能是docker使用了https协议去访问https://172.16.0.120:30002,但是该服务器只支持http协议。
解决方法是在Docker守护进程中添加允许HTTP访问配置,具体操作如下:
- 使用root身份编辑
/lib/systemd/system/docker.service文件:
sudo nano /lib/systemd/system/docker.service
- 在ExecStart行中加入
--insecure-registry选项,并将172.16.0.120:30002替换为实际的仓库地址:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 172.16.0.120:30002
- 保存修改后,重新加载systemctl配置文件并重启docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker.service
- 再次执行
docker pull命令,应该就可以正常下载镜像了。
查看镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
# 查看本机所有镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox unstable-glibc 39b7478ba37c 7 days ago 4.86MB
nginx 1.23 ac8efec875ce 8 days ago 142MB
# 输出说明
REPOSITORY # 镜像所属的仓库名称
TAG # 镜像的标签,如下载时为指定标签则默认为latest
IMAGE ID # 镜像的唯一ID标识,ID相同则表示镜像相同。因此有可能出现镜像相同而镜像名称不同的情况,但本质上是同一个镜像
CREATED # 镜像在仓库中被创建的时间
SIZE # 镜像的大小
# 查看指定REPOSITORY的镜像
# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23 ac8efec875ce 8 days ago 142MB查看镜像分层历史
- 查看镜像分层历史后,还可以进入单独一层的镜像进行操作。
# docker history centos7.9.2009:v1.0
IMAGE CREATED CREATED BY SIZE COMMENT
fb167ce759c8 3 minutes ago /bin/sh -c yum makecache && yum -y install … 495MB
410589d1adbe 6 minutes ago /bin/sh -c #(nop) COPY file:10bd0c16eb66bfb5… 2.52kB
1026fba06d50 6 minutes ago /bin/sh -c rm -fr /etc/yum.repos.d/* 0B
4d1ba4477c9f 6 minutes ago /bin/sh -c #(nop) LABEL maintainer=xiangzhe… 0B
e36d33e25bb2 6 minutes ago /bin/sh -c #(nop) LABEL version=1.0 0B
eeb6ee3f44bd 4 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 4 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
# 较旧的镜像
# docker run -it 4d1ba4477c9f sh
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
sh-4.2# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo CentOS-fasttrack.repo
CentOS-CR.repo CentOS-Media.repo CentOS-Vault.repo CentOS-x86_64-kernel.repo
sh-4.2# exit
exit
# 最新的镜像
# docker run -it fb167ce759c8 sh
sh-4.2# ls /etc/yum.repos.d/
CentOS-Base-7.repo查看镜像的详细信息
docker inspect可以查看 docker 各种对象的详细信息,包括:镜像、容器、网络等
# docker inspect busybox
...
# 也可以选择性查看
# docker inspect -f "{{.Created}}" 8f0e1ccddd5a
2021-09-30T10:10:41.25926759Z镜像打标签(起别名)
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]- TARGET_IMAGE[:TAG]格式一般形式:
仓库主机IP(或FQDN)[:端口]/项目名(或用户名)/image名字:版本 - 如未指定
:TAG,则默认为latest
- TARGET_IMAGE[:TAG]格式一般形式:
- 镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定仓库
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 16ea53ea7c65 2 weeks ago 1.24MB
# docker tag busybox busybox:6.6.6
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox 6.6.6 16ea53ea7c65 2 weeks ago 1.24MB
busybox latest 16ea53ea7c65 2 weeks ago 1.24MB镜像实际占用的磁盘空间
要查看Docker中镜像实际占用的磁盘空间,可以使用以下命令:
docker system df
该命令将显示Docker中各种对象(镜像、容器、卷、网络)占用的磁盘空间以及可使用的空间等详细信息。其中,使用-v选项可以显示详细信息,使用--format选项可以自定义输出信息的格式。
如果仅想查看镜像占用的磁盘空间,可以添加--format选项并指定以下格式字符串:
docker images --format '{{.Repository}}: {{.Size}}'
该命令将以表格形式显示每个镜像的名称和实际占用的磁盘空间(单位为字节),例如:
REPOSITORY SIZE
busybox 1.26MB
ubuntu 87.05MB
hello-world 977B
从中可以看到每个镜像的实际占用磁盘空间。
拉取 docker hub 上的镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker