前言
记录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
|
这里可以看到容器运行状态下,可以强制删除,与前面无法强制删除镜像不同。
总结
正常删除流程: 停止容器--> 删除容器--> 删除镜像
强制删除流程: 强制删除运行容器-->删除镜像
或 停止容器-->强制删除镜像