Docker 入门:容器化开发的强大工具
Docker 入门:容器化开发的强大工具
今天我们来深入探讨 Docker,一个彻底改变软件开发和部署方式的容器化平台。Docker 以其轻量、便携和高一致性的特性,成为现代 DevOps 和微服务架构的核心工具。本文将带你从零搭建一个简单的 Docker 应用,结合 Spring Boot 部署一个 Web 服务,适合初学者快速上手,同时为有经验的开发者提供进阶建议和优化思路。
Docker 通过容器技术将应用及其依赖打包,确保开发、测试和生产环境一致。本文基于 Docker 26.x(最新稳定版),使用 Maven 构建一个 Spring Boot 项目,并通过 Docker 容器运行。让我们开始吧!
前置准备
在开始之前,确保开发环境已就绪:
- 操作系统:Linux(如 Ubuntu)、MacOS 或 Windows(推荐 WSL2)。
- Docker:安装 Docker Desktop(Windows/Mac)或 Docker Engine(Linux)。
- JDK:推荐 JDK 17(Spring Boot 3.x 要求 JDK 17+,2.x 支持 JDK 8+)。
- Maven:用于构建 Spring Boot 项目,确保配置好环境变量。
- IDE:IntelliJ IDEA 或 VS Code,方便编辑代码和 Dockerfile。
- 项目结构:创建一个 Spring Boot 项目,目录如下:
docker-demo ├── src │ ├── main │ │ ├── java │ │ │ └── com.example.demo │ │ │ ├── controller │ │ │ └── DemoApplication.java │ │ ├── resources │ │ │ └── application.properties │ └── test ├── Dockerfile └── pom.xml
安装 Docker:
- Linux:
sudo apt update && sudo apt install docker.io
- MacOS:
brew install docker
- Windows:下载 Docker Desktop(启用 WSL2)。
- 验证:运行
docker --version
确认安装成功。
推荐使用 Spring Initializr 生成 Spring Boot 项目:
- 项目:Maven
- 语言:Java
- Spring Boot 版本:3.3.x
- 依赖:Spring Web
步骤 1: 创建 Spring Boot 项目
生成一个简单的 Spring Boot 项目,包含一个 REST 端点。
Maven 依赖
在 pom.xml
中配置:
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>docker-demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version><relativePath/></parent><dependencies><!-- Spring Boot Web 启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
说明:
spring-boot-starter-web
:包含嵌入式 Tomcat 和 Spring MVC。spring-boot-maven-plugin
:生成可执行 JAR。
REST 控制器
在 com.example.demo.controller.HelloController
创建控制器:
package com.example.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, Docker!";}
}
配置文件
在 src/main/resources/application.properties
中配置端口(可选):
server.port=8080
步骤 2: 创建 Dockerfile
在项目根目录创建 Dockerfile
:
# 使用官方 OpenJDK 镜像作为基础
FROM openjdk:17-jdk-slim# 设置工作目录
WORKDIR /app# 复制 JAR 文件
COPY target/docker-demo-0.0.1-SNAPSHOT.jar app.jar# 暴露端口
EXPOSE 8080# 运行应用
ENTRYPOINT ["java", "-jar", "app.jar"]
说明:
openjdk:17-jdk-slim
:轻量级 JDK 17 镜像。COPY
:将构建的 JAR 复制到容器。EXPOSE
:声明应用端口。ENTRYPOINT
:启动 Spring Boot 应用。
步骤 3: 构建和运行 Docker 容器
-
构建 JAR 文件:
mvn clean package
生成
target/docker-demo-0.0.1-SNAPSHOT.jar
。 -
构建 Docker 镜像:
docker build -t docker-demo .
-
运行容器:
docker run -d -p 8080:8080 docker-demo
-
测试:
- 访问
http://localhost:8080/hello
,应返回Hello, Docker!
。 - 验证容器状态:
docker ps
。
- 访问
步骤 4: 使用 Docker Compose(可选)
为多容器场景(如 Spring Boot + MySQL),创建 docker-compose.yml
:
version: '3.8'
services:app:image: docker-demobuild:context: .dockerfile: Dockerfileports:- "8080:8080"depends_on:- dbdb:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: your_passwordMYSQL_DATABASE: demo_dbports:- "3306:3306"
运行:
docker-compose up -d
说明:
- 定义两个服务:Spring Boot 应用和 MySQL 数据库。
depends_on
:确保数据库先启动。
步骤 5: 测试和调试
-
验证应用:
- 访问
http://localhost:8080/hello
。 - 若使用 MySQL,需在 Spring Boot 项目中添加 JPA 和 MySQL 依赖,并配置
application.properties
。
- 访问
-
调试技巧:
- 容器日志:
docker logs <container_id>
。 - 构建失败:检查
Dockerfile
语法或依赖。 - 端口冲突:确保宿主机 8080 端口未被占用。
- 清理容器:
docker rm -f $(docker ps -aq)
。
- 容器日志:
进阶与最佳实践
- 多阶段构建:优化镜像大小:
FROM maven:3.8.6-openjdk-17 AS builder WORKDIR /app COPY . . RUN mvn clean package -DskipTestsFROM openjdk:17-jdk-slim WORKDIR /app COPY --from=builder /app/target/docker-demo-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
- Docker Compose 高级配置:添加网络、健康检查和卷挂载。
- 镜像优化:使用
.dockerignore
排除不必要文件。 - CI/CD 集成:结合 GitHub Actions 或 Jenkins 自动化构建和部署。
- 监控:使用 Prometheus 和 Grafana 监控容器性能。
- 资源推荐:Docker 官网(docker.com)、《Docker Deep Dive》。多实践多容器应用和编排。
总结
通过这个 Docker 示例,你学会了创建 Spring Boot 项目、编写 Dockerfile、构建和运行容器。Docker 的容器化技术简化了开发和部署流程,适合微服务和 DevOps 场景。