Docker容器化部署踩坑记录

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

# 安装Ubuntu
wsl --install -d Ubuntu

# 升级WSL2
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"
]
}

阿里云镜像加速器(推荐):

  1. 登录阿里云容器镜像服务控制台
  2. 创建个人版实例
  3. 进入【镜像工具】→【镜像加速器】
  4. 复制专属加速器地址

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
# 1. 登录Harbor
docker login harbor.company.com

# 2. 打标签(必须包含仓库地址)
docker tag my-app:latest harbor.company.com/project/my-app:v1.0.0

# 3. 推送镜像
docker push harbor.company.com/project/my-app:v1.0.0

# 4. 拉取镜像
docker pull harbor.company.com/project/my-app:v1.0.0

# 5. 退出登录
docker logout harbor.company.com

坑4:登录失败

可能是daemon.json配置没生效,或者证书问题。

1
2
3
4
# 重启Docker
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

# 安装Docker
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

# 添加GPG密钥
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
# 安装CLI(要求Node.js >= 14.0.0)
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

# 生成本地Dockerfile
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

# 指定IP绑定
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
# 使用数据卷(Volume)
docker run -v mydata:/data mysql:8.0

# 使用绑定挂载(Bind Mount)
docker run -v /host/data:/container/data mysql:8.0

# 使用临时文件系统(tmpfs)
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
# 将用户添加到docker组
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缓存
docker system prune -a

# 重启Docker服务
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部署常见问题:

  1. Windows要开启Hyper-V和WSL2
  2. 镜像拉取慢就配阿里云加速器
  3. 构建时遇到缓存问题用–no-cache
  4. Harbor自签名证书要配insecure-registries
  5. 生产环境要配日志轮转,防止磁盘占满
  6. 端口冲突就netstat查看占用情况

Docker容器化确实方便,但要注意镜像体积优化和安全性配置。