镜像管理
1.镜像的命名
一般情况下,镜像的命名是按照如下格式命名
服务器IP:端口/分类/镜像名:tag
如果不指定镜像,端口默认为 80,tag默认为 latest,分类也可以不写,如 dockers.io/nginx:latest
在把镜像上传到仓库的时候,镜像必须要按照这种格式命名,因为仓库地址就是由镜像前面的 IP 决定的。如果只是在本机使用镜像的话,可以随意命名
查看当前系统有多少镜像
如图这里还没有镜像
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
NAME 是要拉取的镜像的名称。
TAG 是可选的标签,指定了要拉取的特定版本。如果不指定标签,默认会拉取 latest 标签。
DIGEST 是镜像的摘要,它是唯一的并且不会改变,用于确保拉取的镜像是预期的。
例如,要拉取名为 nginx 的镜像的最新版本,可以使用以下命令:
[root@master ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
2.对镜像重新打标签
如果想给本地的镜像起一个新的名字,可以用tag,语法如下
[root@master ~]# docker tag 旧的镜像名 新的镜像名
#例如:有一个 nginx 镜像,标签为 latest, 下面我们要更改他的镜像名,以及将其打上新标签v1.21.5,如下:
[root@master ~]# docker tag nginx:latest zhenyu-nginx:v1.21.5
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhenyu-nginx v1.21.5 605c77e624dd 2 years ago 141MB
nginx latest 605c77e624dd 2 years ago 141MB
3.删除镜像
如果要删除镜像,语法如下:
[root@master ~]# docker rmi 镜像名:tag
比如把上面的nginx:latest删除:
[root@master ~]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
如果要删除多个镜像,可以在命令中指定它们的名称或 ID。例如:
[root@master ~]# docker rmi 镜像名1 镜像名2 镜像名3
如果要删除所有未被使用的镜像,可以使用 -f 或 --force 选项。这会强制删除所有未被使用的镜像。例如:
[root@master ~]# docker rmi -f $(docker images -q)
或:
[root@master ~]# docker image prune -af
解释一下这个命令:
docker image prune:这是 Docker 提供的用于清理镜像的命令。
-a, --all:删除所有未被使用的镜像,包括悬空镜像和没有标签的镜像。
-f, --force:强制删除,不需要确认。
因此,docker image prune -af 命令会立即删除所有未被使用的镜像,不需要用户确认。
4.查看镜像的结构
#首先重新pull一个镜像
[root@master ~]# docker pull nginx
如果我们需要查看某镜像的制作步骤,可以用 docker history 命令,
[root@master ~]# docker history 镜像名
查看刚刚pull的镜像结构
[root@master ~]# docker history nginx:latest
IMAGE CREATED CREATED BY SIZE COMMENT
605c77e624dd 2 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 2 years ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 2 years ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 2 years ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 2 years ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 2 years ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 2 years ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 2 years ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 2 years ago /bin/sh -c set -x && addgroup --system -… 61.1MB
<missing> 2 years ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~bullseye 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.1 0B
<missing> 2 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.5 0B
<missing> 2 years ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 2 years ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:09675d11695f65c55… 80.4MB
解释一下每个步骤:
CMD ["nginx", "-g", "daemon…:指定了容器启动时执行的命令。
STOPSIGNAL SIGQUIT:设置了容器的停止信号。
EXPOSE 80:指定容器监听的端口。
ENTRYPOINT ["/docker-entr…:指定了容器的入口点。
COPY file:09a214a3e07c919a…:复制了某个文件到镜像中。
COPY file:0fd5fca330dcd6a7…:复制了某个文件到镜像中。
COPY file:0b866ff3fc1ef5b0…:复制了某个文件到镜像中。
COPY file:65504f71f5855ca0…:复制了某个文件到镜像中。
set -x && addgroup --system -…:设置了一些环境变量,并添加了一个系统用户组。
ENV PKG_RELEASE=1~bullseye:设置了一个环境变量。
ENV NJS_VERSION=0.7.1:设置了一个环境变量。
ENV NGINX_VERSION=1.21.5:设置了一个环境变量。
LABEL maintainer=NGINX Do…:设置了一个标签。
CMD ["bash"]:指定了容器启动时执行的默认命令。
ADD file:09675d11695f65c55…:添加了一个文件到镜像中
5.导出镜像
在没有本地仓库的情况下,如何把本地已经pull下来的镜像传输到其他机器上呢?这里我们就需要把镜像导出为一个本地文件,然后在别一台机器上传。导出镜像的语法如下:
[root@master ~]# docker save 镜像名 > 文件名.tar
下面我们将本地的 nginx 导出为nginx.tar
[root@master ~]# ls
anaconda-ks.cfg
[root@master ~]# docker save nginx:latest > nginx.tar
[root@master ~]# ls
anaconda-ks.cfg nginx.tar
导出多个镜像,语法如下。
[root@master ~]# docker save 镜像名1 镜像名2 镜像名3 ... > file.tar
6.导入镜像
我们将上面导出的镜像在重新上传,
首先把镜像删除:
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
[root@master ~]# docker rmi -f 605c77e624dd
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
Deleted: sha256:b625d8e29573fa369e799ca7c5df8b7a902126d2b7cbeb390af59e4b9e1210c5
Deleted: sha256:7850d382fb05e393e211067c5ca0aada2111fcbe550a90fed04d1c634bd31a14
Deleted: sha256:02b80ac2055edd757a996c3d554e6a8906fd3521e14d1227440afd5163a5f1c4
Deleted: sha256:b92aa5824592ecb46e6d169f8e694a99150ccef01a2aabea7b9c02356cdabe7c
Deleted: sha256:780238f18c540007376dd5e904f583896a69fe620876cabc06977a3af4ba4fb5
Deleted: sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f
导入镜像语法如下:
[root@master ~]# docker load -i 文件名.tar
将nginx.tar 导入为镜像:
[root@master ~]# docker load -i nginx.tar
2edcec3590a4: Loading layer 83.86MB/83.86MB
e379e8aedd4d: Loading layer 62MB/62MB
b8d6e692a25e: Loading layer 3.072kB/3.072kB
f1db227348d0: Loading layer 4.096kB/4.096kB
32ce5f6a5106: Loading layer 3.584kB/3.584kB
d874fd2bc83b: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB