如何用docker部署spring boot项目

1,037 阅读7分钟

 最近的一个项目需要用到docker来部署运维项目,由于之前只是简单的用过一点,虽然在服务器上搭了环境,但是一直没有真正使用过,这次正好提前练手,熟悉一下整个docker部署服务的流程,话不多说。整! (这边我用一个eureka的服务端作为示例)

1.docker环境的搭建

 首先检查一下服务器上面的docker版本

docker verion

 由于我的版本较低,所以我选择升级,升级需要删掉之前的旧版本 (由于我的docker没有启动,所以直接删除就好,如果有正在运行的容器需要先停止,再关掉docker,最后在删除)

yum remove docker  docker-common docker-selinux docker-engine

 安装所需软件,yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

 使用官方源地址

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

 超时失败。。。。
 配置阿里云的源地址

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 完成之后查看仓库可以安装的docker版本

yum list docker-ce --showduplicates | sort -r

docker-ce.x86_64            3:18.09.2-3.el7                    docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                    docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                   docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                   docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                   docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                   docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos            docker-ce-stable

 这里有很多版本,可以按照特定的版本,不过我们为了升级,当然是按照最新版本

sudo yum install docker-ce
or
sudo yum install docker-ce-18.06.0.ce-3.el7

 安装完之后就可以启动docker了

2.docker启动

 首先设置docker为开机启动

systemctl enable docker

 直接启动

systemctl start docker

 查看状态

systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2020-07-20 16:56:25 CST; 2 days ago
     Docs: https://docs.docker.com
 Main PID: 10992 (dockerd)
    Tasks: 12
   Memory: 133.9M
   CGroup: /system.slice/docker.service
           └─10992 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

7月 20 16:56:25 orange dockerd[10992]: time="2020-07-20T16:56:25.420273881+08:00" level=info msg="Docker daemon" commit=48a66213fe graphdriver(s)=overlay version=19.03.12
7月 20 16:56:25 orange dockerd[10992]: time="2020-07-20T16:56:25.420374250+08:00" level=info msg="Daemon has completed initialization"
7月 20 16:56:25 orange dockerd[10992]: time="2020-07-20T16:56:25.450725623+08:00" level=info msg="API listen on /var/run/docker.sock"
7月 20 16:56:25 orange systemd[1]: Started Docker Application Container Engine.

 查看版本

docker version
 Version:           19.03.12
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:46:54 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:45:28 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

 到这里docker安装及启动已经完成了,现在可以开始部署自己的spring boot服务了

3.部署服务

 首先需要将自己的springboot项目打包,直接在idea里面用maven install即可,再把打好的jar包上传到服务器

 然后就是需要编写dockerfile文件

vim dockerfile
FROM java:8
MAINTAINER orange
VOLUME /tmp
ADD eureka-1.0.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • FROM 是指引用的基础镜像是java 8也就是运行环境是jdk1.8
  • MAINTAINER 维护者信息
  • VOLUME 用于指定持久化目录,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录,所以用这个目录作为持久化目录
  • ADD 将本地文件添加到容器中并重命名
  • RUN 构建镜像时执行的命令 这里就是运行咱们项目的jar包
  • ENTRYPOINT 配置容器 这里配置的是tomcat的获取随机数的配置,如果使用系统默认的方法,可能会造成响应缓慢

 编辑完dockerfile之后就可以开始制作镜像了

 将dockerfile和上面步骤中上传的jar放在同一目录下,然后执行

docker build -t hope-server .
 ---> Running in b103f0dc0100
Removing intermediate container b103f0dc0100
 ---> 27248c274b97
Step 3/6 : VOLUME /tmp
 ---> Running in 00ab20719506
Removing intermediate container 00ab20719506
 ---> 8b03c7d7dc47
Step 4/6 : ADD eureka-1.0.0-SNAPSHOT.jar app.jar
 ---> cb269880f278
Step 5/6 : RUN bash -c 'touch /app.jar'
 ---> Running in 54f6087fa2a4
Removing intermediate container 54f6087fa2a4
 ---> ffbd61fa294a
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
 ---> Running in 83c7b669fcbd
Removing intermediate container 83c7b669fcbd
 ---> d5d28abe3ea4
Successfully built d5d28abe3ea4
Successfully tagged hope-server:latest

 最终结果显示Successfully代表我们制作成功镜像,这个时候可以通过命令来查看我们制作的镜像

docker images
hope-server                    latest              d5d28abe3ea4        56 seconds ago      769MB
hyperledger/fabric-tools       latest              0403fd1c72c7        3 years ago         1.32GB
hyperledger/fabric-tools       x86_64-1.0.0        0403fd1c72c7        3 years ago         1.32GB
hyperledger/fabric-couchdb     latest              2fbdbf3ab945        3 years ago         1.48GB
hyperledger/fabric-couchdb     x86_64-1.0.0        2fbdbf3ab945        3 years ago         1.48GB
hyperledger/fabric-kafka       latest              dbd3f94de4b5        3 years ago         1.3GB
hyperledger/fabric-kafka       x86_64-1.0.0        dbd3f94de4b5        3 years ago         1.3GB
hyperledger/fabric-zookeeper   latest              e545dbf1c6af        3 years ago         1.31GB
hyperledger/fabric-zookeeper   x86_64-1.0.0        e545dbf1c6af        3 years ago         1.31GB

 可以清楚的看到刚才我们制作的镜像就在第一位,有了镜像之后,就剩下最后一个步骤,那就是启动容器

docker run -d -p 8888:5151 hope-server
633262fc5ee12480f2b3a333a523215cd2b6f4d8af29a884fd114d2c09213d62
  • -d参数是让容器后台运行
  • -p 是做端口映射,此时将服务器中的8888端口映射到容器中的5151(项目中端口配置的是5151)端口

 启动完成之后我们可以通过命令来查看咋们启动的服务的状态及日志

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
633262fc5ee1        hope-server         "java -Djava.securit…"   About a minute ago   Up About a minute   0.0.0.0:8888->5151/tcp   crazy_wescoff
#用上面的CONTAINER ID 可以查询这个容器的日志
docker logs --tail 10 633262fc5ee1
2020-07-22 10:17:11.027  INFO 1 --- [      Thread-13] c.n.e.r.PeerAwareInstanceRegistryImpl    : Got 1 instances from neighboring DS node
2020-07-22 10:17:11.028  INFO 1 --- [      Thread-13] c.n.e.r.PeerAwareInstanceRegistryImpl    : Renew threshold is: 1
2020-07-22 10:17:11.028  INFO 1 --- [      Thread-13] c.n.e.r.PeerAwareInstanceRegistryImpl    : Changing status to UP
2020-07-22 10:17:11.043  INFO 1 --- [      Thread-13] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2020-07-22 10:17:11.077  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 5151 (http) with context path ''
2020-07-22 10:17:11.078  INFO 1 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 5151
2020-07-22 10:17:11.081  INFO 1 --- [           main] c.b.hope.eureka.EurekaApplication        : Started EurekaApplication in 10.627 seconds (JVM running for 11.371)
2020-07-22 10:18:11.031  INFO 1 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2020-07-22 10:19:11.030  INFO 1 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms
2020-07-22 10:20:11.030  INFO 1 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms

4.完成

 服务以及启动好了,我们只需要在浏览器输入服务器的地址就可以正常访问咱们的springboot项目啦

 通过ps命令查看当前docker运行的容器服务

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
633262fc5ee1        hope-server         "java -Djava.securit…"   3 seconds ago       Up 1 second         0.0.0.0:8888->5151/tcp   vigorous_goldberg

 如果需要停掉服务直接用stop 加上容器id即可

docker stop 633262fc5ee1
633262fc5ee1