Docker start vs restart:快速掌握差異
Docker 是個方便的服務部署工具,可快速安裝執行伺服軟體,供瀏覽器等前台使用。當用戶從 docker 映像檔建立 (create) 及啟動 (start) 容器時,容器將分別處於 巳建立 (created) 及 執行 (running) 狀態。然後,遇到執行意外出錯 或 管理者故意下停止指令 (docker stop) 時,容器將進入退出 (exited) 狀態。
處於退出狀態的容器,因行程退出,將喪失記憶體狀態,但仍保有原來的可寫層 (writable layer) ,即儲存體狀態。此時,兩種指令 docker start 與 docker restart 都能讓既有容器,從現有可寫層狀態,再跑起來,效果完全一樣。以下用表格整理說明兩指令適用時機之差異。
1. 指令行為比較
| 指令 | 行為說明 | 適用狀態 |
|---|---|---|
docker start |
啟動 巳建立 (created) 及退出 (exited) 的既有容器,直接執行其進入點命令 (entrypoint command) | created / exited |
docker restart |
同上,但遇到執行狀態的容器會先讓其 stop,再 start | created / running / exited |
2. 執行期影響比較
| 項目 | start | restart |
|---|---|---|
| 送 SIGTERM / SIGKILL | ❌ | ✅ |
| PID 改變 | ❌ | ✅ |
| 記憶體狀態重置 | ❌ | ✅ |
| 中斷連線 | ❌ | ✅ |
| 停機時間 | 無 | 短暫 |
3. docker restart 的清理範圍
| 區域 | 是否清理 |
|---|---|
| In-memory data | ✅ |
| Processes / threads | ✅ |
| Open sockets | ✅ |
| TCP connections | ✅ |
| Writable filesystem | ❌ |
| Volumes | ❌ |
| Env / config | ❌ |
| Image | ❌ |
4. 結論:適用性與效果
docker start 與 docker restart 兩個指令目的都在不放棄既有容器的可寫層之下,以新記憶體,執行容器的服務。在容器處於 退出 狀態時,兩者效果完全相同,都會重新啟動容器主行程,重新分配記憶體,並執行 entrypoint command。 其適用時機摘要如下表。
| 適用情境 | 效果 |
|---|---|
| 容器正常退出,要再跑一次 | docker start就現有可寫層,啟動既有容器 |
| 程式卡住、連線異常 | docker restart保留可寫層,重新啟動既有容器 |
| 組態設定或資料壞掉 | docker run放棄可寫層,重新建立啟動新容器 |
沒有留言:
張貼留言