导语
之前的分享中,我们介绍了关于Docker镜像的查询操作相关的内容,下面我们继续来介绍删除清理、导入导出、创建镜像等操作。
如何删除和清理镜像?
使用标签删除镜像
可以使用docker rmi 或者是 docker image rm 命令来删除镜像,它也包含了几个基本选项
- -f ,-force:强制删除镜像,即使它存在依赖性也进行删除
- -no-prune:不要清理未带标签的父镜像
bash
docker rmi IMAGE [IMAGE......]
bash
[root@localhost ~]# docker rmi myubuntu:new
Untagged: myubuntu:new
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 f9a80a55f492 8 weeks ago 63.2MB
[root@localhost ~]#
这里我们删除了一个myubuntu:new标签的镜像,并且这个删除操作对其他标签的相同镜像不会产生影响。但是如果在镜像中只存在了一个标签的时候,如果再使用删除命令,则会彻底删除镜像。
使用镜像ID来删除镜像
还是使用docker rmi命令 并且后面更上ID来删除镜像。需要注意的是,如果当镜像创建的容器存在的时候,镜像文件是无法被删除的。当然如果使用-f 参数进行强制删除的话也可以。但通常情况下不推荐使用-f参数来强制删除一个已经存在容器依赖的镜像。正确的做法应该是先删除依赖该镜像的所有容器,然后再去删除镜像。
bash
[root@localhost ~]# docker rmi f9a80a55f492
Error response from daemon: conflict: unable to delete f9a80a55f492 (must be forced) - image is being used by stopped container a9a05f9ef099
[root@localhost ~]#
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9a05f9ef099 ubuntu:18.04 "bash" 18 hours ago Exited (0) 18 hours ago hungry_cannon
[root@localhost ~]# docker rm a9a05f9ef099
a9a05f9ef099
[root@localhost ~]# docker rmi f9a80a55f492
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98
Deleted: sha256:f9a80a55f492e823bf5d51f1bd5f87ea3eed1cb31788686aa99a2fb61a27af6a
Deleted: sha256:548a79621a426b4eb077c926eabac5a8620c454fb230640253e1b44dc7dd7562
[root@localhost ~]#
清理镜像
在我们使用Docker一段时间之后,系统中可能会存在一些临时性的镜像文件,以及有些从来都没有使用过的镜像,这个时候,我们就可以使用docker image prune 命令来进行清理。
- -a , -all:删除鄋的无用镜像
- -filter filter:只清理符合过滤器的镜像
- -f ,-force:强制删除镜像
bash
[root@localhost ~]# docker image prune -f
Total reclaimed space: 0B
[root@localhost ~]#
如何创建镜像
创建镜像的方式有三种
- 基于已有镜像的容器进行创建
- 基于本地模板导入的方式
- 基于Dockerfile文件创建
基于已有容器创建
bash
docker [container] commit 命令
bash
docker [container] commit [OPTIONS] CONTAINER [REPOSITORY] [:TAG]
首先我们来创建一个镜像容器,并且在容器中创建一个标识文件。容器ID为5cb48f5d7103。
bash
[root@localhost ~]# docker run -it ubuntu:18.04 /bin/bash
root@5cb48f5d7103:/# touch test
root@5cb48f5d7103:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
root@5cb48f5d7103:/# exit
exit
[root@localhost ~]#
经过这一系列的操作,我们知道容器中镜像已经发生了变化,所以我们可以使用上面的命令来创建一个新的镜像。
bash
[root@localhost ~]# docker commit -m "add a new test file in root" -a "Docker New" 5cb48f5d7103 test:0.1
sha256:05268b440fd9d2cf31f5ee380969e0e196c670c6513cb0cedd2fc1419f9db7a7
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 05268b440fd9 16 seconds ago 63.2MB
ubuntu 18.04 f9a80a55f492 8 weeks ago 63.2MB
[root@localhost ~]#
创建完成之后运行该镜像查看是否有test文件
bash
[root@localhost ~]# docker run -it test:0.1 /bin/bash
root@cf40152b3907:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
root@cf40152b3907:/# exit
exit
[root@localhost ~]#
基于本地模板导入
可以直接操作一个系统模板文件来导入镜像,使用 docker [container] import 命令来是完成。
bash
docker [image] import [OPTIONS] file|URL -[REPOSITORY] [:TAG]
要想直接导入一个模板,我们可以使用OpenVZ来提供模板,或者使用导出的镜像来作为模板。
基于Dockerfile文件创建
基于Dockerfile文件是我们最为常见的一种创建镜像的方式。下面我们就来演示具体的操作过程。
首先需要创建一个Dockerfile的文件。
bash
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
然后执行如下的操作
bash
[root@localhost ~]# docker build -t nginx:0.1 .
Sending build context to Docker daemon 274MB
Step 1/2 : FROM centos
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
---> 5d0da3dc9764
Step 2/2 : RUN yum -y install wget && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" && tar -xvf redis.tar.gz
---> Running in 3198306bde68
CentOS Linux 8 - AppStream 54 B/s | 38 B 00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install wget && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" && tar -xvf redis.tar.gz' returned a non-zero code: 1
[root@localhost ~]#
完成之后会看到在镜像中出现了该镜像
bash
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 05268b440fd9 17 minutes ago 63.2MB
ubuntu 18.04 f9a80a55f492 8 weeks ago 63.2MB
centos latest 5d0da3dc9764 22 months ago 231MB
[root@localhost ~]#
总结
上面我们介绍了关于镜像的删除和清理,并且介绍了如何去创建一个镜像,在后续的分享中还会介绍到使用Dockerfile文件创建镜像的方式,希望大家多多关注。