目錄
- 基礎概念問題
- 安裝與配置問題
- 鏡像操作問題
- 容器操作問題
- 網絡與存儲問題
- 性能與資源問題
- 開發環境問題
基礎概念問題
1. Docker 和虛擬機有什麼區別?
問題描述:很多新手認為 Docker 就是輕量級虛擬機
解答:
| 特性 | 虛擬機 | Docker 容器 |
|---|---|---|
| 虛擬化級別 | 硬件級虛擬化 | 操作系統級虛擬化 |
| 啓動速度 | 慢(分鐘級) | 快(秒級) |
| 性能損耗 | 高(15-20%) | 低(1-3%) |
| 隔離性 | 完全隔離 | 進程級別隔離 |
| 鏡像大小 | GB 級別 | MB 級別 |
關鍵理解:Docker 容器共享宿主機的內核,只是進程的隔離環境。
2. 鏡像(Image)和容器(Container)的關係?
比喻:鏡像像是"安裝程序",容器像是"運行中的程序"
# 鏡像操作
docker pull nginx:latest # 下載鏡像
docker images # 查看本地鏡像
# 容器操作
docker run -d nginx:latest # 從鏡像創建容器
docker ps # 查看運行中的容器
安裝與配置問題
3. Docker Desktop 安裝失敗(Windows/Mac)
常見錯誤:WSL2 問題、Hyper-V 衝突、硬件虛擬化未開啓
解決方案:
- 檢查硬件虛擬化:BIOS 中開啓 VT-x/AMD-V
- Windows 10/11:確保使用 WSL2 後端
wsl --install wsl --set-default-version 2 - 關閉衝突軟件:禁用 VMware、VirtualBox
- 管理員權限運行:右鍵以管理員身份安裝
4. 國內鏡像源配置
問題:docker pull 速度慢或失敗
配置國內鏡像(Docker Desktop):
// Docker Desktop -> Settings -> Docker Engine
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
Linux 系統配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl restart docker
鏡像操作問題
5. Dockerfile 構建常見錯誤
錯誤示例:
# 錯誤:每一行 RUN 都會創建新層,導致鏡像過大
RUN apt-get update
RUN apt-get install -y python3
RUN pip install requests
RUN pip install numpy
# 正確:合併 RUN 命令,清理緩存
RUN apt-get update && \
apt-get install -y python3 pip && \
pip install requests numpy && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
最佳實踐:
- 使用
.dockerignore文件排除不必要的文件 - 多階段構建減少鏡像大小
- 固定基礎鏡像版本(避免使用 latest)
6. 鏡像清理空間不足
清理命令:
# 刪除所有停止的容器
docker container prune
# 刪除所有未使用的鏡像
docker image prune -a
# 刪除所有未使用的網絡、構建緩存等
docker system prune -a
# 查看磁盤使用情況
docker system df
容器操作問題
7. 容器啓動後立即退出
常見原因:前台進程退出、配置錯誤
診斷方法:
# 查看容器日誌
docker logs <container_id>
# 交互式運行排查
docker run -it <image> /bin/bash
# 檢查容器詳情
docker inspect <container_id>
解決方案:
# 確保有前台進程運行
CMD ["nginx", "-g", "daemon off;"]
# 或使用腳本保持運行
CMD ["sh", "-c", "while true; do sleep 30; done"]
8. 端口映射失敗
問題:訪問 localhost:8080 無響應
正確做法:
# 映射主機端口到容器端口
docker run -p 主機端口:容器端口
# 示例:將主機 8080 映射到容器 80
docker run -d -p 8080:80 nginx
# 查看端口映射
docker port <container_id>
常見坑點:
- Windows/Mac Docker Desktop:使用 localhost 或 127.0.0.1
- Linux:可能需要配置防火牆規則
網絡與存儲問題
9. 容器間通信問題
解決方案:
# 創建自定義網絡
docker network create my-network
# 容器使用同一網絡
docker run -d --name web --network my-network nginx
docker run -it --network my-network alpine ping web
10. 數據持久化問題
方式對比:
# 1. 綁定掛載(開發常用)
docker run -v /host/path:/container/path nginx
# 2. 數據卷(生產推薦)
docker volume create my-volume
docker run -v my-volume:/container/path nginx
# 3. 臨時文件系統
docker run --tmpfs /tmp nginx
性能與資源問題
11. 容器資源限制
防止容器佔用過多資源:
# 內存限制
docker run -m 512m --memory-swap=1g nginx
# CPU 限制
docker run --cpus=1.5 nginx
# 查看資源使用
docker stats
12. 大鏡像構建優化
多階段構建示例:
# 第一階段:構建環境
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 第二階段:運行環境
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
開發環境問題
13. 開發時文件同步(熱重載)
使用綁定掛載實現代碼實時同步:
# 開發模式運行
docker run -v $(pwd):/app -p 3000:3000 node:16
# 使用 Docker Compose 更便捷
docker-compose.yml 示例:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
environment:
- NODE_ENV=development
14. 調試技巧
進入運行中的容器:
# 執行命令
docker exec -it <container_id> /bin/bash
# 查看實時日誌
docker logs -f <container_id>
# 拷貝文件
docker cp <container_id>:/path/to/file ./local/path
總結
新手使用 Docker 時常見問題主要集中在概念理解、網絡配置、存儲管理和性能優化等方面。記住以下幾個關鍵點:
- 理解架構:容器不是虛擬機,是進程隔離環境
- 善用文檔:
docker --help和官方文檔是最好的老師 - 漸進學習:從簡單的單容器應用開始,逐步學習多容器編排
- 實踐為王:多動手實踐,遇到問題先看日誌再搜索
希望這份指南能幫助你順利度過 Docker 新手期!