Docker
文章目錄
- Docker
- 介紹
- 與虛擬機的比較
- 啟動速度
- 占用資源
- 優勢
- 更容易遷移
- 更容易維護
- 更容易擴展
- 使用場景
- 持續集成
- 提供可伸縮的云服務
- 搭建微服務架構
- 鏡像與容器
- 鏡像構成(分層結構)
- 鏡像與容器的區別
- 安裝 Docker
- 常用命令介紹
- 鏡像相關
- 容器相關
- 實戰:從構建到部署一個 Web 應用
- 示例項目結構:
- `app.js`
- `package.json`
- Dockerfile
- 構建鏡像
- 運行容器
- 使用 Docker Volume 實現持久化
- 示例:MySQL 容器掛載本地目錄
- 多容器部署:Docker Compose 示例
- 項目結構
- docker-compose.yml
- 構建并啟動容器組
- 容器之間通信
- Docker 常用工具和高級功能
- 清理命令合集
- 參考資料
介紹
Docker 是一個開源的應用容器引擎,它允許開發者將應用及其依賴打包進一個輕量級、可移植的容器中,然后在任何支持 Docker 的平臺上運行。
它的核心目標是“一次構建,到處運行”。
由于不同的機器有不同的操作系統,以及不同的庫和組件,在將一個應用部署到多臺機器上需要進行大量的環境配置操作。
Docker 主要解決環境配置問題,它是一種虛擬化技術,對進程進行隔離,被隔離的進程獨立于宿主操作系統和其它隔離的進程。使用 Docker 可以不修改應用程序代碼,不需要開發人員學習特定環境下的技術,就能夠將現有的應用程序部署在其它機器上。

核心特點:
- 鏡像(Image):是一個只讀的模板,包含運行應用所需的代碼、庫、依賴等。
- 容器(Container):鏡像的一個運行實例,是一個隔離的環境。
- Dockerfile:用于構建鏡像的腳本文件。
- Docker Hub:一個公共的鏡像倉庫,也可以使用私有倉庫。
與虛擬機的比較
虛擬機也是一種虛擬化技術,它與 Docker 最大的區別在于它是通過模擬硬件,并在硬件上安裝操作系統來實現。

啟動速度
啟動虛擬機需要先啟動虛擬機的操作系統,再啟動應用,這個過程非常慢;
而啟動 Docker 相當于啟動宿主操作系統上的一個進程。
占用資源
虛擬機是一個完整的操作系統,需要占用大量的磁盤、內存和 CPU 資源,一臺機器只能開啟幾十個的虛擬機。
而 Docker 只是一個進程,只需要將應用以及相關的組件打包,在運行時占用很少的資源,一臺機器可以開啟成千上萬個 Docker。
優勢
除了啟動速度快以及占用資源少之外,Docker 具有以下優勢:
更容易遷移
提供一致性的運行環境。已經打包好的應用可以在不同的機器上進行遷移,而不用擔心環境變化導致無法運行。
更容易維護
使用分層技術和鏡像,使得應用可以更容易復用重復的部分。復用程度越高,維護工作也越容易。
更容易擴展
可以使用基礎鏡像進一步擴展得到新的鏡像,并且官方和開源社區提供了大量的鏡像,通過擴展這些鏡像可以非常容易得到我們想要的鏡像。
使用場景
持續集成
持續集成指的是頻繁地將代碼集成到主干上,這樣能夠更快地發現錯誤。
Docker 具有輕量級以及隔離性的特點,在將代碼集成到一個 Docker 中不會對其它 Docker 產生影響。
提供可伸縮的云服務
根據應用的負載情況,可以很容易地增加或者減少 Docker。
搭建微服務架構
Docker 輕量級的特點使得它很適合用于部署、維護、組合微服務。
鏡像與容器
鏡像是一種靜態的結構,可以看成面向對象里面的類,而容器是鏡像的一個實例。
鏡像包含著容器運行時所需要的代碼以及其它組件,它是一種分層結構,每一層都是只讀的(read-only layers)。構建鏡像時,會一層一層構建,前一層是后一層的基礎。鏡像的這種分層存儲結構很適合鏡像的復用以及定制。
構建容器時,通過在鏡像的基礎上添加一個可寫層(writable layer),用來保存著容器運行過程中的修改。
鏡像構成(分層結構)
每個鏡像是多層構成的,比如:
FROM ubuntu:20.04 <- 基礎層
RUN apt-get update <- 新增一層
RUN apt install nginx <- 又新增一層
COPY . /app <- 又一層
這些層具有緩存機制,因此只要上一層沒變,Docker 會復用已有層來提高構建效率。
鏡像與容器的區別
對象 | 說明 |
---|---|
鏡像(Image) | 模板:不可變,類似于軟件安裝包 |
容器(Container) | 鏡像的運行時實例,可修改狀態、產生數據 |

安裝 Docker
參考官網:https://docs.docker.com/get-docker/
主要支持 Windows、macOS、Linux 等系統,安裝后可通過命令 docker --version
檢查是否安裝成功。
常用命令介紹
鏡像相關
# 搜索鏡像(如nginx)
docker search nginx# 拉取鏡像
docker pull nginx# 查看本地鏡像
docker images# 刪除鏡像
docker rmi 鏡像ID或名稱
容器相關
# 運行容器
docker run -d -p 8080:80 --name mynginx nginx
# -d 后臺運行
# -p 映射端口(宿主機:容器)
# --name 給容器起個名字# 查看正在運行的容器
docker ps# 查看所有容器(包含停止的)
docker ps -a# 停止容器
docker stop 容器名或ID# 啟動容器
docker start 容器名或ID# 進入容器交互終端
docker exec -it 容器名或ID bash# 刪除容器
docker rm 容器名或ID
實戰:從構建到部署一個 Web 應用
下面以構建一個簡單 Node.js 應用為例,展示完整流程。
示例項目結構:
myapp/
│
├── app.js
├── package.json
└── Dockerfile
app.js
const express = require('express');
const app = express();
const port = 3000;app.get('/', (req, res) => res.send('Hello Docker!'));
app.listen(port, () => console.log(`Server running on port ${port}`));
package.json
{"name": "myapp","version": "1.0.0","dependencies": {"express": "^4.18.2"}
}
Dockerfile
# 基礎鏡像
FROM node:18# 創建工作目錄
WORKDIR /usr/src/app# 拷貝依賴清單
COPY package*.json ./# 安裝依賴
RUN npm install# 拷貝應用代碼
COPY . .# 開放端口
EXPOSE 3000# 啟動命令
CMD ["node", "app.js"]
構建鏡像
docker build -t my-node-app .
運行容器
docker run -d -p 3000:3000 --name node-test my-node-app
此時訪問瀏覽器 http://localhost:3000
即可看到輸出。
使用 Docker Volume 實現持久化
Docker 中容器一旦銷毀,其中的數據會丟失,因此常用 volume 保存持久化數據。
示例:MySQL 容器掛載本地目錄
docker run -d \--name mydb \-e MYSQL_ROOT_PASSWORD=root \-v /my/local/mysql:/var/lib/mysql \mysql:8
容器內 /var/lib/mysql
的數據將映射到宿主機 /my/local/mysql
,保證重啟后數據不丟。
多容器部署:Docker Compose 示例
項目結構
myapp/
├── docker-compose.yml
├── app/
│ ├── app.js
│ ├── package.json
│ └── Dockerfile
└── db/
docker-compose.yml
version: '3.8'
services:web:build: ./appports:- "3000:3000"depends_on:- dbdb:image: mysql:8environment:MYSQL_ROOT_PASSWORD: rootvolumes:- db_data:/var/lib/mysqlvolumes:db_data:
構建并啟動容器組
docker-compose up -d
容器之間通信
在 Compose 中,各服務默認加入同一網絡,可以直接通過服務名訪問:
// 在 web 服務代碼中
mysql.createConnection({host: 'db', // Compose 中的服務名user: 'root',password: 'root'
});
Docker 常用工具和高級功能
- Docker Volume:管理數據持久化
- Docker Network:自定義網絡讓容器之間安全通信
- Docker Compose:本地開發和測試的神器
- Dockerfile 構建優化:
- 多階段構建(multi-stage)
- 合理利用緩存層
- 使用
.dockerignore
排除無關文件
清理命令合集
# 清除所有停止的容器
docker container prune# 清除未使用的鏡像
docker image prune# 清理所有未使用的數據(包括鏡像、容器、卷等)
docker system prune -a
參考資料
- DOCKER 101: INTRODUCTION TO DOCKER WEBINAR RECAP
- Docker 入門教程
- Docker container vs Virtual machine
- How to Create Docker Container using Dockerfile
- 理解 Docker(2):Docker 鏡像
- 為什么要使用 Docker?
- What is Docker
- 持續集成是什么?