目錄
- Docker入門:運維與開發
- 運維視角
- Docker 架構概述
- Docker 鏡像
- 鏡像概念理解
- 查看和管理鏡像
- 拉取鏡像
- 鏡像標識
- 容器管理
- 啟動容器
- 容器內操作
- 容器的后臺運行
- 多容器管理
- 重新進入運行中的容器
- 容器生命周期管理
- 開發視角
- 容器化思維
- 示例:基于 Nginx 鏡像構建簡單 Web 應用
- 創建 Dockerfile
- 創建靜態網頁文件
- 構建鏡像
- 運行應用容器
- 完整的開發工作流
- 總結
注:本文將基于 macOS 操作系統環境展開。
Docker入門:運維與開發
本章的初衷是在深入研究 Docker 之前,對 Docker 進行一個整體的介紹,讓讀者有一個全面而清晰的初步認知。本章內容主要從兩種視角展開:
- 運維(Ops)視角: 關注 Docker 的基礎操作和管理
- 開發(Dev)視角: 關注應用開發和容器化
在運維視角中,主要包括下載鏡像、運行新的容器、登錄新容器、在容器內運行命令,以及銷毀容器等核心操作。
在開發視角中,主要關注與應用構建、打包和部署相關的內容。
通過上述兩部分內容的了解,讀者可以從整體上理解 Docker 究竟是什么,以及主要組件之間是如何相互配合的。
運維視角
Docker 架構概述
當讀者安裝 Docker 時,會涉及兩個核心組件:
- Docker 客戶端(Docker Client): 用戶與 Docker 交互的命令行工具
- Docker 守護進程(Docker Daemon): 實現了 Docker 引擎的 API,負責管理鏡像、容器、網絡和存儲卷
在不同操作系統上,客戶端與守護進程的通信方式有所不同:
- Linux/macOS: 通過本地 IPC/UNIX Socket (/var/run/docker.sock) 完成通信
- Windows: 通過命名管道(Named Pipes)完成通信
讀者可以使用以下命令來檢查客戶端和服務端是否都已經成功運行,并且可以互相通信:
docker version
期望輸出應包含 Client 和 Server 兩部分信息,表示通信正常。
Docker 鏡像
鏡像概念理解
將 Docker 鏡像理解為一個包含了操作系統文件系統和應用程序的只讀模板會很有幫助。如果讀者有虛擬化經驗,可以將其類比為虛擬機模板——虛擬機模板本質上是處于關機狀態的虛擬機。在 Docker 世界中,鏡像實際上等價于未運行的容器。
查看和管理鏡像
在 Docker 主機上運行以下命令查看所有本地鏡像:
docker image ls
在剛搭建好的 Docker 環境中,會輸出類似如下的表頭,但沒有任何鏡像:
REPOSITORY TAG IMAGE ID CREATED SIZE
拉取鏡像
在 Docker 主機上獲取鏡像的操作被稱為拉取(Pulling)。我們以 Ubuntu 為例:
# 拉取最新版本的 ubuntu 鏡像,默認為 ubuntu:latest
docker pull ubuntu# 或者拉取特定版本
docker pull ubuntu:perl
再次運行 docker image ls
命令查看剛剛拉取的鏡像:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest b60cb74dfa1b 3 weeks ago 101MB
鏡像標識
Docker 的每個鏡像都有自己唯一的 ID(基于 SHA256 哈希),如上述示例中的 IMAGE ID
屬性對應的值 b60
即為 ubuntu 鏡像源的 ID值,用戶可以通過以下方式引用鏡像:
- 鏡像名稱 + 標簽: ubuntu:latest
- 鏡像 ID:
b60cb74dfa1b
(通常只需要輸入前幾個字符即可識別,如b60
)
容器管理
啟動容器
到目前為止,讀者已經擁有一個拉取到本地的鏡像,可以使用 docker run
命令從鏡像來啟動容器:
# 交互式啟動容器并進入 bash shell
docker run -it ubuntu:latest /bin/bash
在上述命令中:
run
命令從鏡像源nginx:latest
中啟動了容器-it
參數組合了-i
(交互式)和-t
(分配偽終端),直接進入到容器內部并在后臺啟動/bin/bash
指定了容器啟動后要執行的命令
容器內操作
在容器內,我們可以通過 ps -elf
來查看所有進程:
關鍵進程解釋:
- 第一個進程 PID 1:
/bin/bash
進程,該進程是通過docker run
命令啟動的主進程 - 第二個進程 PID 2:
ps -elf
進程,即當前正在執行的查看進程命令
容器的后臺運行
如果想退出容器但保持容器在后臺運行,可以通過使用組合鍵:
Ctrl + PQ
這會讓你退回到 Docker 守護進程所在的終端,而容器繼續在后臺運行。
現在可以通過 docker ps
命令查看當前運行的容器:
多容器管理
有意思的是,鏡像是唯一的,但我們可以同一個鏡像創建多個容器實例。
# 啟動第二個容器
docker run -it ubuntu:latest /bin/bash
# 使用 Ctrl + P + Q 退出# 查看所有運行中的容器
docker ps
重新進入運行中的容器
如果想重新進入到第一個運行的容器,可以首先通過 docker ps
查看容器的相信信息,尤其關注 CONTAINER ID
以及 NAMES
兩個屬性的值。
可以使用 docker exec
命令:
# 方法1:使用容器ID(前幾位即可)
docker exec -it d85 /bin/bash# 方法2:使用容器名稱
docker exec -it happy_mendeleev /bin/bash
docker exec
命令支持我們重新進入當前正在運行的容器。
容器生命周期管理
停止容器
# 通過 Container ID 停止容器
docker stop d85
# 通過 Container Name 停止同期
docker stop happy_mendeleev
重啟容器
# 同樣可以通過 ID 或者 Names 重啟服務,這里只介紹通過 ID 重啟
docker restart d85
刪除容器
# 在停止容器運行時,注意需要區分是否已經停止運行
# 刪除已停止的容器
docker rm d85# 強制刪除運行中的容器
docker rm -f d85
開發視角
容器化思維
容器即應用! 這是 Docker 的核心理念。當我們開發完成一個應用時,如何將其封裝成一個可移植的"軟件包"呢?在 Docker 中,這個軟件包就是鏡像。
示例:基于 Nginx 鏡像構建簡單 Web 應用
在 Docker 中,我們通過 Dockerfile
文件來定義如何構建鏡像。首先我們先創建一個目錄地址,用于承載我們搭建的應用。
創建 Dockerfile
# 創建項目目錄
mkdir my-web-app
cd my-web-app# 創建 Dockerfile
touch Dockerfile
vim Dockerfile
在創建好的 Dockerfile 中輸入內容:
# Dockerfile
FROM nginx:alpine# 設置工作目錄
WORKDIR /usr/share/nginx/html# 復制靜態文件到容器中
COPY ./html/ .# 暴露端口
EXPOSE 80# 啟動命令(nginx:alpine 鏡像已有默認CMD)
創建靜態網頁文件
下面我們基于 HTML 創建一個簡單的靜態網頁文件,首先我們先在 my-web-app
目錄下創建一個名為 html
文件夾:
mkdir html
然后將下述內容粘貼到終端中。
cat > html/index.html << EOF
<!DOCTYPE html>
<html>
<head><title>My Docker Web App</title><style>body { font-family: Arial, sans-serif; margin: 40px; }.container { max-width: 600px; margin: 0 auto; text-align: center; }.success { color: #28a745; }</style>
</head>
<body><div class="container"><h1 class="success">Docker 容器化成功!</h1><p>這是一個運行在 Docker 容器中的靜態網站。</p><p>當前時間:<span id="time"></span></p></div><script>document.getElementById('time').textContent = new Date().toLocaleString();</script>
</body>
</html>
EOF
此時,我們的 my-web-app
整體架構如下:
.
Dockerfile
html
|-- index.html
通過 cat
命令查看 index.html
文件中內容,正如我們剛才粘貼創建的靜態網頁內容:
構建鏡像
下一步,我們基于現已構建好的 Dockerfile
以及前端界面構建我們的鏡像。
# 構建鏡像,注意最后的 . 表示當前目錄
docker build -t my-web-app:v1.0 .
構建過程輸出:
當構建完成后,可以通過 docker image ls
命令查看我們構建好的鏡像:
docker image ls
輸出示例:
太好了,創建完成!現在我們再輸入 docker image ls
命令查看所有的鏡像源,就會發現多一條我們剛創建好的、名為 my-web-app
,版本為 v1.0
的鏡像源:
運行應用容器
下一步,我們基于構建好的鏡像文件,啟動容器。
# 運行容器,將容器的80端口映射到主機的8080端口
docker run -d -p 8080:80 --name my-webapp my-web-app:v1.0
參數說明:
-d
:后臺運行(detached mode)-p 8080:80
:端口映射,主機 8080 端口映射到容器 80 端口--name my-webapp
:給容器指定一個名稱my-web-app:v1.0
:使用的鏡像
現在,我們再通過 docker ps
命令檢查,就可以發現我們已經有一個在運行的容器了~
最后,我們欣賞一下自己基于 Docker-Nginx 鏡像源搭建的第一個小網絡。
http://localhost:8080
完整的開發工作流
現在,讓我們從宏觀的工作流上總結下怎樣構建一個完整的應用:
- 編寫應用代碼
- 創建 Dockerfile
- 構建鏡像 (
docker build
) - 運行容器 (
docker run
) - 測試應用
- 推送到倉庫(可選)
# 可選:推送到 Docker Hub
docker tag my-web-app:v1.0 yourusername/my-web-app:v1.0
docker push yourusername/my-web-app:v1.0
總結
通過本博文內容,我們從運維和開發兩個視角了解了 Docker 的基本概念和核心操作:
運維視角重點:
- Docker 架構: 客戶端-服務端模式
- 鏡像管理: 拉取、查看、刪除
- 容器生命周期: 創建、啟動、停止、刪除
- 容器操作: 進入容器、執行命令
開發視角重點:
- 容器化思維: 容器即應用
- Dockerfile: 定義鏡像構建過程
- 鏡像構建: 從代碼到可部署的鏡像
- 應用部署: 端口映射、容器命名
這些基礎操作構成了 Docker 使用的核心工作流,為后續深入學習 Docker 的高級特性打下了堅實的基礎。在后續博文中,我們將深入探討 Docker 網絡、存儲卷、編排等高級主題。
2025.09 金融街