Docker容器化部署踩坑记录
用Docker部署项目几年了,从Windows开发环境到Linux生产环境,踩过不少坑。记录一下实战经验和常见问题。
Windows环境搭建
坑1:Hyper-V和WSL2
Docker Desktop for Windows需要Hyper-V和WSL2支持,Windows 10/11专业版才能用。
启用Hyper-V和容器功能:
1 2 3
| Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All Enable-WindowsOptionalFeature -Online -FeatureName Containers -All
|
安装WSL2:
1 2 3 4 5 6 7 8 9 10 11 12
| wsl --list --online
wsl --install -d Ubuntu
wsl --update wsl --set-default-version 2
wsl -l -v
|
WSL版本对比:
| 特性 |
WSL 1 |
WSL 2 |
| 架构 |
翻译层 |
完整Linux内核 |
| 启动速度 |
快 |
较快 |
| 文件系统性能 |
Windows文件快 |
Linux文件快 |
| 系统调用兼容性 |
部分 |
完整 |
坑2:镜像拉取慢
Docker Hub在国内访问慢,要配镜像加速器。
Docker Desktop配置:
1 2 3 4 5 6 7
| { "registry-mirrors": [ "https://registry.docker-cn.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }
|
阿里云镜像加速器(推荐):
- 登录阿里云容器镜像服务控制台
- 创建个人版实例
- 进入【镜像工具】→【镜像加速器】
- 复制专属加速器地址
Linux服务器配置:
1 2 3 4 5 6 7 8 9
| sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"] } EOF
sudo systemctl daemon-reload sudo systemctl restart docker
|
Dockerfile编写
常用指令
| 指令 |
功能 |
示例 |
| FROM |
基础镜像 |
FROM node:18-alpine |
| WORKDIR |
工作目录 |
WORKDIR /app |
| COPY |
复制文件 |
COPY . /app |
| RUN |
构建命令 |
RUN npm install |
| EXPOSE |
暴露端口 |
EXPOSE 3000 |
| CMD |
启动命令 |
CMD ["node", "index.js"] |
Node.js项目示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| FROM node:18-alpine LABEL maintainer="developer@example.com" WORKDIR /app
COPY package*.json ./ RUN npm config set registry https://registry.npmmirror.com && \ npm ci --only=production
COPY . . EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "index.js"]
|
多阶段构建
减小镜像体积的好方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build
FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY package*.json ./ EXPOSE 3000 CMD ["node", "dist/index.js"]
|
坑3:构建缓存问题
有时候改了代码,构建时却用的缓存。
1 2 3 4 5
| docker build --no-cache -t my-app:latest .
docker system prune -a
|
Harbor私有仓库
配置insecure-registries
自签名证书的Harbor仓库需要配置信任:
1 2 3 4 5 6
| { "insecure-registries": [ "http://harbor.company.com", "http://192.168.1.100:80" ] }
|
镜像推送拉取流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker login harbor.company.com
docker tag my-app:latest harbor.company.com/project/my-app:v1.0.0
docker push harbor.company.com/project/my-app:v1.0.0
docker pull harbor.company.com/project/my-app:v1.0.0
docker logout harbor.company.com
|
坑4:登录失败
可能是daemon.json配置没生效,或者证书问题。
1 2 3 4
| docker logout harbor.company.com sudo systemctl restart docker docker login harbor.company.com
|
Linux服务器安装
CentOS安装Docker
1 2 3 4 5 6 7 8 9 10 11 12
| sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker sudo systemctl enable docker
docker run hello-world
|
Ubuntu安装Docker
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
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
sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
抖音云CLI部署
安装与登录
1 2 3 4 5 6 7 8
| npm install -g @open-dy/cloud-cli --registry=https://registry.npmmirror.com/
dycloud --version
dycloud login -e your@email.com -p yourpassword
|
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| dycloud env:list
dycloud env:switch --app-name myapp --env dev
dycloud service:list
dycloud dockerfile
dycloud service:build --service-name my-service
dycloud container:push --image-id abc123 --service-name my-service
dycloud service:deploy --service-name my-service -t v1.0.0 --service-size 2
|
服务规格:
| 规格代码 |
配置 |
适用场景 |
| 1 |
1核1G |
测试环境 |
| 2 |
2核2G |
生产环境 |
| 3 |
3核3G |
计算密集型 |
容器管理技巧
端口映射
1 2 3 4 5 6 7 8 9 10 11
| docker run -p 8080:80 nginx
docker run -p 80 nginx
docker run -p 127.0.0.1:8080:80 nginx
docker run -p 8080:80 -p 8443:443 nginx
|
数据持久化
1 2 3 4 5 6 7 8
| docker run -v mydata:/data mysql:8.0
docker run -v /host/data:/container/data mysql:8.0
docker run --tmpfs /tmp:size=100m nginx
|
日志管理
1 2 3 4 5 6 7 8
| docker logs container_name
docker logs -f container_name
docker logs --tail 100 container_name
|
配置日志轮转(daemon.json):
1 2 3 4 5 6 7
| { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
|
常见问题排查
坑5:端口被占用
1 2 3 4 5
| netstat -ano | findstr :8080
docker stop container_id
|
坑6:权限不足
1 2 3 4 5
| sudo usermod -aG docker $USER
newgrp docker
|
坑7:镜像拉取失败
1 2 3 4 5 6 7 8
| curl -v https://registry.hub.docker.com/v2/
docker system prune -a
sudo systemctl restart docker
|
性能监控
1 2 3 4 5 6 7 8 9 10 11
| docker stats
docker inspect container_name
docker top container_name
docker system df
|
总结
Docker部署常见问题:
- Windows要开启Hyper-V和WSL2
- 镜像拉取慢就配阿里云加速器
- 构建时遇到缓存问题用–no-cache
- Harbor自签名证书要配insecure-registries
- 生产环境要配日志轮转,防止磁盘占满
- 端口冲突就netstat查看占用情况
Docker容器化确实方便,但要注意镜像体积优化和安全性配置。