目錄

  • 基礎概念問題
  • 安裝與配置問題
  • 鏡像操作問題
  • 容器操作問題
  • 網絡與存儲問題
  • 性能與資源問題
  • 開發環境問題

基礎概念問題

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 衝突、硬件虛擬化未開啓

解決方案

  1. 檢查硬件虛擬化:BIOS 中開啓 VT-x/AMD-V
  2. Windows 10/11:確保使用 WSL2 後端
    wsl --install
    wsl --set-default-version 2
    
  3. 關閉衝突軟件:禁用 VMware、VirtualBox
  4. 管理員權限運行:右鍵以管理員身份安裝

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 時常見問題主要集中在概念理解、網絡配置、存儲管理和性能優化等方面。記住以下幾個關鍵點:

  1. 理解架構:容器不是虛擬機,是進程隔離環境
  2. 善用文檔docker --help 和官方文檔是最好的老師
  3. 漸進學習:從簡單的單容器應用開始,逐步學習多容器編排
  4. 實踐為王:多動手實踐,遇到問題先看日誌再搜索

希望這份指南能幫助你順利度過 Docker 新手期!