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 容器

  1. 构建 JAR 文件

    mvn clean package
    

    生成 target/docker-demo-0.0.1-SNAPSHOT.jar

  2. 构建 Docker 镜像

    docker build -t docker-demo .
    
  3. 运行容器

    docker run -d -p 8080:8080 docker-demo
    
  4. 测试

    • 访问 http://localhost:8080/hello,应返回 Hello, Docker!
    • 验证容器状态:docker ps

步骤 4: 使用 Docker Compose(可选)

为多容器场景(如 Spring Boot + MySQL),创建 docker-compose.yml

version: '3.8'
services:
  app:
    image: docker-demo
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_password
      MYSQL_DATABASE: demo_db
    ports:
      - "3306:3306"

运行

docker-compose up -d

说明

  • 定义两个服务:Spring Boot 应用和 MySQL 数据库。
  • depends_on:确保数据库先启动。

步骤 5: 测试和调试

  1. 验证应用

    • 访问 http://localhost:8080/hello
    • 若使用 MySQL,需在 Spring Boot 项目中添加 JPA 和 MySQL 依赖,并配置 application.properties
  2. 调试技巧

    • 容器日志: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 -DskipTests
    
    FROM 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 场景。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐