Docker 入門終極指南,詳細(xì)版!別再說(shuō)不會(huì)用 Docker 了!
兄弟們,假如你寫(xiě)了個(gè)超厲害的 Java 項(xiàng)目,結(jié)果部署到測(cè)試環(huán)境就崩了 —— 因?yàn)闇y(cè)試小哥的電腦裝了 MySQL 8.0,而你的開(kāi)發(fā)環(huán)境是 MySQL 5.7。這時(shí)候,Docker 就像個(gè)會(huì)魔法的集裝箱工人,把你的項(xiàng)目和所有依賴(包括 MySQL 5.7)打包成一個(gè) “集裝箱”,不管扔到哪臺(tái)服務(wù)器,都能原樣運(yùn)行。
這就是 Docker 的核心:Build once, Run anywhere(一次構(gòu)建,處處運(yùn)行)。它不是虛擬機(jī),而是用 Linux 內(nèi)核的隔離技術(shù)(Namespace 和 Cgroups),把應(yīng)用和依賴封裝成輕量級(jí)容器,啟動(dòng)速度秒級(jí),資源占用比虛擬機(jī)少 90% 以上。
一、Docker 三大件:鏡像、容器、倉(cāng)庫(kù)
1. 鏡像(Image):項(xiàng)目的 “靈魂快照”
鏡像是只讀的模板,包含代碼、依賴、配置等所有運(yùn)行所需的東西。比如官方的 openjdk:11 鏡像,已經(jīng)預(yù)裝了 Java 11 環(huán)境。你可以用 Dockerfile 定制自己的鏡像,比如:
FROM openjdk:11-jre-slim # 基礎(chǔ)鏡像
WORKDIR /app # 設(shè)置工作目錄
COPY target/app.jar . # 復(fù)制打包好的 JAR 包
EXPOSE 8080 # 暴露端口
CMD ["java", "-jar", "app.jar"] # 啟動(dòng)命令這就像你給項(xiàng)目拍了張 “靈魂快照”,隨時(shí)能復(fù)活。
2. 容器(Container):鏡像的 “復(fù)活體”
容器是鏡像的運(yùn)行實(shí)例,就像從模板生成的對(duì)象。啟動(dòng)容器超簡(jiǎn)單:
docker run -d -p 8080:8080 my-java-app:1.0 # -d 后臺(tái)運(yùn)行,-p 端口映射容器之間完全隔離,互不干擾,就像 iPhone 里的 App 一樣獨(dú)立。
3. 倉(cāng)庫(kù)(Repository):鏡像的 “云盤(pán)”
Docker Hub 是全球最大的鏡像倉(cāng)庫(kù),你可以從這里拉取別人的鏡像,也可以把自己的鏡像推上去。比如拉取 MySQL 鏡像:
docker pull mysql:5.7 # 拉取 MySQL 5.7 鏡像企業(yè)還可以搭建私有倉(cāng)庫(kù)(如 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
# 設(shè)置穩(wěn)定版?zhèn)}庫(kù)
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
# 啟動(dòng) Docker 并設(shè)置開(kāi)機(jī)自啟
sudo systemctl start docker
sudo systemctl enable docker
# 驗(yàn)證安裝(看到 Hello from Docker! 就成功啦)
sudo docker run hello-world裝完后,普通用戶也能運(yùn)行 Docker:
sudo usermod -aG docker $USER # 添加當(dāng)前用戶到 docker 組
newgrp docker # 生效2. macOS/Windows 安裝
直接下載 Docker Desktop,一鍵安裝。Docker 會(huì)在后臺(tái)啟動(dòng)一個(gè) Linux 虛擬機(jī),你的容器都在里面運(yùn)行。
三、Docker 核心操作:從入門到精通
1. 鏡像操作
- 搜索鏡像:
docker search mysql # 搜索 MySQL 鏡像
docker search --filter=STARS=5000 mysql # 只看星星數(shù) >5000 的- 拉取鏡像:
docker pull mysql:5.7 # 拉取指定版本
docker pull nginx:alpine # 拉取精簡(jiǎn)版 Nginx- 查看鏡像:
docker images # 列出本地鏡像
docker image ls # 同上- 刪除鏡像:
docker rmi mysql:5.7 # 刪除指定鏡像 docker rmi $(docker images -q) # 刪除所有鏡像(慎用!)2. 容器操作
- 啟動(dòng)容器:
docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mysql:5.7 # 啟動(dòng) MySQL參數(shù)解釋:
- -d:后臺(tái)運(yùn)行
- --name:給容器起個(gè)名字
- -e:設(shè)置環(huán)境變量(這里設(shè)置 MySQL root 密碼)
- -p:端口映射(主機(jī)端口:容器端口)
- 查看容器:
docker ps # 查看正在運(yùn)行的容器 docker ps -a # 查看所有容器(包括已停止的) docker stats # 實(shí)時(shí)監(jiān)控容器資源占用- 進(jìn)入容器:
docker exec -it my-mysql bash # 進(jìn)入 MySQL 容器的 shell- 停止 / 啟動(dòng)容器:
docker stop my-mysql # 優(yōu)雅停止
docker kill my-mysql # 強(qiáng)制停止
docker start my-mysql # 啟動(dòng)已停止的容器- 刪除容器:
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 # 掛載主機(jī)目錄到容器主機(jī)修改文件,容器內(nèi)實(shí)時(shí)生效,適合開(kā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)絡(luò)管理:容器間如何通信?
- 默認(rèn)網(wǎng)絡(luò)(bridge):
容器默認(rèn)連接到 bridge 網(wǎng)絡(luò),互相通過(guò)容器名或 IP 訪問(wèn)。
docker network ls # 查看網(wǎng)絡(luò)
docker network inspect bridge # 查看 bridge 網(wǎng)絡(luò)詳情- 自定義網(wǎng)絡(luò):
docker network create my-network # 創(chuàng)建自定義網(wǎng)絡(luò)
docker run -d --name app --network my-network my-app # 容器加入網(wǎng)絡(luò)
docker run -d --name db --network my-network mysql:5.7 # 另一容器加入同一網(wǎng)絡(luò)容器間可以直接通過(guò)容器名通信(如 app 訪問(wèn) db:3306)。
四、Dockerfile 最佳實(shí)踐:打造高效鏡像
1. 多階段構(gòu)建(Multi-Stage Builds)
傳統(tǒng) Dockerfile 會(huì)把編譯工具(如 Maven)也打進(jìn)鏡像,導(dǎo)致體積臃腫。多階段構(gòu)建可以只保留最終運(yùn)行時(shí)所需的內(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
# 第二階段:運(yùn)行時(shí)
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. 精簡(jiǎn)鏡像
- 使用基礎(chǔ)鏡像:
推薦 openjdk:11-jre-slim(約 240MB),而不是 openjdk:11(約 650MB)。
極致精簡(jiǎn)用 alpine 鏡像(約 5MB),但要注意兼容性。
- 清理臨時(shí)文件:
RUN apt-get update && apt-get install -y build-essential && rm -rf /var/cache/apt/* # 安裝后刪除緩存3. 日志重定向
讓容器日志輸出到標(biāo)準(zhǔn)輸出 / 錯(cuò)誤流,方便用 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 日志對(duì) Java 應(yīng)用,直接用 System.out.println 輸出即可。
五、Docker Compose:一鍵啟動(dòng)多容器應(yīng)用
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 # 驗(yàn)證2. 編寫(xiě) docker-compose.yml
version: '3.8'
services:
app:
build: . # 基于當(dāng)前目錄的 Dockerfile 構(gòu)建鏡像
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. 啟動(dòng) / 停止
docker-compose up -d # 后臺(tái)啟動(dòng)
docker-compose down # 停止并刪除容器/網(wǎng)絡(luò)/卷
docker-compose logs app # 查看 app 服務(wù)日志Docker Compose 2025 版本默認(rèn)啟用 Bake 構(gòu)建引擎,并行構(gòu)建鏡像,速度提升 30%+。
六、Docker 安全與性能優(yōu)化
1. 安全加固
- 最小權(quán)限運(yùn)行:
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)用過(guò)濾(默認(rèn))
--security-opt apparmor=docker-default:?jiǎn)⒂?AppArmor 安全策略
2. 性能優(yōu)化
- 網(wǎng)絡(luò)優(yōu)化:
高性能場(chǎng)景用 host 網(wǎng)絡(luò)模式:
docker run --network host my-app # 直接使用主機(jī)網(wǎng)絡(luò)棧,減少 NAT 開(kāi)銷- 跨主機(jī)通信推薦 overlay 網(wǎng)絡(luò)(配合 Kubernetes)。
- 存儲(chǔ)優(yōu)化:
內(nèi)存文件系統(tǒng)加速臨時(shí)數(shù)據(jù):
docker run -v tmpfs:/app/tmp --tmpfs tmpfs:size=64m my-app # 掛載 64MB 內(nèi)存盤(pán)- 生產(chǎn)環(huán)境用 NVMe 等高速存儲(chǔ)插件。
- 鏡像緩存:
多階段構(gòu)建時(shí),依賴層單獨(dú)分層:
FROM maven:3.8.6-openjdk-11 AS builder
COPY pom.xml .
RUN mvn dependency:go-offline # 單獨(dú)分層,依賴不變時(shí)復(fù)用
COPY . .
RUN mvn package- 啟用 BuildKit 緩存:
DOCKER_BUILDKIT=1 docker build --cache-to type=registry,ref=my-registry/cache-image:latest .七、Java 應(yīng)用容器化實(shí)戰(zhàn)
1. Spring Boot 應(yīng)用
(1)項(xiàng)目結(jié)構(gòu)
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 插件直接構(gòu)建鏡像,無(wú)需手動(dòng)編寫(xiě) Dockerfile。
(3)啟動(dòng)容器
docker run -d --name my-app -p 8080:8080 your-registry/app:1.02. 性能優(yōu)化案例
某電商訂單系統(tǒng),日均千萬(wàn)請(qǐng)求,通過(guò)以下優(yōu)化:
- 多階段構(gòu)建 + GraalVM Native Image:鏡像大小從 1.5GB 降至 150MB,啟動(dòng)時(shí)間從 15 秒降至 1 秒。
- 使用 ZGC 垃圾回收器,降低內(nèi)存停頓。
- Docker Compose 管理多服務(wù),Kubernetes 實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
八、Docker 與 Kubernetes:從單機(jī)到集群
1. Kubernetes 是什么?
Kubernetes(K8s)是容器編排的 “操作系統(tǒng)”,幫你管理成百上千個(gè)容器。它能自動(dòng)擴(kuò)縮容、負(fù)載均衡、故障自愈。比如你部署一個(gè)服務(wù),K8s 會(huì)自動(dòng)創(chuàng)建多個(gè)副本,某個(gè)掛了就自動(dòng)重啟,流量自動(dòng)分發(fā)到健康的實(shí)例。
2. 2025 年 Kubernetes 新趨勢(shì)
- AI 調(diào)度器:用機(jī)器學(xué)習(xí)預(yù)測(cè)工作負(fù)載資源需求,資源利用率提升 30%+。比如電商大促時(shí),自動(dòng)為高流量服務(wù)分配更多資源。
- 邊緣節(jié)點(diǎn)管理:支持邊緣計(jì)算場(chǎng)景,邊緣節(jié)點(diǎn)故障時(shí)自動(dòng)遷移容器,保障物聯(lián)網(wǎng)、工業(yè)自動(dòng)化等實(shí)時(shí)應(yīng)用的穩(wěn)定性。
3. 入門示例
- 部署一個(gè)服務(wù):
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 會(huì)自動(dòng)創(chuàng)建 3 個(gè)容器,并通過(guò)負(fù)載均衡對(duì)外提供服務(wù)。
九、總結(jié):Docker 為什么值得學(xué)?
- 環(huán)境一致性:徹底解決 “在我機(jī)器上能跑” 的問(wèn)題。
- 快速部署:秒級(jí)啟動(dòng),支持藍(lán)綠發(fā)布、灰度發(fā)布。
- 資源高效:比虛擬機(jī)節(jié)省 70% 以上資源。
- 生態(tài)豐富:與 CI/CD、Kubernetes、監(jiān)控工具無(wú)縫集成。
如果你是 Java 開(kāi)發(fā)者,Docker 能讓你從繁瑣的環(huán)境配置中解放出來(lái),專注業(yè)務(wù)代碼。而且,Docker 是云原生的基石,學(xué)會(huì)它,你就打開(kāi)了 Kubernetes、微服務(wù)架構(gòu)的大門。
趕緊動(dòng)手試試吧!把你的 Java 項(xiàng)目容器化,體驗(yàn) “一次構(gòu)建,處處運(yùn)行” 的快感。如果遇到問(wèn)題,記得用 docker --help 或 Docker 官方文檔 查資料。相信我,掌握 Docker 后,你會(huì)愛(ài)上這種 “打包即部署” 的開(kāi)發(fā)方式!































