使用 Docker 部署 Spring Boot

本文转载连接 : http://www.ityouknow.com/springboot/2018/03/19/spring-boot-docker.html

Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。

首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署。

一个简单 Spring Boot 项目


在 pom.xml 中 ,使用 Spring Boot 2.0 相关依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

添加 web 和测试依赖

<dependencies>
     <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>

创建一个 DockerController,在其中有一个index()方法,访问时返回:
Hello Docker!

@RestController
public class DockerController {
    
    @RequestMapping("/")
    public String index() {
        return "Hello Docker!";
    }
}

启动类

@SpringBootApplication
public class DockerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DockerApplication.class, args);
    }
}

添加完毕后启动项目,启动成功后浏览器放问:http://localhost:8080/,页面返回:Hello Docker!,说明 Spring Boot 项目配置正常。

Spring Boot 项目添加 Docker 支持


在 pom.xml-properties中添加 Docker 镜像名称

<properties>
    <docker.image.prefix>springboot</docker.image.prefix>
</properties>

plugins 中添加 Docker 构建插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <!-- Docker maven plugin -->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                <dockerDirectory>src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
        <!-- Docker maven plugin -->
    </plugins>
</build>

在目录src/main/docker下创建 Dockerfile 文件,Dockerfile 文件用来说明如何来构建镜像

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD spring-boot-docker-1.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中,简单解释一下:

  • FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载

  • VOLUME ,VOLUME
    指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat
    默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录

  • ADD ,拷贝文件并且重命名

  • ENTRYPOINT ,为了缩短 Tomcat的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为ENTRYPOINT

这样 Spring Boot 项目添加 Docker 依赖就完成了。

构建打包环境


我们需要有一个 Docker 环境来打包 Spring Boot 项目,在 Windows 搭建 Docker 环境很麻烦,因此我这里以 Centos 7 为例。

安装 Docker 环境
安装

yum install docker

安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:

ervice docker start
chkconfig docker on

#LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:
systemctl  start docker.service
systemctl  enable docker.service

使用Docker 中国加速器

vi  /etc/docker/daemon.json

#添加后:
{
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "live-restore": true
}

重新启动docker

systemctl restart docker

输入docker version 返回版本信息则安装正常。

安装JDK

yum -y install java-1.8.0-openjdk

配置环境变量
打开 vim /etc/profile
添加一下内容

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64 
export PATH=$PATH:$JAVA_HOME/bin 

修改完成之后,使其生效

source /etc/profile

输入java -version 返回版本信息则安装正常。

安装MAVEN
下载:http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz

## 解压
tar vxf apache-maven-3.5.2-bin.tar.gz
## 移动
mv apache-maven-3.5.2 /usr/local/maven3

修改环境变量, 在/etc/profile中添加以下几行

MAVEN_HOME=/usr/local/maven3
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin

记得执行source /etc/profile使环境变量生效。

输入mvn -version 返回版本信息则安装正常。

这样整个构建环境就配置完成了。

使用 Docker 部署 Spring Boot 项目


将项目 spring-boot-docker 拷贝服务器中,进入项目路径下进行打包测试。

#打包
mvn package
#启动
java -jar target/spring-boot-docker-1.0.jar

看到 Spring Boot 的启动日志后表明环境配置没有问题,接下来我们使用 DockerFile 构建镜像。

mvn package docker:build

第一次构建可能有点慢,当看到以下内容的时候表明构建成功:

...
Step 1 : FROM openjdk:8-jdk-alpine
 ---> 224765a6bdbe
Step 2 : VOLUME /tmp
 ---> Using cache
 ---> b4e86cc8654e
Step 3 : ADD spring-boot-docker-1.0.jar app.jar
 ---> a20fe75963ab
Removing intermediate container 593ee5e1ea51
Step 4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
 ---> Running in 85d558a10cd4
 ---> 7102f08b5e95
Removing intermediate container 85d558a10cd4
Successfully built 7102f08b5e95
[INFO] Built springboot/spring-boot-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 54.346 s
[INFO] Finished at: 2018-03-13T16:20:15+08:00
[INFO] Final Memory: 42M/182M
[INFO] ------------------------------------------------------------------------

使用docker images命令查看构建好的镜像:

docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
springboot/spring-boot-docker   latest              99ce9468da74        6 seconds ago       117.5 MB

springboot/spring-boot-docker 就是我们构建好的镜像,下一步就是运行该镜像

docker run -p 8080:8080 -t springboot/spring-boot-docker

启动完成之后我们使用docker ps查看正在运行的镜像:

docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                    NAMES
049570da86a9        springboot/spring-boot-docker   "java -Djava.security"   30 seconds ago      Up 27 seconds       0.0.0.0:8080->8080/tcp   determined_mahavira

可以看到我们构建的容器正在在运行,访问浏览器:http://192.168.0.x:8080/,返回:Hello Docker!

说明使用 Docker 部署 Spring Boot 项目成功!

部署 Spring Boot 应用程序使用 Docker 涉及多个步骤,包括构建镜像、运行容器以及配置依赖服务如 MySQL 和 Redis。以下是完整的流程: ### ### 1. 准备项目环境 在本地或服务器上确保已经准备好以下内容: - Spring Boot 项目源代码。 - 包含 `Dockerfile` 的项目根目录,用于定义如何构建镜像。 - `application.properties` 或 `application.yml` 文件中配置数据库和缓存的连接信息。 示例 `Dockerfile` 内容如下: ```dockerfile # 使用基础JDK镜像 FROM openjdk:8-jdk-alpine # 将编译好的Spring Boot应用jar包复制到镜像中 COPY target/your-application.jar app.jar # 设置启动命令 ENTRYPOINT ["java", "-jar", "app.jar"] ``` 确保 `pom.xml` 中已正确配置打包为可执行 JAR 文件的内容,以支持容器化部署 [^2]。 ### ### 2. 构建 Spring Boot 应用 使用 Maven 编译并打包 Spring Boot 项目,在项目根目录下运行以下命令: ```bash mvn clean package ``` 该命令会生成一个可执行的 `.jar` 文件,通常位于 `target/` 目录下。 ### ### 3. 构建 Docker 镜像 进入包含 `Dockerfile` 的目录,并运行以下命令来构建镜像: ```bash docker build -t spring-boot-app:latest . ``` 其中 `-t` 参数指定镜像名称和标签 [^3]。 ### ### 4. 启动依赖服务(MySQL 和 Redis) 为了使 Spring Boot 应用能够访问数据库和缓存,可以使用 Docker Compose 来同时管理多个服务。创建 `docker-compose.yml` 文件,内容如下: ```yaml version: '3' services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: springbootdb ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql redis: image: redis:alpine ports: - "6379:6379" volumes: - redis_data:/data springboot-app: build: . ports: - "8080:8080" depends_on: - mysql - redis environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/springbootdb?useSSL=false&serverTimezone=UTC SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: rootpassword SPRING_REDIS_HOST: redis volumes: mysql_data: redis_data: ``` 此配置文件定义了三个服务:MySQL、Redis 和 Spring Boot 应用,其中 Spring Boot 应用通过环境变量获取数据库和 Redis 的连接信息 [^1]。 ### ### 5. 运行 Docker 容器 在 `docker-compose.yml` 所在目录运行以下命令启动所有服务: ```bash docker-compose up -d ``` `-d` 表示以后台模式运行容器。 ### ### 6. 验证部署 访问 `http://<服务器IP>:8080` 确认 Spring Boot 应用是否成功启动并正常工作。可以通过日志查看容器运行状态: ```bash docker-compose logs -f springboot-app ``` ### ### 注意事项 - **前台进程**:确保 Spring Boot 应用以前台方式运行,避免容器因主进程退出而停止 [^2]。 - **网络配置**:Docker Compose 默认为服务之间提供内部网络,因此可以直接使用服务名作为主机名进行通信 [^1]。 - **持久化数据**:通过 `volumes` 配置实现数据持久化,防止容器删除后数据丢失 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值