前言

  使用 Docker 部署应用的方式有多种,如每个应用单独部署再连接容器,如 docker-compose...

  本博客是单独部署的每一个容器。

本篇博客的操作有:

  ① 在本地创建一个 SpringBoot 项目;配置 Dockerfile

  ② 把 SpringBoot 项目传输到服务器;打包成 Docker 镜像

  ③ 拉取官方 MySQL 镜像;配置 MySQL 在宿主机上的配置文件,数据目录以及初始化 sql 文件

  ④ 创建网络

  ⑤ 运行 MySQL 容器

  ⑥ 运行 SpringBoot 容器

  ⑦ 浏览器访问

源码

  GitHub 地址:https://github.com/intomylife/Docker

  Docker Hub 地址:https://hub.docker.com/r/intomylife/docker-springboot-mysql

本地创建 SpringBoot 项目

  本博客主要是写 Docker 部署相关内容,如果想了解关于 SpringBoot 整合 MySQL 相关的内容

  可以查看我另一篇博客:SpringBoot整合MyBatis-Plus

  本博客构建的 SpringBoot 项目需要注意的地方如下

POM 文件

springboot-mybatis-plus-service

... 省略部分代码 ...
 
<!-- docker 前缀名,通常用在上传镜像 -->
<docker.image.prefix>intomylife</docker.image.prefix>
<!-- docker 镜像名称 -->
<docker.image.name>docker-springboot-mysql</docker.image.name>
 
... 省略部分代码 ...
  • <docker.image.prefix> Docker 镜像前缀 :一般会被镜像名称节点引用在前面。为仓库的用户名
  • <docker.image.name> Docker 镜像名称:为此仓库的名称

springboot-mybatis-plus-base-service-core

... 省略部分代码 ...
 
<!-- Docker 插件 -->
            <plugin>
                <!-- 三坐标 -->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.1.1</version>
                <!-- 配置信息 -->
                <configuration>
                    <!-- 镜像名称 -->
                    <imageName>${docker.image.prefix}/${docker.image.name}:${project.version}</imageName>
                    <!-- Dockerfile 文件的位置 -->
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <!-- 文件资源 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!-- 打包后的名称 -->
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
 
... 省略部分代码 ...
  • <imageName> 镜像名称:仓库用户名/镜像名称:镜像版本号
  • 如果想接下来把打包好的镜像传输到仓库中,那么这里 <imageName> 镜像名称要按照格式来

application.properties

# 数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.host=127.0.0.1
spring.datasource.url=jdbc:mysql://${spring.datasource.host}:3306/base_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

# 打印 sql 日志
logging.level.com.zwc.base.mapper=debug
  • 注意这里把连接地址单独配置,是用来连接 MySQL 容器的时候指定 MySQL 容器名称

Dockerfile 文件

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • 注意此文件的路径为 :src/main/docker/
  • 此文件是构建 Docker 的核心文件
  • FROM openjdk:8-jdk-alpine:基础镜像环境 JDK1.8
  • VOLUME /tmp:指定了挂载目录
  • ARG JAR_FILE:和 springboot-mybatis-plus-base-service-core 中配置的 buildArgs 对应,动态获取打包后的名称
  • ADD ${JAR_FILE} app.jar:把生成的 jar 包拷贝到 Docker 容器中并命名为 app.jar
  • 最后一行是修改 Tomcat 随机数生成方式,加快 Tomcat 启动

 


 

服务器上部署环境

CentOS7中安装Maven3.6.0

CentOS7中安装Maven3.6.0

CentOS7中安装Docker

CentOS7中安装Docker

传输

  1. 打开下载好的 MobaXterm,使用 SSH 连接方式

  2. 连接成功后默认到 root 目录

  3. MobaXterm 左边是目录,在左边目录的最底部,有个选择框(Follow terminal folder)把它勾选上。

      勾选上它后,目录就会跟着你的命令动态发生变化

  4. 输入命令 cd /usr/local/ -> 进入目录

  5. 输入命令 mkdir JavaWork -> 新建文件夹

  6. 输入命令 cd JavaWork -> 进入目录

  7. 把本地的 SpringBoot 项目文件夹拖拽到 MobaXterm 左边目录中

  8. 如果你下载我的源码,这里需要打成 .tar.gz 包,因为文件名过长传输会出问题

  9. 传输需要一点点时间,也可以在 MobaXterm 左边目录底部看到传输进度

SpringBoot 项目打包 Docker 镜像

  1. 输入命令 cd /usr/local/JavaWork/docker-springboot-mysql-> 进入目录

      注意: docker-springboot-mysql 是从本地传输到服务器上的 SpringBoot 项目

  2. 如果是直接使用我上传的项目源码,这时会有两个文件夹,先把两个工程单独打包

  3. 输入命令 cd springboot-mybatis-plus-commons/ -> 进入 commons 工程目录

  4. 输入命令 mvn clean -> 清除 target

  5. 输入命令 mvn install -Dmaven.test.skip=true -> 打 jar 包,跳过测试

  6. 输入命令 cd ../springboot-mybatis-plus-service/ -> 进入 service 工程目录 

  7. 输入命令 mvn clean -> 清除 target

  8. 输入命令 mvn install -Dmaven.test.skip=true -> 打 jar 包,跳过测试(要不然一直报连接错误)

  9. 如果都最后显示 'BUILD SUCCESS' 就证明打 jar 包成功了

 10. 输入命令 cd springboot-mybatis-plus-base-service/springboot-mybatis-plus-base-service-core/ 

        -> 进入到 base-core 工程中,因为只有此工程的 pom 文件配置了 Docker 插件

 11. 输入命令 mvn package -Dmaven.test.skip=true docker:build -> 使用 Maven 打包 Docker 镜像

 12. 第一次打包需要一点时间,最后看到 'BUILD SUCCESS' 等字样就证明打包成功了

拉取官方 MySQL 镜像

  1. 输入命令 systemctl  start docker.service -> 启动 Docker 服务

  2. 输入命令 docker pull mysql:5.7 -> 拉取 MySQL 镜像

配置 MySQL 在宿主机上的配置文件,数据目录以及初始化 sql 文件

使用 MySQL 容器需要注意字符集编码,数据备份以及第一次启动初始化 sql 问题

准备工作

  1. 首先在宿主机上为此次配置创建相应的目录

  2. 输入命令 cd /usr/local/ -> 进入目录

  3. 输入命令 mkdir docker -> 创建文件夹

  4. 输入命令 cd docker/ -> 进入目录

  5. 轮流输入命令 mkdir mysql 、cd mysql、mkdir conf、mkdir data、mkdir sql

      -> 创建 mysql 目录以及 conf 、data 和 sql 目录

配置文件

  1. 输入命令 cd /usr/local/docker/mysql/conf/ -> 进入目录

  2. 输入命令 touch my.cnf -> 新建文件

  3. 输入命令 vim my.cnf -> 编辑文件,粘贴下面内容

[client]

default-character-set=utf8mb4


[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set=utf8mb4

  4. 轮流输入命令 esc -> shift 冒号 -> wq -> 回车

数据目录

  1. 此时在启动 MySQL 容器前,此目录是空的

初始化 sql 文件

  1. 输入命令 cd /usr/local/docker/mysql/sql/ -> 进入目录

  2. 输入命令 touch init.sql -> 新建文件

  3. 输入命令 vim init.sql -> 编辑文件,粘贴下面内容

-- 创建数据库
DROP database IF EXISTS `base_db`;
CREATE DATABASE `base_db` default character set utf8mb4 collate utf8mb4_unicode_ci;

-- 切换数据库
USE base_db;

-- 创建表
DROP TABLE IF EXISTS `springboot_mybatis_plus` ;
CREATE TABLE `springboot_mybatis_plus` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `type` varchar(2) DEFAULT NULL COMMENT '生活用品类别:1. 家电类 2. 厨具',
        `name` varchar(50) DEFAULT NULL COMMENT '生活用品名称',
        `description` varchar(200) DEFAULT NULL COMMENT '生活用品描述',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='springboot整合mybatis-plus测试表';

INSERT INTO springboot_mybatis_plus ( type , name , description )
VALUES ('1','电饭煲','用来蒸饭'),('1','电热壶','用来烧水'),('1','空调','用来制冷或制热'),('2','菜刀','用来切菜'),('2','刨子','用来剥皮'),('2','打蛋器','用来搅拌鸡蛋');

运行 Docker 镜像

创建网络

  1. 输入命令 docker network create --driver bridge springboot_mysql_bridge -> 创建网络

  2. 输入命令 docker network ls -> 查看网络

运行 MySQL 容器

  1. 输入命令 docker images -> 查看构建的镜像

  2. 输入命令

docker run -p 3306:3306 --name mysql-3306 --network springboot_mysql_bridge -v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf -v /usr/local/docker/mysql/data/:/var/lib/mysql/ -v /usr/local/docker/mysql/sql/:/docker-entrypoint-initdb.d/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

  • -p:端口映射(宿主机端口:容器端口)
  • --name:启动后的容器名称
  • --network:连接到网络
  • -v:第一个 -v 为映射配置文件(宿主机目录:容器目录)
  • -v:第二个 -v 为映射数据目录,相当于把容器中的数据备份到宿主机指定的目录(宿主机目录:容器目录)
  • -v:第三个 -v 为初始化 sql 目录(宿主机目录:容器目录)
  • -e MYSQL_ROOT_PASSWORD=123456:设置 root 连接密码
  • 映射实际上是把宿主机和容器相连通
  • 容器中映射目录的文件发生改变时,宿主机中映射目录的文件也发生变化
  • -d:后台启动
  • mysql:5.7:启动的镜像

运行 SpringBoot 容器

  1. 输入命令 docker images -> 查看构建的镜像

  2. 输入命令

docker run -p 8080:8080 --network springboot_mysql_bridge --env spring.datasource.host=mysql-3306 -d intomylife/docker-springboot-mysql:1.0

  • -p:端口映射(宿主机端口:容器端口)
  • --network:连接到网络
  • --env:配置 SpringBoot 镜像中 MySQL 连接地址,mysql-3306 为上面启动的 MySQL 容器 --name 名称
  • -d:后台启动
  • intomylife/docker-springboot-mysql:1.0:启动的镜像

  3. 使用 ip + :8080/smpc/query 访问,可以查询到 MySQL 容器中的数据(注意安全组和端口)

 


 

安全组

  注:如果服务器是在阿里云租用的需要设置安全组

  1. 登录到阿里云

  2. 进入到 '云服务器 ECS' 控制台

  3. 左侧栏中选择 '实例'

  4. 进入实例详情,点击左侧栏中 '本实例安全组'

  5. 点击安全组中的 '配置规则'

  6. 点击 '添加安全组规则' 按钮

  7. 配置 8080 和 3306 端口

防火墙

  注:如果服务器是在阿里云租用的需要开启防火墙。服务器是默认不开启防火墙的,感觉不安全

  1. 输入命令 systemctl status firewalld -> 查看防火墙状态

  2. 输入命令 systemctl start firewalld -> 开启防火墙

  3. 如果你不想开防火墙的话,那就输入命令 systemctl stop firewalld -> 关闭防火墙

  4. 输入命令 systemctl restart firewalld.service -> 重启防火墙

端口

  注:端口操作需要在开启防火墙的情况下才能执行成功。如下两条命令只需要执行一组即可

  1. 输入命令 firewall-cmd --permanent --zone=public --add-port=8080/tcp -> 永久开放 8080 端口

      输入命令 firewall-cmd --permanent --zone=public --add-port=3306/tcp -> 永久开放 3306 端口

  2. 输入命令 firewall-cmd --zone=public --add-port=8080/tcp -> 临时开放 8080 端口

      输入命令 firewall-cmd --zone=public --add-port=3306/tcp -> 临时开放 3306 端口

 


 

把打包好的镜像传输到仓库中 

  注:这里选择 Docker Hub 官方仓库

  1. 如果没有账号的话先注册一个,填写用户名邮箱及密码等信息提交,到邮箱中确认即可

  2. 确保 Docker 服务已经启动:systemctl  start docker.service -> 启动 Docker 服务

  3. 输入命令 docker login -> 登录 Docker Hub

  4. 出现 'Login Succeeded' 等字样就证明登录成功了

  5. 输入命令 docker push intomylife/docker-springboot-mysql:1.0 -> 把镜像传输到仓库中

      intomylife 为 Docker Hub 仓库用户名

      docker-springboot-mysql 为 镜像名称

      1.0 为镜像版本

  6. 在自己的仓库中就可以看到此镜像了,注意此时镜像为公开的

  7. 因为我此次打包的 SpringBoot 项目是样例,里面没有很隐私的信息,所以公开的也没关系

      如果你不想被别人下载你的镜像,你也可以设置为私有的(貌似有费用),当然也可以搭建私库

把仓库中的公有镜像拉取到服务器中

  1. 输入命令 docker pull intomylife/docker-springboot-mysql:1.0 -> 把镜像拉取到服务器中

      intomylife 为 Docker Hub 仓库用户名

      docker-springboot-mysql 为 镜像名称

      1.0 为镜像版本

 


 

扩展

CentOS7中常用命令行

 

希望能够帮助到你

over

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐