主页
文章
分类
标签
关于
docker镜像与容器的删除
发布于: 2025-5-18   更新于: 2025-5-18   收录于: docker
文章字数: 2261   阅读时间: 5 分钟   阅读量:

前言

记录docker镜像和容器的主要删除流程,在容器已经运行的情况下,整个流程为 关闭容器->删除容器->删除镜像。但是也可以在容器没用删除的情况下强制删除镜像,这并不影响已经运行的容器,因为容器层已缓存镜像数据。下面先记录容器的删除方法。

docker容器的删除

选定容器

在命令行中打出指令docker ps我们可以看到已经运行的容器,打出docker ps -a 我们可以看到所有的包括停止的容器,这里我们以已经运行的容器为例

1
2
3
4
5
6
jy@jy:~$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED        STATUS       PORTS                                                  NAMES
2ee4b14eafdc   watch-fastapi-frontend   "nginx -g 'daemon of…"   7 weeks ago    Up 7 weeks   0.0.0.0:2153->80/tcp, :::2153->80/tcp                  WatchWeb
51475095e8f3   watch-fastapi-backend    "/start.sh"              7 weeks ago    Up 7 weeks   0.0.0.0:1339->80/tcp, :::1339->80/tcp                  WatchFastAPI
144b14ff66c1   mongo                    "docker-entrypoint.s…"   8 weeks ago    Up 7 weeks   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4                "docker-entrypoint.s…"   2 months ago   Up 7 weeks   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test

假定我们要删除name为WatchWeb的容器,它的CONTAINER ID为2ee4b14eafdc

直接删除

现在我们先来直接删除该容器看看,输入docker rm <CONTAINER ID>

1
2
jy@jy:~$ docker rm 2ee4b14eafdc
Error response from daemon: cannot remove container "/WatchWeb": container is running: stop the container before removing or force remove

它会提示我们因为容器正在运行我们不能直接删除,需要先关闭容器再删除

关闭容器后删除容器

现在我们先关闭容器docker stop <CONTAINER ID>,再删除看看

1
2
3
4
5
6
7
8
9
jy@jy:~$ docker stop 2ee4b14eafdc
2ee4b14eafdc
jy@jy:~$ docker rm 2ee4b14eafdc
2ee4b14eafdc
jy@jy:~$ docker ps 
CONTAINER ID   IMAGE                   COMMAND                  CREATED        STATUS       PORTS                                                  NAMES
51475095e8f3   watch-fastapi-backend   "/start.sh"              7 weeks ago    Up 7 weeks   0.0.0.0:1339->80/tcp, :::1339->80/tcp                  WatchFastAPI
144b14ff66c1   mongo                   "docker-entrypoint.s…"   8 weeks ago    Up 7 weeks   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4               "docker-entrypoint.s…"   2 months ago   Up 7 weeks   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test

现在我们成功删除了指定容器

docker镜像的删除

选定镜像

在命令行中打出指令docker images

1
2
3
4
5
6
jy@jy:~$ docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
watch-fastapi-frontend   latest    8aa2b29a6def   7 weeks ago    19.2MB
watch-fastapi-backend    latest    a0ae26dc32c9   7 weeks ago    1.07GB
mongo                    latest    b81a621037ef   2 months ago   887MB
mysql                    8.4       f742bd39cd6b   9 months ago   584MB

我们刚刚删除了镜像watch-fastapi-frontend的容器,我们选择对应容器还在运行的镜像watch-fastapi-backend

直接删除

在容器还在运行的情况下,我们来试一下直接删除镜像docker rmi <IMAGE ID>:

1
2
jy@jy:~$ docker rmi a0ae26dc32c9
Error response from daemon: conflict: unable to delete a0ae26dc32c9 (cannot be forced) - image is being used by running container 51475095e8f3

它会提示我们无法删除对应镜像,因为当前镜像正在被一个运行中的容器使用。

停止容器后删除镜像

那我们停止一下容器,再去删除镜像

1
2
3
4
jy@jy:~$ docker stop 51475095e8f3
51475095e8f3
jy@jy:~$ docker rmi a0ae26dc32c9
Error response from daemon: conflict: unable to delete a0ae26dc32c9 (must be forced) - image is being used by stopped container 51475095e8f3

我们已经停止了容器,但是它认提示我们无法删除镜像,因为镜像被一个停止中的容器使用

删除容器后删除镜像

我们先删除容器,再去删除镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
jy@jy:~$ docker rm 51475095e8f3
51475095e8f3
jy@jy:~$ docker rmi a0ae26dc32c9
Untagged: watch-fastapi-backend:latest
Deleted: sha256:a0ae26dc32c977d80711c08280c5ff1f698cb5da10ef6d1c297ccfbcd8c47896
jy@jy:~$ docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
watch-fastapi-frontend   latest    8aa2b29a6def   7 weeks ago    19.2MB
mongo                    latest    b81a621037ef   2 months ago   887MB
mysql                    8.4       f742bd39cd6b   9 months ago   584MB

现在镜像已经被成功删除了

强制删除

在容器运行的情况下强制删除镜像

我们将一个镜像重新运行起来

1
2
3
4
5
6
7
jy@jy:~$ docker run --name test -d 8aa2b29a6def
54130cc4bdbf1b1e370c50fa98e7caaed922740de85b4fee30e261e77ffcd5de
jy@jy:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
54130cc4bdbf   8aa2b29a6def   "nginx -g 'daemon of…"   2 seconds ago   Up 2 seconds   80/tcp                                                 test
144b14ff66c1   mongo          "docker-entrypoint.s…"   8 weeks ago     Up 7 weeks     0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4      "docker-entrypoint.s…"   2 months ago    Up 7 weeks     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test

现在我们用watch-fastapi-backend创建了一个名为test的镜像

当前容器是在直接运行的,我们来强制删除镜像看看docker rmi -f <IMAGE ID>

1
2
jy@jy:~$ docker rmi -f 8aa2b29a6def
Error response from daemon: conflict: unable to delete 8aa2b29a6def (cannot be forced) - image is being used by running container 54130cc4bdbf

它提示我们无法删除运行中的容器,括号里明确提到了不能强制删除,也就是说我们仍需要停止容器后再强制删除

在容器停止的情况下强制删除镜像

我们停止容器,然后强制删除镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
jy@jy:~$ docker stop 54130cc4bdbf
54130cc4bdbf
jy@jy:~$ docker rmi -f 8aa2b29a6def 
Untagged: watch-fastapi-frontend:latest
Deleted: sha256:8aa2b29a6defa8202f69887e9d102af71eca8eb16a2e05f8b26a4d4f471e9d2f
jy@jy:~$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                      PORTS                                                  NAMES
54130cc4bdbf   8aa2b29a6def   "nginx -g 'daemon of…"   5 minutes ago   Exited (0) 20 seconds ago                                                          test
144b14ff66c1   mongo          "docker-entrypoint.s…"   8 weeks ago     Up 7 weeks                  0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4      "docker-entrypoint.s…"   2 months ago    Up 7 weeks                  0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test
jy@jy:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mongo        latest    b81a621037ef   2 months ago   887MB
mysql        8.4       f742bd39cd6b   9 months ago   584MB

我们可以看到,随让镜像已经被删除,但是停止的容器仍然存在,我们还可以将其重新运行

在容器运行的情况下强制删除容器

刚刚我们在容器运行的情况下无法强制删除镜像,但是强制删除容器呢,我们重新运行一个容器

1
2
3
4
5
6
7
jy@jy:~$ docker run -d --name test -e MYSQL_ROOT_PASSWORD=123456 mysql:8.4
0f341672409290bd4bfb27734b796cd968a6cd26590c5a3b3d434c8092b8e5cf
jy@jy:~$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
0f3416724092   mysql:8.4   "docker-entrypoint.s…"   2 seconds ago   Up 2 seconds   3306/tcp, 33060/tcp                                    test
144b14ff66c1   mongo       "docker-entrypoint.s…"   8 weeks ago     Up 7 weeks     0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4   "docker-entrypoint.s…"   2 months ago    Up 7 weeks     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test

这里我们用mysql镜像重新运行了一个容器,现在我们来强制删除这个运行中的容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
jy@jy:~$ docker run -d --name test -e MYSQL_ROOT_PASSWORD=123456 mysql:8.4
0f341672409290bd4bfb27734b796cd968a6cd26590c5a3b3d434c8092b8e5cf
jy@jy:~$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
0f3416724092   mysql:8.4   "docker-entrypoint.s…"   2 seconds ago   Up 2 seconds   3306/tcp, 33060/tcp                                    test
144b14ff66c1   mongo       "docker-entrypoint.s…"   8 weeks ago     Up 7 weeks     0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4   "docker-entrypoint.s…"   2 months ago    Up 7 weeks     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test
jy@jy:~$ docker rm -f 0f3416724092
0f3416724092
jy@jy:~$ docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED        STATUS       PORTS                                                  NAMES
144b14ff66c1   mongo       "docker-entrypoint.s…"   8 weeks ago    Up 7 weeks   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp          mongodb
43662ca182e3   mysql:8.4   "docker-entrypoint.s…"   2 months ago   Up 7 weeks   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_test

这里可以看到容器运行状态下,可以强制删除,与前面无法强制删除镜像不同。

总结

正常删除流程: 停止容器--> 删除容器--> 删除镜像

强制删除流程: 强制删除运行容器-->删除镜像停止容器-->强制删除镜像