在現代軟體開發與維運實踐中,容器化技術已成為實現環境一致性與快速部署的基石。Docker 作為主流的容器引擎,其核心價值不僅在於封裝應用程式,更在於提供了一套完整的生命週期管理命令集。這套機制允許開發者與系統管理員以程式化、可預測的方式控制容器的創建、啟動、停止與銷毀。特別是 docker createdocker start 的分離設計,打破了傳統 docker run 一體化執行的限制,為資源預配置、延遲啟動及複雜應用編排等進階場景提供了必要的彈性。本篇文章將深入探討這些基礎命令的協同運作模式,並透過部署 Oracle 資料庫的具體案例,展示如何運用這些工具建構穩定且隔離的資料庫服務環境。

容器生命週期管理:創建、啟動、停止與移除的精確控制

在 Docker 中,容器的生命週期管理提供了細緻的控制能力,允許使用者在不同階段進行操作,從而實現更靈活的工作流程。

分離創建與啟動的流程

docker create 命令允許使用者預先創建容器,而不立即啟動它。這為後續的啟動和配置提供了彈性。

  1. 創建容器: 使用 docker create 命令,指定映像檔、容器名稱以及其他配置選項。例如,創建一個名為 orcl6 的容器,基於 oraclelinux:6.6 映像檔,並準備用於交互式操作:

    docker create -i -t --name orcl6 oraclelinux:6.6 /bin/bash
    

    此命令不會啟動容器,也不會進入 Shell。它僅僅是預先分配了容器所需的資源和配置。

  2. 啟動已創建的容器: 一旦容器被創建,可以使用 docker start 命令來啟動它。結合 -a(attach)和 -i(interactive)選項,可以將當前終端的標準輸入、輸出和錯誤流連接到啟動的容器,從而直接進入容器的交互式 Shell。

    sudo docker start -a -i orcl6
    

    執行此命令後,orcl6 容器將被啟動,並且您會直接進入其交互式終端環境,就像使用 docker run -it 一樣。

停止運行中的容器

當不再需要一個正在運行的容器時,可以使用 docker stop 命令來優雅地停止它。

  • 命令
    sudo docker stop <container-name-or-id>
    
  • 範例:停止名為 orcl6 的容器:
    sudo docker stop orcl6
    
    Docker 會向容器內的進程發送終止信號,等待其自行停止。

檢查容器狀態

停止容器後,使用 docker ps -a 命令可以查看所有容器的狀態。被停止的容器將顯示為 “Exited” 狀態,這表明它已經結束了運行,但其資源(如文件系統)仍然存在,直到被明確移除。

移除容器

要徹底釋放容器佔用的磁碟空間和資源,必須使用 docker rm 命令來移除它。

  • 重要前提:容器必須先被停止,否則 docker rm 命令將無法執行。
  • 命令
    sudo docker rm <container-name-or-id>
    
  • 範例:移除已停止的 orcl6 容器:
    sudo docker rm orcl6
    
    執行此命令後,容器及其關聯的所有資源將被永久刪除。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "Docker Container (orcl6)" as ORCL6Container

partition "容器生命週期精確管理" {
  User --> DockerCLI : 執行 docker create -i -t --name orcl6 oraclelinux:6.6 /bin/bash
  DockerCLI --> DockerDaemon : 請求創建容器
  DockerDaemon --> ORCL6Container : 創建容器配置,但不啟動
  User --> DockerCLI : 執行 docker start -a -i orcl6
  DockerCLI --> DockerDaemon : 請求啟動已創建的容器
  DockerDaemon --> ORCL6Container : 啟動容器並附加交互式 Shell
  ORCL6Container --> User : 提供交互式 Shell 提示符
  User --> DockerCLI : 執行 docker stop orcl6
  DockerCLI --> DockerDaemon : 請求停止容器
  DockerDaemon --> ORCL6Container : 發送終止信號,停止容器
  User --> DockerCLI : 執行 docker ps -a
  DockerCLI --> DockerDaemon : 列出所有容器狀態
  DockerDaemon --> User : 回傳容器列表 (orcl6 顯示為 Exited)
  User --> DockerCLI : 執行 docker rm orcl6
  DockerCLI --> DockerDaemon : 請求移除容器
  DockerDaemon --> ORCL6Container : 徹底刪除容器及其資源
}

@enduml

看圖說話:

此圖示詳細闡述了 Docker 容器的完整生命週期管理流程,特別是圍繞 docker createdocker start 的組合操作。首先,使用者透過 docker create 命令預先創建了一個名為 orcl6 的容器,基於 oraclelinux:6.6 映像檔,並配置為支持交互式操作,但此時容器並未運行。接著,使用者執行 docker start -a -i orcl6 命令,Docker Daemon 接收到啟動請求,啟動了之前創建的 orcl6 容器,並將使用者的終端連接到容器的標準輸入、輸出和錯誤流,使其立即進入交互式 Shell 環境。在容器運行期間,使用者可以進行各種操作。當操作完成後,使用者執行 docker stop orcl6 命令,Docker Daemon 優雅地停止了 orcl6 容器。隨後,通過 docker ps -a 命令,使用者可以確認 orcl6 容器的狀態變為 “Exited”。最後,使用者執行 docker rm orcl6 命令,Docker Daemon 徹底刪除了 orcl6 容器及其所有相關資源,完成了容器的生命週期管理。

下一章預告:Oracle Database 容器化實踐

在掌握了 Linux 容器的基礎操作後,下一章將把焦點轉向一個極為重要的應用場景:如何在 Docker 容器中部署和使用 Oracle Database。我們將利用 Docker Hub 上提供的 Oracle Database 映像檔,學習如何快速搭建一個功能齊全的數據庫環境,這對於開發、測試和部署數據庫驅動的應用程式將帶來極大的便利。

在 Docker 中部署 Oracle Database 11g:從映像檔獲取到實例啟動

環境準備與 Oracle Database 映像檔的獲取

本章節將引導我們如何在 Docker 容器內部署並運行 Oracle Database 11g 的一個特定版本。這為開發者和資料庫管理員提供了一個快速、隔離且可重複的數據庫環境。

必要軟體與主機環境設定

要完成本節的內容,需要以下軟體和環境:

  • Docker Engine:已安裝並運行 Docker。本範例中使用的版本是 1.8,但較新版本通常也適用。
  • Oracle Database Docker 映像檔:我們將使用 sath89/oracle-xe-11g 這個 Docker Hub 上的映像檔,它包含了 Oracle Database Express Edition 11g 的預配置。
  • 主機作業系統:與前一章節相同,我們將繼續使用 Amazon EC2 上的 Red Hat Enterprise Linux 7 作為 Docker 主機。

連線至 EC2 主機並確認 Docker 狀態

  1. SSH 連線:使用您的私鑰 (docker.pem) 連線到 Red Hat 7 EC2 實例。請注意,範例中的 IP 地址 54.175.172.33 僅為演示,您需要替換為您實際的 EC2 公用 IP。
    ssh -i "docker.pem" ec2-user@54.175.172.33
    
  2. 檢查 Docker 服務狀態:登入後,確認 Docker 服務正在運行。
    sudo service docker status
    
  3. 啟動 Docker 服務(如未運行):如果 Docker 服務未運行,請啟動它。
    sudo service docker start
    

下載 Oracle Database Docker 映像檔

接下來,我們需要從 Docker Hub 下載 sath89/oracle-xe-11g 這個映像檔。

sudo docker pull sath89/oracle-xe-11g

執行此命令後,Docker 會連接到 Docker Hub,獲取 sath89/oracle-xe-11g 映像檔的最新版本,並將其下載到本地。下載過程會顯示映像檔的各個層級(layers)的下載進度。

列出本地 Docker 映像檔

為了確認映像檔已成功下載,可以使用 docker images 命令。

sudo docker images

在列出的映像檔列表中,您應該能看到 sath89/oracle-xe-11g,以及其標籤(通常是 latest)和大小等資訊。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "SSH Client" as SSHClient
object "EC2 Instance (RHEL 7)" as RHELInstance
object "Docker Service" as DockerService
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "Docker Hub" as DockerHub
object "Docker Image (sath89/oracle-xe-11g)" as OracleXEImage

partition "Oracle Database 容器化環境準備" {
  User --> SSHClient : 準備私鑰 (docker.pem) 並輸入連線指令
  SSHClient --> RHELInstance : 建立 SSH 連線 (ec2-user@<IP>)
  RHELInstance --> SSHClient : 顯示終端提示符
  User --> RHELInstance : 執行 sudo service docker status
  DockerService --> RHELInstance : 回傳服務狀態
  User --> RHELInstance : 執行 sudo service docker start (若需要)
  DockerService --> RHELInstance : 啟動 Docker 服務
  User --> DockerCLI : 執行 docker pull sath89/oracle-xe-11g
  DockerCLI --> DockerDaemon : 請求下載映像檔
  DockerDaemon --> DockerHub : 從 Docker Hub 獲取映像檔
  DockerHub --> DockerDaemon : 提供映像檔數據
  DockerDaemon --> User : 回傳下載進度與完成訊息
  User --> DockerCLI : 執行 docker images
  DockerCLI --> DockerDaemon : 請求列出本地映像檔
  DockerDaemon --> User : 顯示映像檔列表 (含 sath89/oracle-xe-11g)
}

@enduml

看圖說話:

此圖示描繪了在 Docker 中部署 Oracle Database 11g 的初始階段,即環境準備和映像檔獲取。使用者首先透過 SSH Client 連線到 Amazon EC2 上的 Red Hat Enterprise Linux 7 實例,並確認 Docker 服務的運行狀態,必要時啟動它。接著,使用者利用 Docker CLI 執行 docker pull sath89/oracle-xe-11g 命令,指示 Docker Daemon 從 Docker Hub 下載指定的 Oracle Database 11g Express Edition 映像檔。Docker Daemon 負責與 Docker Hub 進行通信,下載映像檔的所有必要組件,並將其儲存到本地。最後,使用者執行 docker images 命令,Docker CLI 會查詢 Docker Daemon,列出本地所有可用的映像檔,使用者可以在列表中確認 sath89/oracle-xe-11g 映像檔已成功下載。這個流程為後續啟動 Oracle Database 容器奠定了基礎。

啟動 Oracle Database 容器實例

在成功下載映像檔後,我們就可以使用 docker run 命令來啟動一個 Oracle Database 實例。

配置容器的埠號與名稱

啟動 Oracle Database 容器時,需要進行一些關鍵的配置:

  • 埠號映射
    • -p 8080:8080:將主機的 8080 埠映射到容器的 8080 埠。這通常用於 Oracle Application Express (APEX) 的管理控制台。
    • -p 1521:1521:將主機的 1521 埠映射到容器的 1521 埠。這是 Oracle Database 的預設監聽埠,用於客戶端連接數據庫。
  • 容器名稱
    • --name orcldb:為容器指定一個易於識別的名稱,例如 orcldb
  • 後台運行
    • -d:將容器設置為在後台模式運行,這樣命令執行完畢後,終端不會被容器佔用。

執行啟動命令

整合以上配置,啟動 Oracle Database 容器的命令如下:

docker run --name orcldb -d -p 8080:8080 -p 1521:1521 sath89/oracle-xe-11g

執行此命令後,Docker 會基於 sath89/oracle-xe-11g 映像檔創建並啟動一個名為 orcldb 的容器。容器將在後台運行,並將主機的 8080 和 1521 埠映射到容器內部對應的埠號。

驗證容器運行狀態

啟動容器後,可以使用 docker ps 命令來查看正在運行的容器列表,確認 orcldb 容器是否已成功啟動並運行。

sudo docker ps

在命令的輸出中,您應該能看到 orcldb 容器,其狀態顯示為 “Up”,並列出了映射的埠號。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "Docker Image (sath89/oracle-xe-11g)" as OracleXEImage
object "Docker Container (orcldb)" as ORCLDBContainer

partition "啟動 Oracle Database 容器實例" {
  User --> DockerCLI : 執行 docker run --name orcldb -d -p 8080:8080 -p 1521:1521 sath89/oracle-xe-11g
  DockerCLI --> DockerDaemon : 請求基於映像檔創建並啟動容器
  DockerDaemon --> OracleXEImage : 使用映像檔創建容器配置
  DockerDaemon --> ORCLDBContainer : 創建並啟動容器 (後台模式)
  DockerDaemon --> ORCLDBContainer : 配置埠號映射 (Host:8080 -> Container:8080, Host:1521 -> Container:1521)
  DockerDaemon --> User : 返回容器 ID 或名稱
  User --> DockerCLI : 執行 docker ps
  DockerCLI --> DockerDaemon : 請求列出運行中容器
  DockerDaemon --> User : 回傳容器列表 (顯示 orcldb 運行中)
  note right of ORCLDBContainer : Oracle Database 實例正在容器內初始化與運行
}

end note

@enduml

看圖說話:

此圖示展示了如何啟動一個 Oracle Database 11g 的 Docker 容器實例。使用者透過 docker run 命令,結合了多個關鍵選項來配置容器。--name orcldb 為容器指定了一個易於識別的名稱。-d 選項指示容器在後台(detached mode)運行,不會阻塞終端。-p 8080:8080-p 1521:1521 是埠號映射配置,分別將主機的 8080 和 1521 埠口映射到容器內部對應的埠口,這對於訪問 Oracle Application Express (APEX) 管理員控制台和 Oracle Database 監聽器至關重要。最後,sath89/oracle-xe-11g 指定了要使用的 Docker 映像檔。Docker Daemon 接收到這些指令後,會基於該映像檔創建一個名為 orcldb 的容器,配置好埠號映射,並在後台啟動 Oracle Database 實例。完成後,使用者通過 docker ps 命令確認 orcldb 容器正在運行,並顯示了其埠號映射資訊,這表明 Oracle Database 已經成功部署在 Docker 容器中了。

縱觀容器生命週期的精確調度與資料庫容器化的實踐,此技術路徑的核心價值,在於對「效能」與「敏捷性」的重新定義。它不僅是技術操作的演進,更是對工作流程與資源管理的系統性思考。

相較於傳統虛擬機或實體機部署,容器化將環境建置從數小時的「重工程」,壓縮為數分鐘的「輕量級指令」,實現了資源最佳化。從生命週期的精細控制(create/start)到複雜應用(Oracle DB)的一鍵部署,清晰地展現了基礎能力與高階應用的協同效應。掌握前者看似繁瑣的細節,正是釋放後者巨大商業價值的關鍵前提,這反映了從「知道」到「做到」的深度實踐差距。

未來,隨著微服務與雲原生架構成為主流,這種將複雜「狀態化服務」(Stateful Service)高效容器化的能力,將不再是加分項,而是高階技術人才的核心競爭力。管理對象也將從單一容器,擴展至整個應用服務叢集的生命週期治理。

玄貓認為,精熟容器生命週期管理,不僅是技術操作的精進,更是對「效率」與「可預測性」的系統性投資。對於追求卓越績效的開發者與架構師而言,這是一條通往高效能開發與維運的必經之路。