乐趣区

SpringBoot使用Docker快速部署项目

1. 简介

建议阅读本文最好对 Dokcer 有一些了解

首先我们先了解一下 Docker 是什么

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 有什么用途

  • 提供一次性的环境
  • 提供弹性的云服务
  • 组建微服务架构

如何搭建 Docker 环境

使用 yum 安装

# 查看你当前的内核版本
uname -r

#安装 Docker
yum -y install docker

#启动 Docker 后台服务
service docker start

#测试运行 hello-world, 由于本地没有 hello-world 这个镜像,所以会下载一个 hello-world 的镜像,并在容器内运行。docker run hello-world

脚本安装:

# 确保 yum 包更新到最新
sudo yum update

#执行 Docker 安装脚本, 执行这个脚本会添加 docker.repo 源并安装 Docker。curl -fsSL https://get.docker.com/ | sh

#启动 Docker 进程
sudo service docker start

#验证 docker 是否安装成功并在容器中执行一个测试的镜像
sudo docker run hello-world

因为国内下载镜像速度较慢,推荐使用替换为国内的镜像源

执行命令

vim /etc/docker/daemon.json
加入以下代码
{"registry-mirrors": ["<your accelerate address>"]
}

2. 创建项目

首先我们先创建一个 SpringBoot 的项目, 这个步骤就不在重复了,可以使用 IDEA 构建或者访问 SpringBoot 项目来进行构建项目。

完整的项目结构:

boot-docker
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── bootdocker
    │   │               └── BootDockerApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates

然后创建一个控制器,这里不做的太复杂,主要就是来演示 Docker 怎么部署项目。

主要代码:

启动然后打开浏览器访问接口地址:

项目完成,现在开始部署到 Docker 中。

3. 部署项目

3.1 使用 Dockerfile

在部署项目之前我们要先了解一下 Dockerfile 是什么?

Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的 image。相比 image 这种黑盒子,Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确的表明 image 是怎么产生的。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。参考

我们先把项目进行打包执行, 执行。

mvn package

创建 Dockerfile 文件

touch Dockerfile 

在 Dockerfile 中加入以下信息:

注意 Dockerfile 必须和 Jar 包在同一路径下

FROM java:8
EXPOSE 8080
VOLUME /slm
ADD boot-docker-0.0.1-SNAPSHOT.jar boot-docker.jar
RUN sh -c 'touch /boot-docker.jar'
ENV JAVA_OPTS=""ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /boot-docker.jar"]
  • FROM 基础镜像必要,代表你的项目将构建在这个基础上面
  • EXPOSE 允许指定端口转发
  • VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
  • ADD 将文件从路径 <src> 复制添加到容器内部路径 <dest> 支持远程 url 如果是远程 url 权限将会是 600
  • ENV 可以用于为 docker 容器设置环境变量
  • ENTRYPOINT 指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。

    • CMD 和 ENTRYPOINT 都能用来指定开始运行的程序,而且这两个命令都有两种不用的语法:

      • CMD ["ls",''-l"]
        CMD ls -l

开始构建:

docker build -t boot-docker .

-t boot-docker 代表你要构建的名字

更多参数输入查看:docker build –help

控制台输出:

Sending build context to Docker daemon  16.81MB
Step 1/7 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/7 : EXPOSE 8080
 ---> Using cache
 ---> b2445bf62da8
Step 3/7 : VOLUME /slm
 ---> Using cache
 ---> b73d0b73b868
Step 4/7 : ADD boot-docker-0.0.1-SNAPSHOT.jar boot-docker.jar
 ---> Using cache
 ---> 2b4868aafca9
Step 5/7 : RUN sh -c 'touch /boot-docker.jar'
 ---> Using cache
 ---> 816b59f199af
Step 6/7 : ENV JAVA_OPTS=""
 ---> Using cache
 ---> 784f033b9dd6
Step 7/7 : ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /boot-docker.jar"]
 ---> Using cache
 ---> 92a0da91ea19
Successfully built 92a0da91ea19
Successfully tagged bootdocker:latest

我们可以看到已经构建完成,Successfully built 92a0da91ea19 这句话指明了刚刚构建的镜像 ID 现在我们可以根据这个 ID 来进行操作。

输入 run 命令来启动。

docker run -d -p 8080:8080 92a0da91ea19

控制台输出:

root@izz30yg92yl9i3z /# docker run -d -p 8080:8080 92a0da91ea19
62b837ac75e3d83a4be2d7b0f6edee5ff70c69a98bac4ff74c7ed6d3e70282ee
root@izz30yg92yl9i3z /#
  • -d 表示后台运行
  • - p 映射端口

已经运行成功访问接口。注意这里因为映射到了宿主机的端口所以访问的是宿主机的 IP 加端口

更多参数输入查看:docker build –help

3.2 使用 Maven 构建

上面说了使用 Dockerfile 构建,现在使用 Maven 来构建,

在 pom 中加入 docker 构建依赖

    <plugin>
                <!-- 新增的 docker maven 插件 -->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <!-- 镜像名字 -->
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                       <!--DokcerFile 文件地址 -->
                    <dockerDirectory>/slm/</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

注意 dockerDirectory 还是要设置 Dockerfile 文件的路径

把项目复制到 Linux 主机中,执行解压命令

unzip boot-docker.zip
cd boot-docker

执行命令:

mvn package docker:build

控制台输出:

[INFO] Building image boot-docker/boot-docker
Step 1/7 : FROM java:8

 ---> d23bdf5b1b1b
Step 2/7 : EXPOSE 8080

 ---> Using cache
 ---> b2445bf62da8
Step 3/7 : VOLUME /slm

 ---> Using cache
 ---> b73d0b73b868
Step 4/7 : ADD boot-docker-0.0.1-SNAPSHOT.jar boot-docker.jar

 ---> Using cache
 ---> 2b4868aafca9
Step 5/7 : RUN sh -c 'touch /boot-docker.jar'

 ---> Using cache
 ---> 816b59f199af
Step 6/7 : ENV JAVA_OPTS=""

 ---> Using cache
 ---> 784f033b9dd6
Step 7/7 : ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /boot-docker.jar"]

 ---> Using cache
 ---> 92a0da91ea19
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 92a0da91ea19
Successfully tagged boot-docker/boot-docker:latest
[INFO] Built boot-docker/boot-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.908s
[INFO] Finished at: Wed Jul 10 16:00:21 CST 2019
[INFO] Final Memory: 35M/86M
[INFO] ------------------------------------------------------------------------

和上面相同。启动

欢迎转发点赞

退出移动版