利用docker搭建、发布springboot项目(mac环境)

利用docker搭建、发布springboot项目(mac环境)

本文主要讲解如何建立一个springboot项目,并通过docker搭建并发布的完整流程。
特别说明:

  • 本文章不会讲解基础,为实战讲解,一些基础的东西就请各位自行学习了。
  • 后续所有贴出来的下载地址,都是官网地址,也可自行百度搜索,不在赘述。

一、 环境搭建

  • 准备工作,需要安装java、maven、idea、docker、mysql、redis

1.1 安装java

  • 官网下载地址:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html
  • 下载两个版JDK
    • 一个是Mac版本的:jdk-16.0.1_osx-x64_bin.dmg 用于本机开发。
    • 一个是Linux版本的,用于后续docker及服务器上部署:jdk-16.0.1_linux-x64_bin.tar.gz
  • 安装JDK:双击dmg文件,一直下一步即可。
  • 安装好后,打开终端,输入java命令和javac命令,看下输出。使用 /usr/libexec/java_home -V 命令,查找所安装的java具体在哪。
    • image.png

1.2 安装maven

  • 官网下载地址:https://maven.apache.org/download.cgi
  • 下载 apache-maven-3.8.1-bin.tar.gz
  • 双击解压,然后移动到 /Library 下面。使用命令行 sudo mv apache-maven-3.8.1 /Library/
  • 配置maven,vi /Library/apache-maven-3.8.1/conf/settings.xml,主要修改两个配置:
    • 本地仓库地址:<localRepository>/Users/sullivan/repo</localRepository> (这里本地仓库地址,sullivan是我的电脑名,这里请替换Wie你自己的即可。)
    • 远端镜像仓库地址:这里我们使用的是阿里云的仓库地址。
<!-- 本地仓库地址 -->
<localRepository>/Users/sullivan/repo</localRepository>
<!-- 远端镜像仓库地址 -->
<mirrors>
  <mirror>
    <id>ali maven</id>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public/</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

1.3 安装idea

  • 官网下载地址:https://www.jetbrains.com/idea/download/#section=mac
  • 下载Ultimate版本,正常情况是可以试用30天的(请到某宝购买账号)
  • 直接双击安装,一直下一步即可
  • 配置idea:jdk和maven环境
    • jdk配置:File=>Project Structure=>Platform Settings=>SDKs,一般会直接出来,没有的话,使用命令行/usr/libexec/java_home -V获得的JDK地址
    • image.png
    • maven配置:IntelliJ IDEA=>Preferences=>Build,Execution,Deployment=>Build Tools=>Maven
      然后在Maven home path,选择我们下载的文件的地址,比如我的是:/Library/apache-maven-3.8.1
    • image.png

1.4 安装docker

这里单独说下,如何切换docker的数据源,用原本docker的源,有可能下载很慢。我这里使用的是阿里云的源,登录阿里云后,可以在https://cr.console.aliyun.com/ap-southeast-1/instances/mirrors 找到阿里云的镜像加速器,每个账号都有一个自己的。然后在docker desktop的settings下的Docker Engine里面添加上源地址即可,然后保存重启docker即可。

  "registry-mirrors": [
    "https://mayswc8m.mirror.aliyuncs.com"
  ],

1.5 安装mysql,基于docker安装

  • 下载mysql的镜像,使用命令:docker pull mysql:5.7.31 ,等待下载
  • 查看库里面的镜像,使用命令: docker images
    • image.png
  • 启动容器,使用命令: docker run -d --name my1 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31
  • -d 是表明后台运行,否则退出终端后服务就停了
  • --name 设置docker容器的别名,后续启停、删除等都可以用别名代替,不用输入随机字符串ID。
  • -p 设置端口映射,比如 -p 13306:3306 将容器内的mysql端口3306与本机的13306端口绑定,就可以使用localhost的13306端口访问mysql了。
  • -e MYSQL_ROOT_PASSWORD=123456 设置mysql的访问密码,-e 是设置环境变量
  • 在最后面加上启动的镜像,一定要加上版本号哟,否则会去下载最新的版本,又要重新下载镜像了。
  • 安装后,我们进行测试,先通过命令行测试

    • docker ps -a 通过这个命令,查看是否启动成功,显示的my1的STATUS是 Up 多少时间,就应该启动成功了。
    • docker exec -it my1 bash 通过这个命令,我们进入到容器内部,里面其实就是一个简单的Linux系统
    • mysql -uroot -p123456 通过这个命令,我们就应该可以进入到mysql操作界面了。-u后面是数据库用户名,-p后面是该用户名的密码。你们按我上面说的命令启动,这个密码就应该可以进去。
  • 能够到这里,就说明mysql启动起来了,可以试试 show databases; 可以看看目前的数据库。

    • image.png
  • 我们可以下载mysql的桌面客户端,我用的是navicat for mysql,新建一个连接,然后连上去看看。

1.6 安装redis,基于docker安装

  • 下载redis的镜像,使用命令:docker pull redis

  • 查看库里面的镜像,使用命令: docker images

    • image.png
  • 启动容器,命令为: docker run -d --name rd1 -p 16379:6379 redis --requirepass 123456 ,参数说明,请看docker安装mysql里面的说明。再强调下,这里没有带版本号,就是用的最新版本。

  • 单独说明下,最后的参数 --requirepass 是设置Redis密码的
  • 进行测试,使用命令行进行验证
    • docker exec -it rd1 redis-cli 这里的rd1是我启动时设置的别名,然后就可以看到 127.0.0.1:6379> 就说明进去了,可以直接试一下: set a 123 以及 get a,如果打印出来值,则说明搞定。
    • 但是由于redis有密码,而我们没有用密码登录,需要会报错:(error) NOAUTH Authentication required.
    • 使用命令 auth 123456 即可,现在可以正常使用了。
    • image.png

二、编写测试demo

2.1 新建一个项目

  • 新建一个项目,选择Spring Initializr,根据下图填写内容
    • image.png
  • 选择项目需要引入的第三方插件,然后点击完成
    • image.png
  • 编译项目,Maven需要download很多包。耐心等待右下角的进度条完全走完
    • image.png
  • 点击package,会发现报错,因为缺少一个插件。
    • image.png
  • 这里需要引入一个插件,请打开pom.xml文件,在build下添加一个配置
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <skipTests>true</skipTests>
    </configuration>
</plugin>
    • image.png
  • 重新 package 之后,出现 [INFO] BUILD SUCCESS 就证明没啥问题了。<br />

    注意:这个过程maven会去下载很多第三方插件,用于支持springboot、mysql、redis等等,所以需要内心等等。

2.2 编写一个接口

  • 新建一个java类,命名TestController.java

    • image.png
    • image.png
  • 编写第一个接口

    • image.png
  • 添加配置文件,我们使用的是yml格式,所以重命名一下 application.propertiesapplication.yml

    • image.png
  • 添加以下配置:

server:
  port: 8888 # 服务端口

spring:
  datasource:
    name: test  # 数据库名
    url: jdbc:mysql://127.0.0.1:13306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false # url
    username: root  # 数据库用户名
    password: 123456  # 数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver  # 数据库链接驱动
  redis:
    host: 127.0.0.1 # redis端口
    port: 16379 # redis端口
    password: 123456 # redis密码
    database: 0
    • image.png
  • 启动springboot服务

    • image.png
  • 打开浏览器访问:http://127.0.0.1:8888/test/getString

    • image.png
  • 完成第一个接口的开发、启动、测试访问

2.3 编写数据库访问接口

  • 创建数据库,脚本如下:
CREATE DATABASE `test`;
USE `test`;

CREATE TABLE `user` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into user(id, username, password) values(0, '张三', '111111');
insert into user(id, username, password) values(0, '李四', '222222');
select * from user;
    • image.png
  • 修改pom.xml文件,修改mysql版本号、添加mybatis依赖

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
  • 添加4个包,controller,service,mapper,entity

    • image.png
  • 添加实体对象,entity:User.java

    • image.png
  • 创建mapper接口,mapper:UserMapper.java

    • image.png
  • 创建service实现,service:UserService.java

    • image.png
  • 创建controller类, controller:UserController.java

    • image.png
  • 创建mybatis的sql映射文件,在resources下创建文件夹(Directory):mapping

    • image.png
  • 创建映射文件,mapping:UserMapping.xml

    • image.png
  • 修改主入口文件,TestDemoApplication.java

    • image.png
  • 在yml文件中添加mybatis配置

    • image.png
  • 启动服务,先clean,在run

    • image.png
  • 测试访问,http://127.0.0.1:8888/user/getUserById?id=1

    • image.png
  • 完成

三、发布应用

3.1 本机docker环境打包运行

  • 下载镜像:ubuntu:18.04 使用命令:docker pull ubuntu:18.04

    • image.png
  • 配置Dockerfile文件。创建文件夹:DockerImage,在里面创建文件:Dockerfile

FROM ubuntu:18.04

WORKDIR /root

ENV LANG=C.UTF-8
ENV JAVA_HOME=/java
ENV PATH=$PATH:$JAVA_HOME/bin

RUN apt update && apt install -y --no-install-recommends fontconfig curl telnet iputils-ping vim \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /var/log/*

VOLUME /java
  • 打包我们自己的镜像,使用命令 docker build -t testdi .

    • image.png
  • 获取mysql和redis的docker容器的ip,使用命令:docker inspect my1 | grep IPAddressdocker inspect rd1 | grep IPAddress 查询到IP

    • image.png
  • 修改yml配置文件,修改mysql连接的ip和端口,redis连接的ip和端口

server:
  port: 8888 # 服务端口

spring:
  datasource:
    name: test  # 数据库名
    url: jdbc:mysql://172.17.0.2:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false # url
    username: root  # 数据库用户名
    password: 123456  # 数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver  # 数据库链接驱动
  redis:
    host: 172.17.0.3 # redis端口
    port: 6379 # redis端口
    password: 123456 # redis密码
    database: 0

mybatis:
  mapper-locations: classpath:mapping/*Mapping.xml  #mapping文件所在位置
  type-aliases-package: com/ske/test/testdemo
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #开启mybatis日志
  • 修改maven配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ske.test</groupId>
    <artifactId>testdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>testdemo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>16</java.version>

        <!--是否跳过spring-boot-maven-plugin, 依赖项目需要设置为true-->
        <skip.boot>false</skip.boot>
        <!--是否跳过打包为docker镜像, 默认为true, 即不打包为镜像-->
        <skip.docker>false</skip.docker>
        <!--是否推送镜像到镜像仓库, 默认为false, 即不推送-->
        <image.push>false</image.push>
        <!--基础镜像-->
        <image.base>testdi</image.base>
        <!--远程docker地址-->
        <docker.host/>
        <!--docker认证ca-->
        <docker.ca/>
        <image.name>${project.artifactId}:latest</image.name>

    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <skip>${skip.boot}</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>timestamp-property</goal>
                        </goals>
                        <configuration>
                            <name>build.time</name>
                            <pattern>yyyyMMdd.HHmmss</pattern>
                            <timeZone>GMT+8</timeZone>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <skipDocker>${skip.docker}</skipDocker>
                    <imageName>${image.name}</imageName>
                    <imageTags>
                        <imageTag>latest</imageTag>
                        <imageTag>v${build.time}</imageTag>
                    </imageTags>
                    <pushImage>${image.push}</pushImage>

                    <baseImage>${image.base}</baseImage>
                    <user>root</user>
                    <workdir>/export/servers</workdir>
                    <runs>
                        <run>mkdir -p /export/tmp</run>
                    </runs>
                    <cmd>["sh", "-c", "java -server -Djava.io.tmpdir=/export/tmp $OPTIONS -Djava.security.egd=file:/dev/./urandom -jar ${project.build.finalName}.jar"]</cmd>
                    <dockerHost>${docker.host}</dockerHost>
                    <dockerCertPath>${docker.ca}</dockerCertPath>
                    <resources>
                        <resource>
                            <targetPath>/export/servers</targetPath>
                            <!--jar 包所在的路径  此处配置的 即对应 target 目录-->
                            <directory>${project.build.directory}</directory>
                            <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
  • 主要修改点:

    • 修改了artifactId,必须改为全小写,否则打包会报错
    • 修改了properties,添加一些参数
    • 修改了build,修改了打包方式
  • 启动,使用命令:docker run -d -v /Users/sullivan/jdk-16.0.1:/java -p8888:8888 --name td --rm testdemo:latest

特别说明,这里需要使用Linux版本的JDK,之前下载的时候,已经提示过下载Linux版本的JDK了,解压后,在命令中使用这个版本的JDK路径

  • 可以通过浏览器访问了,输入地址:http://127.0.0.1:8888/user/getUserById?id=1
  • 查看日志,使用命令:docker logs -f td
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容