1. Docker 入门实战:从零部署 Java 和 Node 项目
Docker 已经成为现代应用开发和部署的标配工具。作为一个从业多年的全栈开发者,我见证了 Docker 如何彻底改变我们的开发流程。本文将带你从零开始,完整走通 Docker 的学习路径,最终实现 Java 和 Node 项目的容器化部署。
1.1 为什么选择 Docker?
传统开发环境中,我们经常遇到"在我机器上能跑"的问题。Docker 通过容器化技术解决了环境一致性的痛点。与虚拟机相比,Docker 容器更轻量、启动更快、资源占用更少。根据我的实测,一个简单的 Java 应用容器启动时间通常在 1-2 秒,而相同应用的虚拟机启动可能需要 30 秒以上。
提示:如果你在 Windows 上遇到 "virtualization support not detected" 错误,需要在 BIOS 中开启虚拟化支持(VT-x/AMD-V)。
1.2 学习路线规划
对于初学者,我建议按照以下路径学习:
- Docker 基础概念和安装
- 镜像和容器操作
- Dockerfile 编写
- 多容器应用管理(Docker Compose)
- 实际项目部署
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker 环境准备
2.1 安装 Docker
不同平台的安装方式略有差异:
Windows/macOS:
- 推荐使用 Docker Desktop(图形界面工具)
- 安装后需要重启系统
Linux:
bash复制# Ubuntu 示例
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装完成后验证:
bash复制docker --version
docker run hello-world
2.2 常见安装问题解决
-
Docker Desktop 启动失败:
- 检查虚拟化是否开启(任务管理器 → 性能选项卡)
- 尝试重置 Docker Desktop 设置
-
权限问题(Linux):
bash复制sudo usermod -aG docker $USER
newgrp docker
3. Docker 核心概念实战
3.1 镜像与容器
镜像(Image)是静态的模板,容器(Container)是镜像的运行实例。理解这两者的关系至关重要。
基础操作:
bash复制# 拉取镜像
docker pull nginx:latest
# 运行容器
docker run -d -p 8080:80 --name my-nginx nginx
# 查看运行中的容器
docker ps
# 进入容器
docker exec -it my-nginx bash
3.2 数据持久化
容器默认是临时存储,重要数据需要挂载卷:
bash复制docker run -v /宿主机路径:/容器路径 ...
4. Dockerfile 深度解析
4.1 Java 项目 Dockerfile 示例
dockerfile复制# 使用官方 OpenJDK 镜像
FROM openjdk:11-jdk-slim
# 设置工作目录
WORKDIR /app
# 复制构建文件
COPY target/myapp.jar .
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "myapp.jar"]
构建命令:
bash复制docker build -t my-java-app .
4.2 Node 项目 Dockerfile 示例
dockerfile复制# 使用官方 Node 镜像
FROM node:14-alpine
# 设置工作目录
WORKDIR /usr/src/app
# 复制 package 文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制源代码
COPY . .
# 构建应用
RUN npm run build
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
注意:使用 alpine 版本可以显著减小镜像体积(通常减少 50% 以上)
5. 多容器应用管理
5.1 Docker Compose 实战
对于需要多个服务的应用(如 Java + MySQL),使用 docker-compose.yml:
yaml复制version: '3'
services:
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
启动命令:
bash复制docker-compose up -d
5.2 网络配置技巧
容器间通信的最佳实践:
- 使用自定义网络
- 通过服务名访问(如
db:3306) - 避免使用
links(已过时)
6. 生产环境部署要点
6.1 镜像优化
- 使用多阶段构建:
dockerfile复制# 构建阶段
FROM maven:3.6-jdk-11 AS build
COPY . .
RUN mvn package
# 运行阶段
FROM openjdk:11-jre-slim
COPY --from=build /target/app.jar .
CMD ["java", "-jar", "app.jar"]
- 其他优化技巧:
- 使用
.dockerignore文件 - 合并 RUN 指令减少层数
- 删除不必要的依赖
- 使用
6.2 资源限制
防止单个容器占用过多资源:
bash复制docker run -it --memory="512m" --cpus="1.5" ...
7. 常见问题排查
7.1 内存问题
Java 应用 OutOfMemoryError:
- 调整 JVM 参数:
bash复制docker run -e JAVA_OPTS="-Xmx512m -Xms256m" ...
7.2 网络问题
容器无法访问外部网络:
bash复制# 检查 DNS 配置
docker run --dns 8.8.8.8 ...
7.3 存储问题
数据卷权限问题:
bash复制# 解决容器用户权限问题
docker run -v /data:/data:z ...
8. 进阶技巧
8.1 使用 NVM 管理 Node 版本
在开发环境中:
bash复制# 安装指定版本
nvm install 14
# 切换版本
nvm use 14
8.2 监控与日志
查看容器日志:
bash复制docker logs -f 容器名
资源监控:
bash复制docker stats
9. 实际项目部署流程
9.1 Java 项目完整流程
- 本地构建 JAR 包
- 编写 Dockerfile
- 构建镜像
- 推送到镜像仓库
- 服务器拉取并运行
9.2 Node 项目完整流程
- 确保 package.json 正确
- 编写 Dockerfile
- 构建镜像
- 配置环境变量
- 部署运行
10. 持续学习资源
- 官方文档:https://docs.docker.com/
- 实践项目:尝试容器化你的现有项目
- 社区资源:Docker 官方论坛、Stack Overflow
我在实际项目中发现,掌握 Docker 的最佳方式就是不断实践。从简单的单容器应用开始,逐步尝试更复杂的多服务架构。遇到问题时,Docker 的日志和监控工具是你的好帮手。记住,每个错误都是学习的机会。
