功能介紹

什麼是Docker Hub?

Docker Hub是Docker官方提供的雲端倉庫服務,用於存儲和分發Docker鏡像。它是世界上最大的容器鏡像倉庫,包含了大量的官方鏡像和社區貢獻的鏡像。

Docker倉庫的作用

  1. 鏡像存儲:安全存儲Docker鏡像
  2. 鏡像分發:方便地分發和共享鏡像
  3. 版本管理:管理鏡像的不同版本
  4. 協作開發:團隊成員間共享鏡像和配置

倉庫類型

  1. 公共倉庫:任何人都可以訪問和下載的鏡像倉庫
  2. 私有倉庫:僅限授權用户訪問的鏡像倉庫
  3. 官方倉庫:由Docker官方維護的高質量鏡像倉庫

使用教程

Docker Hub賬户管理

# 登錄Docker Hub
docker login

# 登錄到特定倉庫
docker login registry.example.com

# 登出Docker Hub
docker logout

# 查看當前登錄狀態
docker info | grep Username

鏡像推送和拉取

# 為鏡像打標籤(用户名/倉庫名:標籤)
docker tag my-app username/my-app:latest
docker tag my-app username/my-app:v1.0

# 推送鏡像到Docker Hub
docker push username/my-app:latest
docker push username/my-app:v1.0

# 從Docker Hub拉取鏡像
docker pull username/my-app:latest
docker pull username/my-app:v1.0

# 拉取特定平台的鏡像
docker pull --platform linux/amd64 username/my-app:latest

鏡像搜索和發現

# 搜索Docker Hub中的鏡像
docker search nginx
docker search --limit 5 nginx

# 搜索官方鏡像
docker search --filter is-official=true nginx

# 搜索自動構建的鏡像
docker search --filter is-automated=true nginx

Docker Hub Web界面操作

  1. 訪問Docker Hub
  2. 創建賬户或登錄
  3. 創建倉庫
  4. 管理鏡像標籤
  5. 配置自動構建
  6. 管理團隊和權限

私有倉庫搭建

# 使用Docker運行私有倉庫
docker run -d \
  --name registry \
  -p 5000:5000 \
  --restart=always \
  -v registry-data:/var/lib/registry \
  registry:2

# 為私有倉庫鏡像打標籤
docker tag my-app localhost:5000/my-app:latest

# 推送鏡像到私有倉庫
docker push localhost:5000/my-app:latest

# 從私有倉庫拉取鏡像
docker pull localhost:5000/my-app:latest

案例講解

案例一:創建和發佈自己的鏡像

# 1. 創建應用目錄
mkdir my-docker-app && cd my-docker-app

# 2. 創建簡單的應用文件
cat > app.py << EOF
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello Docker Hub!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOF

cat > requirements.txt << EOF
Flask==2.0.1
EOF

# 3. 創建Dockerfile
cat > Dockerfile << EOF
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]
EOF

# 4. 構建鏡像
docker build -t my-docker-app .

# 5. 測試本地鏡像
docker run -d -p 5000:5000 --name test-app my-docker-app
curl http://localhost:5000
docker stop test-app && docker rm test-app

# 6. 登錄Docker Hub
docker login

# 7. 為鏡像打標籤(替換為你的用户名)
docker tag my-docker-app your-username/my-docker-app:latest
docker tag my-docker-app your-username/my-docker-app:v1.0

# 8. 推送鏡像到Docker Hub
docker push your-username/my-docker-app:latest
docker push your-username/my-docker-app:v1.0

# 9. 驗證推送成功
docker rmi your-username/my-docker-app:latest
docker pull your-username/my-docker-app:latest

案例二:配置自動構建

# 1. 在GitHub上創建倉庫並推送代碼
# 包含Dockerfile和應用代碼

# 2. 在Docker Hub上創建自動化構建倉庫
# - 登錄Docker Hub
# - 點擊"Create Repository"
# - 選擇"Create Automated Build"
# - 連接到GitHub賬户
# - 選擇對應的GitHub倉庫
# - 配置構建設置

# 3. 配置構建規則
# 在Docker Hub倉庫設置中:
# - Source Type: Branch
# - Source: main
# - Docker Tag: latest
# - Dockerfile location: /Dockerfile

# 4. 觸發自動構建
# 推送代碼到GitHub倉庫的main分支
git add .
git commit -m "Update for auto-build"
git push origin main

# 5. 監控構建過程
# 在Docker Hub倉庫頁面查看Build Details

案例三:搭建企業私有倉庫

# 1. 創建證書目錄
mkdir -p certs && cd certs

# 2. 生成自簽名證書(生產環境應使用正式證書)
openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout domain.key \
  -addext "subjectAltName = DNS:registry.example.com" \
  -x509 -days 365 -out domain.crt

# 3. 運行帶認證和TLS的私有倉庫
docker run -d \
  --name registry \
  --restart=always \
  -p 443:5000 \
  -v $(pwd)/certs:/certs \
  -v registry-data:/var/lib/registry \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

# 4. 配置Docker客户端信任證書
# 將domain.crt複製到/etc/docker/certs.d/registry.example.com/
sudo mkdir -p /etc/docker/certs.d/registry.example.com/
sudo cp domain.crt /etc/docker/certs.d/registry.example.com/

# 5. 創建htpasswd文件用於認證
docker run \
  --entrypoint htpasswd \
  httpd:2 -Bbn myuser mypassword > htpasswd

# 6. 運行帶認證的私有倉庫
docker run -d \
  --name registry-auth \
  --restart=always \
  -p 443:5000 \
  -v $(pwd)/certs:/certs \
  -v $(pwd)/htpasswd:/auth/htpasswd \
  -v registry-data:/var/lib/registry \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

# 7. 使用私有倉庫
# 登錄
docker login registry.example.com

# 打標籤並推送
docker tag my-app registry.example.com/my-app:latest
docker push registry.example.com/my-app:latest

# 拉取
docker pull registry.example.com/my-app:latest

常見問題解答

Q1: 如何解決推送鏡像失敗的問題?

A: 推送鏡像失敗的常見原因及解決方案:

  1. 認證問題
# 確保已登錄
docker login

# 檢查用户名和鏡像名是否匹配
docker tag my-app username/my-app:latest
  1. 鏡像名格式錯誤
# 正確格式:username/repository:tag
docker tag my-app myusername/my-repo:latest
  1. 網絡問題
# 檢查網絡連接
ping hub.docker.com

# 使用代理(如果需要)
docker push --proxy http://proxy.company.com:8080 username/my-app:latest
  1. 存儲空間不足
# 檢查Docker Hub存儲配額
# 在Docker Hub賬户設置中查看

# 清理不需要的鏡像
docker image prune -a

Q2: 如何管理鏡像版本?

A: 鏡像版本管理的最佳實踐:

# 1. 使用語義化版本號
docker tag my-app username/my-app:1.0.0  # 主版本.次版本.修訂版本

# 2. 使用Git提交哈希作為標籤
GIT_COMMIT=$(git rev-parse --short HEAD)
docker tag my-app username/my-app:$GIT_COMMIT

# 3. 同時標記latest版本
docker tag my-app username/my-app:1.0.0
docker tag my-app username/my-app:latest

# 4. 使用日期作為標籤
DATE_TAG=$(date +%Y%m%d)
docker tag my-app username/my-app:$DATE_TAG

# 5. 查看遠程倉庫中的鏡像標籤
curl -s https://hub.docker.com/v2/repositories/username/my-app/tags/ | jq '.results[].name'

Q3: 如何提高鏡像安全性?

A: 提高鏡像安全性的方法:

# 1. 使用官方基礎鏡像
FROM node:16-alpine  # 而不是 FROM ubuntu:latest

# 2. 掃描鏡像漏洞
# 安裝Docker Scout CLI
docker scout quickview username/my-app:latest

# 3. 使用非root用户運行容器
# Dockerfile中添加:
RUN addgroup -g 1001 -S appgroup && \
    adduser -u 1001 -S appuser -G appgroup
USER 1001

# 4. 定期更新基礎鏡像
# 使用具體版本而非latest
FROM python:3.9.7-alpine

# 5. 使用多階段構建減小攻擊面
# 構建階段
FROM node:16 AS builder
# ...

# 運行階段
FROM alpine:latest
# 只複製必要的文件
COPY --from=builder /app/dist /app

最佳實踐

1. 鏡像命名規範

  • 使用有意義的倉庫名稱
  • 遵循命名約定:username/repository:tag
  • 使用語義化版本號
  • 保留latest標籤指向最新的穩定版本

2. 倉庫管理最佳實踐

  • 定期清理不需要的鏡像標籤
  • 為重要鏡像設置描述和文檔
  • 配置自動構建以確保一致性
  • 使用Webhook集成CI/CD流程

3. 安全最佳實踐

  • 啓用鏡像漏洞掃描
  • 使用內容信任(Docker Content Trust)
  • 定期更新基礎鏡像
  • 限制私有倉庫的訪問權限

4. 性能優化實踐

  • 使用.dockerignore排除不必要的文件
  • 合理安排Dockerfile指令順序
  • 使用多階段構建減小鏡像大小
  • 啓用鏡像壓縮

命令速查表

命令 描述
docker login 登錄到倉庫
docker logout 登出倉庫
docker tag <source> <target> 為鏡像打標籤
docker push <image> 推送鏡像到倉庫
docker pull <image> 從倉庫拉取鏡像
docker search <term> 搜索鏡像
docker search --filter is-official=true <term> 搜索官方鏡像
docker info 查看Docker信息
docker system df -v 查看鏡像磁盤使用情況