Docker 入門終極指南,詳細版!別再說不會用 Docker 了!
兄弟們,假如你寫了個超厲害的 Java 項目,結(jié)果部署到測試環(huán)境就崩了 —— 因為測試小哥的電腦裝了 MySQL 8.0,而你的開發(fā)環(huán)境是 MySQL 5.7。這時候,Docker 就像個會魔法的集裝箱工人,把你的項目和所有依賴(包括 MySQL 5.7)打包成一個 “集裝箱”,不管扔到哪臺服務器,都能原樣運行。
這就是 Docker 的核心:Build once, Run anywhere(一次構建,處處運行)。它不是虛擬機,而是用 Linux 內(nèi)核的隔離技術(Namespace 和 Cgroups),把應用和依賴封裝成輕量級容器,啟動速度秒級,資源占用比虛擬機少 90% 以上。
一、Docker 三大件:鏡像、容器、倉庫
1. 鏡像(Image):項目的 “靈魂快照”
鏡像是只讀的模板,包含代碼、依賴、配置等所有運行所需的東西。比如官方的 openjdk:11 鏡像,已經(jīng)預裝了 Java 11 環(huán)境。你可以用 Dockerfile 定制自己的鏡像,比如:
FROM openjdk:11-jre-slim # 基礎鏡像
WORKDIR /app # 設置工作目錄
COPY target/app.jar . # 復制打包好的 JAR 包
EXPOSE 8080 # 暴露端口
CMD ["java", "-jar", "app.jar"] # 啟動命令這就像你給項目拍了張 “靈魂快照”,隨時能復活。
2. 容器(Container):鏡像的 “復活體”
容器是鏡像的運行實例,就像從模板生成的對象。啟動容器超簡單:
docker run -d -p 8080:8080 my-java-app:1.0 # -d 后臺運行,-p 端口映射容器之間完全隔離,互不干擾,就像 iPhone 里的 App 一樣獨立。
3. 倉庫(Repository):鏡像的 “云盤”
Docker Hub 是全球最大的鏡像倉庫,你可以從這里拉取別人的鏡像,也可以把自己的鏡像推上去。比如拉取 MySQL 鏡像:
docker pull mysql:5.7 # 拉取 MySQL 5.7 鏡像企業(yè)還可以搭建私有倉庫(如 Harbor),安全管理內(nèi)部鏡像。
二、Docker 安裝:3 分鐘搞定,比裝 IDE 還快
1. Linux 安裝(以 Ubuntu 為例)
# 卸載舊版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 添加 Docker 官方 GPG 密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 設置穩(wěn)定版?zhèn)}庫
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安裝 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 啟動 Docker 并設置開機自啟
sudo systemctl start docker
sudo systemctl enable docker
# 驗證安裝(看到 Hello from Docker! 就成功啦)
sudo docker run hello-world裝完后,普通用戶也能運行 Docker:
sudo usermod -aG docker $USER # 添加當前用戶到 docker 組
newgrp docker # 生效2. macOS/Windows 安裝
直接下載 Docker Desktop,一鍵安裝。Docker 會在后臺啟動一個 Linux 虛擬機,你的容器都在里面運行。
三、Docker 核心操作:從入門到精通
1. 鏡像操作
- 搜索鏡像:
docker search mysql # 搜索 MySQL 鏡像
docker search --filter=STARS=5000 mysql # 只看星星數(shù) >5000 的- 拉取鏡像:
docker pull mysql:5.7 # 拉取指定版本
docker pull nginx:alpine # 拉取精簡版 Nginx- 查看鏡像:
docker images # 列出本地鏡像
docker image ls # 同上- 刪除鏡像:
docker rmi mysql:5.7 # 刪除指定鏡像 docker rmi $(docker images -q) # 刪除所有鏡像(慎用!)2. 容器操作
- 啟動容器:
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mysql:5.7 # 啟動 MySQL參數(shù)解釋:
- -d:后臺運行
- --name:給容器起個名字
- -e:設置環(huán)境變量(這里設置 MySQL root 密碼)
- -p:端口映射(主機端口:容器端口)
- 查看容器:
docker ps # 查看正在運行的容器 docker ps -a # 查看所有容器(包括已停止的) docker stats # 實時監(jiān)控容器資源占用- 進入容器:
docker exec -it my-mysql bash # 進入 MySQL 容器的 shell- 停止 / 啟動容器:
docker stop my-mysql # 優(yōu)雅停止
docker kill my-mysql # 強制停止
docker start my-mysql # 啟動已停止的容器- 刪除容器:
docker rm my-mysql # 刪除已停止的容器
docker rm -f $(docker ps -aq) # 刪除所有容器(慎用!)3. 數(shù)據(jù)持久化:容器掛了,數(shù)據(jù)還在
- 綁定掛載(Bind Mount):
docker run -d --name my-nginx -v /host/path:/usr/share/nginx/html nginx # 掛載主機目錄到容器主機修改文件,容器內(nèi)實時生效,適合開發(fā)環(huán)境。
- 命名卷(Named Volume):
docker volume create my-volume # 創(chuàng)建卷
docker run -d --name my-mysql -v my-volume:/var/lib/mysql mysql:5.7 # 使用卷卷由 Docker 管理,數(shù)據(jù)更安全,適合生產(chǎn)環(huán)境。
4. 網(wǎng)絡管理:容器間如何通信?
- 默認網(wǎng)絡(bridge):
容器默認連接到 bridge 網(wǎng)絡,互相通過容器名或 IP 訪問。
docker network ls # 查看網(wǎng)絡
docker network inspect bridge # 查看 bridge 網(wǎng)絡詳情- 自定義網(wǎng)絡:
docker network create my-network # 創(chuàng)建自定義網(wǎng)絡
docker run -d --name app --network my-network my-app # 容器加入網(wǎng)絡
docker run -d --name db --network my-network mysql:5.7 # 另一容器加入同一網(wǎng)絡容器間可以直接通過容器名通信(如 app 訪問 db:3306)。
四、Dockerfile 最佳實踐:打造高效鏡像
1. 多階段構建(Multi-Stage Builds)
傳統(tǒng) Dockerfile 會把編譯工具(如 Maven)也打進鏡像,導致體積臃腫。多階段構建可以只保留最終運行時所需的內(nèi)容:
# 第一階段:編譯
FROM maven:3.8.6-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY . .
RUN mvn package -DskipTests
# 第二階段:運行時
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/app.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]最終鏡像體積從 1.5GB 降至 150MB,傳輸更快,漏洞更少。
2. 精簡鏡像
- 使用基礎鏡像:
推薦 openjdk:11-jre-slim(約 240MB),而不是 openjdk:11(約 650MB)。
極致精簡用 alpine 鏡像(約 5MB),但要注意兼容性。
- 清理臨時文件:
RUN apt-get update && apt-get install -y build-essential && rm -rf /var/cache/apt/* # 安裝后刪除緩存3. 日志重定向
讓容器日志輸出到標準輸出 / 錯誤流,方便用 docker logs 查看,也能集成到 ELK 等日志系統(tǒng):
FROM alpine:3.20
RUN ln -svf /dev/stdout /var/log/nginx/access.log && ln -svf /dev/stderr /var/log/nginx/error.log # 重定向 Nginx 日志對 Java 應用,直接用 System.out.println 輸出即可。
五、Docker Compose:一鍵啟動多容器應用
1. 安裝 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.37.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version # 驗證2. 編寫 docker-compose.yml
version: '3.8'
services:
app:
build: . # 基于當前目錄的 Dockerfile 構建鏡像
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- db-data:/var/lib/mysql
volumes:
db-data: # 定義命名卷3. 啟動 / 停止
docker-compose up -d # 后臺啟動
docker-compose down # 停止并刪除容器/網(wǎng)絡/卷
docker-compose logs app # 查看 app 服務日志Docker Compose 2025 版本默認啟用 Bake 構建引擎,并行構建鏡像,速度提升 30%+。
六、Docker 安全與性能優(yōu)化
1. 安全加固
- 最小權限運行:
FROM openjdk:11-jre-slim
RUN adduser -D appuser && chown -R appuser /app # 創(chuàng)建非 root 用戶
USER appuser # 切換用戶- 只讀文件系統(tǒng):
docker run --read-only my-app # 容器文件系統(tǒng)只讀(除了掛載的卷)- 限制資源:
docker run --memory=1g --cpus=2 my-app # 限制內(nèi)存 1GB,CPU 2 核- 使用安全模塊:
--security-opt seccomp=unconfined:禁用系統(tǒng)調(diào)用過濾(默認)
--security-opt apparmor=docker-default:啟用 AppArmor 安全策略
2. 性能優(yōu)化
- 網(wǎng)絡優(yōu)化:
高性能場景用 host 網(wǎng)絡模式:
docker run --network host my-app # 直接使用主機網(wǎng)絡棧,減少 NAT 開銷- 跨主機通信推薦 overlay 網(wǎng)絡(配合 Kubernetes)。
- 存儲優(yōu)化:
內(nèi)存文件系統(tǒng)加速臨時數(shù)據(jù):
docker run -v tmpfs:/app/tmp --tmpfs tmpfs:size=64m my-app # 掛載 64MB 內(nèi)存盤- 生產(chǎn)環(huán)境用 NVMe 等高速存儲插件。
- 鏡像緩存:
多階段構建時,依賴層單獨分層:
FROM maven:3.8.6-openjdk-11 AS builder
COPY pom.xml .
RUN mvn dependency:go-offline # 單獨分層,依賴不變時復用
COPY . .
RUN mvn package- 啟用 BuildKit 緩存:
DOCKER_BUILDKIT=1 docker build --cache-to type=registry,ref=my-registry/cache-image:latest .七、Java 應用容器化實戰(zhàn)
1. Spring Boot 應用
(1)項目結(jié)構
app/
├── src/
│ └── main/
│ ├── java/
│ └── resources/
├── pom.xml
└── Dockerfile(2)pom.xml 配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.4.3</version>
<configuration>
<to>
<image>your-registry/app:${project.version}</image>
</to>
<container>
<jvmFlags>
<jvmFlag>-Xms128m</jvmFlag>
<jvmFlag>-Xmx200m</jvmFlag>
<jvmFlag>-XX:+UseZGC</jvmFlag>
</jvmFlags>
</container>
</configuration>
</plugin>
</plugins>
</build>用 Jib 插件直接構建鏡像,無需手動編寫 Dockerfile。
(3)啟動容器
docker run -d --name my-app -p 8080:8080 your-registry/app:1.02. 性能優(yōu)化案例
某電商訂單系統(tǒng),日均千萬請求,通過以下優(yōu)化:
- 多階段構建 + GraalVM Native Image:鏡像大小從 1.5GB 降至 150MB,啟動時間從 15 秒降至 1 秒。
- 使用 ZGC 垃圾回收器,降低內(nèi)存停頓。
- Docker Compose 管理多服務,Kubernetes 實現(xiàn)自動擴縮容。
八、Docker 與 Kubernetes:從單機到集群
1. Kubernetes 是什么?
Kubernetes(K8s)是容器編排的 “操作系統(tǒng)”,幫你管理成百上千個容器。它能自動擴縮容、負載均衡、故障自愈。比如你部署一個服務,K8s 會自動創(chuàng)建多個副本,某個掛了就自動重啟,流量自動分發(fā)到健康的實例。
2. 2025 年 Kubernetes 新趨勢
- AI 調(diào)度器:用機器學習預測工作負載資源需求,資源利用率提升 30%+。比如電商大促時,自動為高流量服務分配更多資源。
- 邊緣節(jié)點管理:支持邊緣計算場景,邊緣節(jié)點故障時自動遷移容器,保障物聯(lián)網(wǎng)、工業(yè)自動化等實時應用的穩(wěn)定性。
3. 入門示例
- 部署一個服務:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: your-registry/app:1.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer # 暴露到公網(wǎng)用 kubectl apply -f deploy.yml 部署,K8s 會自動創(chuàng)建 3 個容器,并通過負載均衡對外提供服務。
九、總結(jié):Docker 為什么值得學?
- 環(huán)境一致性:徹底解決 “在我機器上能跑” 的問題。
- 快速部署:秒級啟動,支持藍綠發(fā)布、灰度發(fā)布。
- 資源高效:比虛擬機節(jié)省 70% 以上資源。
- 生態(tài)豐富:與 CI/CD、Kubernetes、監(jiān)控工具無縫集成。
如果你是 Java 開發(fā)者,Docker 能讓你從繁瑣的環(huán)境配置中解放出來,專注業(yè)務代碼。而且,Docker 是云原生的基石,學會它,你就打開了 Kubernetes、微服務架構的大門。
趕緊動手試試吧!把你的 Java 項目容器化,體驗 “一次構建,處處運行” 的快感。如果遇到問題,記得用 docker --help 或 Docker 官方文檔 查資料。相信我,掌握 Docker 后,你會愛上這種 “打包即部署” 的開發(fā)方式!































