2023 iT邦鐵人賽 Day 12 - 容器的停止與刪除

前言

前幾天都在講容器的建立與啟動,今天我們來說說,容器該如何停止、刪除,以及刪除容器時要注意些什麼事情。

讓容器停止運作

簡單,當我們想讓正在運作中的容器,停止運作,只要使用 stop 指令即可:

先找出運作中的容器:

1
2
3
> docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef2929e5ceb0 httpd "httpd-foreground" 8 seconds ago Up 6 seconds 80/tcp iThome

停止容器:

1
2
3
停止容器:
> docker container stop iThome
iThome

再次查看運作中的容器:

1
2
> docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

沒有東西?沒錯!還記得 docker container lsdocker container ps 都是查詢「運作中」的容器嗎。我們剛剛停止了容器,所以必須加上 -a 才找得到剛剛停下來的容器。

1
2
3
> docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef2929e5ceb0 httpd "httpd-foreground" 4 minutes ago Exited (0) 30 seconds ago iThome

我們可以看到,停止下來的容器狀態是 Exited 退出。

跟容器說再見

如果我們想要刪除容器的話,要先讓容器停止運作後,才能夠刪除 rm

我們可以先啟動剛剛的容器, iThome ,然後嘗試刪除:

1
2
3
4
5
6
>docker container start iThome
iThome

>docker container rm iThome
Error response from daemon: You cannot remove a running container ef2929e5ceb076f0c836df3c3bbb814450377392430529997e29505813fc6a93.
Stop the container before attempting removal or force remove

跑出來的訊息很直接的告訴我們,想要刪除容器就要先停止容器,不然就是要強制刪除。

先停止容器再刪除

所以如果我們想刪除,基本上就是要先停止,然後再刪除:

1
2
3
4
5
6
7
8
> docker container stop iThome
iThome

> docker container rm iThome
iThome

> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

透過 docker container ls -a 可以發現,容器已經不見了。

強制刪除運作中容器

至於剛剛說的強制刪除,就是使用 -f 指令參數:

1
2
3
4
假設現在有一個運作中的容器 iThome

> docker container rm -f iThome
iThome

那如果想一次刪除多個容器

只需要在 rm 後面加上想要刪除的容器們即可:

1
2
3
> docker container rm relaxed_curran postgres_with_e
relaxed_curran
postgres_with_e

這樣好麻煩?沒問題,用 prune 就可以刪除所有停止中的容器們了。

1
2
3
> docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N]

docker 向我們確認是不是真的要執行?輸入 y 就可以執行了。

如果加上 -f--force 就能跳過詢問的步驟直接執行刪除:

1
2
3
4
5
6
7
8
9
10
11
12
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS                      PORTS     NAMES
a8cef9d77a9b httpd "httpd-foreground" 6 seconds ago Created pedantic_meitner
264645d5d5cd httpd "httpd-foreground" 8 seconds ago Created pensive_edison
6ac5d76c0fc1 httpd "httpd-foreground" 4 minutes ago Exited (0) 14 seconds ago iThome

> docker container prune --force
Deleted Containers:
a8cef9d77a9b67825e109ac18cc1ba6e1122bc83f438b54fdcad9a395eb28a7f
264645d5d5cd49d42646767b1500d50e990e2e27895bce49e7f3162a5291430a
6ac5d76c0fc12e9f60e2f6c224f4fe565951e41375e85087a4aec4c1e71ca0b6

Total reclaimed space: 0B

容器的資料呢?

應用程式在運作的過程中,基本上會產生資料,就我們所知,資料會儲存在資料庫中。

那容器呢?容器裡的應用程式也會產生資料,但資料會放在哪?放在容器裡嗎?聽起來好像很合理。但是容器一旦被刪除,資料是不是也被刪除了?那這樣用容器部署專案妥當嗎?聽起來好抖….

總結

今天介紹了容器基本上,刪除之前必須先停止,但也能透過 -f--force 強制刪除運作中的容器。明天我們來介紹容器資料的儲放,在明天的文章中,會為大家解惑最後一個標題裡所提及的所有問題。