zoukankan      html  css  js  c++  java
  • 使用docker部署springboot应用

    《使用docker安装mysql5.7》一文中,我们用docker在本地跑起来了一个mysql容器,并做了测试。现在我们把连接mysql容器的这个springboot应用也用容器跑起来。

    springboot工程的容器化

    在项目根目录新建Dockerfile:

    # Docker image for springboot application
    # VERSION 0.0.1
    # Author: lyhero11
    
    ### 基础镜像,使用alpine操作系统,openjkd使用8u201
    FROM openjdk:8u201-jdk-alpine3.9
    
    #作者
    MAINTAINER lyhero11 <myemail@gmail.com>
    
    #系统编码
    ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
    
    #声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
    VOLUME /tmp
    
    #应用构建成功后的jar文件被复制到镜像内,名字改成springboot2.jar
    ADD build/libs/springboot2-0.0.1-SNAPSHOT.jar springboot2.jar
    
    #启动容器时的进程
    ENTRYPOINT ["java", "-jar", "/springboot2.jar"]
    
    #暴露8080端口
    EXPOSE 8080
    

    然后修改一下application.properties配置文件:

    # 应用名称
    spring.application.name=springboot2
    server.servlet.context-path=/springboot2
    # 应用服务 WEB 访问端口
    server.port=8080
    # 数据库驱动:
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    # 数据源名称
    spring.datasource.name=defaultDataSource
    # 数据库连接地址
    spring.datasource.url=${MYSQL_URL}?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    # 数据库用户名&密码:
    spring.datasource.username=${MYSQL_USER}
    spring.datasource.password=${MYSQL_PASSWORD}
    
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    

    主要是mysql的url连接串以及用户名密码这些通过环境变量来设置。而这个springboot应用是将要跑在容器里的,所以显然这几个环境变量是通过设置容器的环境变量来设置的。

    构建镜像并启动容器

    gradle bootJar生成jar包之后,我们构建镜像,在Dockerfile所在目录执行:

    docker build -t lyhero11/springbootapp2 .
    

    -t表示--tag,后面lyhero11/springbootapp2是镜像名或者叫标签。

    然后,我们启动容器:

    docker run --rm -d `
    --name springbootapp2 `
    --network mysqlnet `
    -e MYSQL_URL=jdbc:mysql://mysqlserver/mydb `
    -e MYSQL_USER=root `
    -e MYSQL_PASSWORD=pswd `
    -p 8080:8080 lyhero11/springbootapp2
    

    这里说明一下jdbc:mysql://mysqlserver/mydb,因为我们使用了bridge网络mysqlnet,可以起到一个DNS的作用(可以使用docker network ls查看本机的docker网络),所以只需要使用容器名mysqlserver就可以了,不用ip端口了。-e表示设置容器的环境变量,给上面的application.properties用,另外如果容器启动失败,可以把-d去掉,去看看springboot的输出日志。

    Postman测试一下GET http://localhost:8080/springboot2/rest/getTokenByMobile?mobile=13700000000 ,从数据库查询并正确返回结果。

    附本地的几个image的大小:

    docker images
    REPOSITORY                TAG                   IMAGE ID       CREATED          SIZE
    lyhero11/springbootapp2   latest                32c6d6d34615   41 minutes ago   143MB
    <none>                    <none>                cc42c391bbe9   47 minutes ago   143MB
    <none>                    <none>                2a090734a030   2 hours ago      143MB
    mysql                     5.7.36                938b57d64674   13 days ago      448MB
    redis                     6.0.16                705235b45ae0   2 weeks ago      112MB
    openjdk                   8u201-jdk-alpine3.9   3675b9f543c5   2 years ago      105MB
    

    除了mysql的镜像稍微大了一点,其他都是100M多,然后docker的特性image是基于其他若干image一层一层摞起来的,这里可以看出来openjdk8的image是105M,基于它构建的springbootapp2是143M,所以两者的差值基本上就是jar包的大小,这与事实相符。可见docker的存储效率还算是比较高的。
    另外吐槽一下,在windows上弄docker真的是有些穿着衣服洗澡的味道,docker本来是开发用来在linux系统上运行的,是在操作系统层面的资源隔离,相对于虚拟机vm技术来说更为轻量化,但是在windows上笔者理解是在win os系统和docker之间又加了一层WSL2(Windows Subsystem for Linux 2),所以性能损耗还是比较大的。

  • 相关阅读:
    'Undefined symbols for architecture i386,clang: error: linker command failed with exit code 1
    The codesign tool requires there only be one 解决办法
    XCode iOS project only shows “My Mac 64bit” but not simulator or device
    Provisioning profile XXXX can't be found 的解决办法
    UIView 中的控件事件穿透 Passthrough 的实现
    Xcode4.5出现时的OC新语法
    xcode 快捷键(持续更新)
    打越狱包
    php缓存与加速分析与汇总
    浏览器的判断
  • 原文地址:https://www.cnblogs.com/lyhero11/p/15493712.html
Copyright © 2011-2022 走看看