Docker Desktop 部署新项目详细步骤

Docker Desktop 部署新项目详细步骤

我将详细介绍使用 Docker Desktop 部署一个新项目的完整流程,以 Node.js 应用为例。

一、前期准备

1.1 环境检查

bash 复制代码
# 检查 Docker 版本
docker --version
docker-compose --version

# 启动 Docker Desktop
# 确保 Docker Desktop 处于运行状态

1.2 项目结构准备

复制代码
my-app/
├── src/
│   └── app.js
├── package.json
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
└── README.md

二、创建 Docker 配置文件

2.1 编写 Dockerfile

dockerfile 复制代码
# 使用官方 Node.js 镜像作为基础镜像
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 第二阶段:创建生产镜像
FROM node:18-alpine

WORKDIR /app

# 从构建阶段复制 node_modules
COPY --from=builder /app/node_modules ./node_modules

# 复制应用程序代码
COPY src ./src
COPY package.json ./

# 设置非root用户(安全最佳实践)
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

USER nodejs

# 暴露端口
EXPOSE 3000

# 定义环境变量
ENV NODE_ENV=production

# 启动命令
CMD ["node", "src/app.js"]

2.2 创建 .dockerignore 文件

gitignore 复制代码
node_modules
npm-debug.log
Dockerfile*
docker-compose*
.env
.git
.gitignore
README.md
.vscode
*.md

2.3 创建 docker-compose.yml(可选,用于多容器部署)

yaml 复制代码
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://user:password@db:5432/mydb
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped
    networks:
      - app-network

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - app-network
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - app-network

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

三、构建和运行容器

3.1 构建 Docker 镜像

bash 复制代码
# 进入项目目录
cd my-app

# 构建镜像(-t 指定标签名)
docker build -t my-app:latest .

# 查看构建的镜像
docker images

# 如果有构建缓存问题,使用 --no-cache
docker build --no-cache -t my-app:latest .

3.2 运行容器

bash 复制代码
# 简单运行
docker run -d -p 3000:3000 --name my-app-container my-app:latest

# 带环境变量运行
docker run -d \
  -p 3000:3000 \
  --name my-app-container \
  -e NODE_ENV=production \
  -e DATABASE_URL=postgres://user:password@localhost:5432/mydb \
  my-app:latest

# 挂载卷运行(用于开发)
docker run -d \
  -p 3000:3000 \
  --name my-app-dev \
  -v $(pwd)/src:/app/src \
  -v /app/node_modules \
  my-app:latest

3.3 使用 Docker Compose(推荐)

bash 复制代码
# 启动所有服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 查看日志
docker-compose logs -f app

# 停止服务
docker-compose down

# 停止并删除卷
docker-compose down -v

四、使用 Docker Desktop GUI 管理

4.1 镜像管理

  1. 打开 Docker Desktop
  2. 点击左侧 Images 标签
  3. 可以看到所有本地镜像
  4. 点击 "Run" 按钮可以图形化配置容器

4.2 容器管理

  1. 点击 Containers 标签
  2. 查看运行中的容器
  3. 可以启动/停止/重启/删除容器
  4. 点击容器名称进入详情页
  5. 查看日志、进入终端、检查配置

4.3 使用 Volumes 标签管理数据卷

  1. 查看所有数据卷
  2. 可以创建、删除数据卷
  3. 检查数据卷使用情况

五、开发工作流

5.1 开发环境热重载配置

yaml 复制代码
# docker-compose.dev.yml
version: '3.8'

services:
  app:
    build:
      context: .
      target: builder  # 使用Dockerfile的多阶段构建
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    volumes:
      - ./src:/app/src
      - /app/node_modules
    command: npm run dev
    stdin_open: true
    tty: true

5.2 启动开发环境

bash 复制代码
# 使用开发配置
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# 进入容器进行调试
docker-compose exec app sh

六、调试和故障排除

6.1 常用调试命令

bash 复制代码
# 查看容器日志
docker logs my-app-container
docker logs -f my-app-container  # 实时日志

# 进入容器内部
docker exec -it my-app-container sh

# 检查容器状态
docker ps
docker ps -a  # 查看所有容器(包括停止的)

# 查看容器资源使用
docker stats

# 查看容器详细信息
docker inspect my-app-container

6.2 常见问题解决

端口被占用
bash 复制代码
# 查看端口使用情况
netstat -an | grep 3000

# 或使用 Docker Desktop 修改端口映射
# 停止容器 -> 修改 docker-compose.yml -> 重新启动
镜像构建缓存问题
bash 复制代码
# 清除构建缓存
docker builder prune

# 强制重新构建
docker-compose build --no-cache
权限问题
dockerfile 复制代码
# 在 Dockerfile 中正确处理权限
RUN chown -R nodejs:nodejs /app
USER nodejs

七、生产部署最佳实践

7.1 多阶段构建优化

dockerfile 复制代码
# 第一阶段:构建
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 第二阶段:生产运行
FROM node:18-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
COPY package.json .
EXPOSE 3000
CMD ["node", "dist/main.js"]

7.2 使用 .env 文件管理环境变量

bash 复制代码
# .env 文件
NODE_ENV=production
DATABASE_URL=postgres://user:password@db:5432/production_db
REDIS_URL=redis://redis:6379
yaml 复制代码
# docker-compose.yml 中引用
services:
  app:
    env_file:
      - .env

7.3 健康检查配置

dockerfile 复制代码
# 在 Dockerfile 中添加
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1
yaml 复制代码
# 或在 docker-compose.yml 中添加
services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

八、清理和维护

bash 复制代码
# 停止并删除所有容器
docker-compose down

# 删除未使用的镜像
docker image prune

# 删除未使用的卷
docker volume prune

# 删除所有未使用的 Docker 对象
docker system prune -a

总结

使用 Docker Desktop 部署新项目的关键步骤:

  1. 环境准备:安装 Docker Desktop,验证安装
  2. 项目配置:创建 Dockerfile、.dockerignore、docker-compose.yml
  3. 镜像构建 :使用 docker build 构建应用镜像
  4. 容器运行 :使用 docker rundocker-compose up 启动
  5. GUI 管理:通过 Docker Desktop 可视化界面管理
  6. 开发调试:配置热重载,使用日志和终端调试
  7. 生产优化:实施多阶段构建、健康检查等最佳实践

Docker Desktop 提供了完整的一体化体验,使得容器化应用的开发、部署和管理变得更加简单高效。

相关推荐
科研前沿1 天前
镜像视界 CameraGraph™+多智能体:构建自感知自决策的全域空间认知网络技术方案
大数据·运维·人工智能·数码相机·计算机视觉
暴力求解1 天前
Linux---线程基础
linux·运维·服务器
晚风_END1 天前
Linux|操作系统|最新版openzfs编译记录
linux·运维·服务器·数据库·spring·中间件·个人开发
咖喱o1 天前
QinQ/VLAN Stacking
linux·运维·服务器·网络
sduwcgg1 天前
IQ-Learn 在 RTX 3090 服务器上的环境配置与踩坑记录
运维·服务器
marsh02061 天前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
摇滚侠1 天前
Docker 如何查询挂载的目录
运维·docker·容器
头发够用的程序员1 天前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
勇闯逆流河1 天前
【Linux】linux进程控制(进程池的详解与实现)
linux·运维·服务器
WJ.Polar1 天前
Scapy基本应用
linux·运维·网络·python