容器化部署SpringBoot微服务

65 阅读5分钟

伸手摘星,即使一无所获,亦不致满手污泥

请关注公众号:星河之码

一、工程准备

我这里使用一个比较简单的应用,使用Springboot构建一个web工程,集成mybatis读取数据,通过接口返回。

  • 数据库脚本edwinedu.sql
CREATE DATABASE IF NOT EXISTS edwinedu DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;

-- ----------------------------
-- Table structure for tbuser
-- ----------------------------
USE edwinedu;
DROP TABLE IF EXISTS tbuser;
CREATE TABLE tbuser  (
  id int(10) NOT NULL AUTO_INCREMENT,
  username varchar(20) COLLATE utf8_bin DEFAULT NULL,
  sex varchar(20) COLLATE utf8_bin DEFAULT NULL,
  age int(10) DEFAULT NULL,
  PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tbuser
-- ----------------------------
USE edwinedu;
INSERT INTO tbuser(username,sex,age) VALUES ('edwin', '男', 20);
INSERT INTO tbuser(username,sex,age) VALUES ('星河之码', '男', 2);
INSERT INTO tbuser(username,sex,age) VALUES ('李四', '女', 18);
  • 工程代码

由于代码比较简单,文件较多,就不贴出来了

如果需要,可以关注公众号【星河之码】回复dockerdome获取

二、制作mysql镜像

修改mysql官网镜像时区为东八区,然后初始化以上脚本

  • 制作mysql-dockerfile 文件
FROM mysql:5.7.31
MAINTAINER  "edwin:修改时区并初始化脚本"
ENV TZ Asia/Shanghai
COPY hmy.cnf /etc/mysql/conf.d/hmy.cnf
# 将edwinedu.sql放在 docker-entrypoint-initdb.d下,docker-entrypoint-initdb.d是mysql中初始化的目录,mysql服务启动之后会自动执行这个目录下的脚本
COPY edwinedu.sql /docker-entrypoint-initdb.d
  • 编写hmy.cnf文件

    这不是必须的,但是没有这个文件,初始化的脚本会中文乱码

    [mysqld]
    skip-name-resolve
    character_set_server=utf8
    datadir=/var/lib/mysql
    server-id=1000
    [mysql]
    default-character-set = utf8
    [mysql.server]
    default-character-set = utf8
    [mysqld_safe]
    default-character-set = utf8
    [client]
    default-character-set = utf8
    
    
  • 上传

#创建一个文件夹,将上述mysql-dockerfile 和edwinedu.sql hmy.cnf都上传到该目录下
mkdir -p /data/mysqlinit

  • 构建mysql镜像
#进入/data/mysqlinit 下执行
cd /data/mysqlinit

docker build --rm -t 192.168.242.130:5000/edwinedu/mysql:v1 -f mysql-dockerfile .

  • 运行mysql镜像
#创建挂载目录 空目录 注意在执行启动时/data/mysql 一定是空目录,这是mysql数据的目录
mkdir -p /data/mysql
#启动mysql
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql 192.168.242.130:5000/edwinedu/mysql:v1 --character-set-server=utf8 --collation-server=utf8_general_ci

  • 上传镜像到私服
# 可以不上传,上传可以备份  
#上传之前要登录私服
docker login -u admin -p Harbor12345 192.168.242.130:5000
#推送到Harbor 私服中
docker push 192.168.242.130:5000/edwinedu/mysql:v1

三、打包项目

先将项目打成一个jar包,然后上传到虚拟机中,

  • 打包工程
mvn clean package
#可以本地试试有没有问题
java -jar docker-demo-0.0.1-SNAPSHOT.jar
  • 下载JDK

    对于网速比较差的时候,我们可以先现在jdk 的镜像,然后打成一个压缩包存起来,以后直接使用。

    这一步可以不执行,我这里网速还可以,直接在下面制作项目镜像的时候一起下载了

    # 拉取jdk 镜像
    docker pull openjdk:8-alpine3.9
    #将jdk 镜像 打成一个压缩包jdk8.tar 以后用的时候直接输出就行
    docker save openjdk:8-alpine3.9 -o jdk8.tar
    #将压缩包jdk8.tar 输出  也就是解压
    docker load -i jdk8.tar
    

四、制作项目镜像

项目部署也以镜像的方式在docker中运行,先编写一个DockerFile文件,通过这个DockerFile文件,安装jdk,并且在docker中执行jar

  • 制作dockerdemo-dockerfile文件
# 安装JDK
FROM openjdk:8-alpine3.9
MAINTAINER  "edwin:安装JDK,并运行jar"
# 修改源 
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \
    echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata --allow-untrusted

#修改镜像为东八区时间
ENV TZ Asia/Shanghai
# 定义一个参数 这个参数在docker run的时候传进来,这里就是会用jar的名字
ARG JAR_FILE
# 修改一个固定的名字app.jar
COPY ${JAR_FILE} app.jar
#暴露端口,这个端口要跟我们application.yml 中的端口一致
EXPOSE 8080
#执行jar 启动jvm
ENTRYPOINT ["java","-jar","/app.jar"]
  • 上传
#将docker-demo-0.0.1-SNAPSHOT.jar 和 dockerdemo-dockerfile文件上传到指定目录下
mkdir -p /data/dockerdemo
  • 构建dockerdemo镜像
#创建一个文件夹,将上述dockerdemo-dockerfile 和docker-demo-0.0.1-SNAPSHOT.jar都上传到该目录下
cd /data/dockerdemo
#JAR_FILE 就是指定dockerdemo-dockerfile中需要的那个JAR_FILE
docker build --rm -t 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1 --build-arg JAR_FILE=docker-demo-0.0.1-SNAPSHOT.jar -f dockerdemo-dockerfile .

  • 运行dockerdemo镜像
docker run -itd --name dockerdemo -p 8080:8080 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1

  • 浏览器访问
http://192.168.242.128:8080/queryUserList

  • 上传镜像到私服
# 可以不上传,上传可以备份  
#我在构建镜像的时候是指定了私服地址  192.168.242.130:5000/edwinedu  
#如果没有指定用tag命令打一个标签在上传  :
#docker tag dockerdemo:0.0.1 192.168.242.130:5000/edwinedu/dockerdemo:0.0.2
#推送到Harbor 私服中
docker push 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1

五、idea集成docker

5.1 docke远程服务访问配置

idea集成docker,需要修改服务器的docker.service服务信息,允许其他主机远程访问服务器的docker

  • 修改docker.service

    #编辑docker.service
    vi /usr/lib/systemd/system/docker.service
    #在ExecStart行最后增加,开放远程主机访问权限。
    -H tcp://0.0.0.0:2375
    #修改之后的内容如下:
    # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
    

  • 重启docker

    systemctl daemon-reload
    systemctl restart docker
    
  • 查看docker进程

    ps -ef|grep docker
    

  • 查看系统的网络端口

    #检查docker进程是否在监听tcp的2375端口
    netstat -tulp
    

    • 如果执行报没有netstat,则安装netstat

      yum install net-tools -y
      

5.2 Idea 连接远程Docker主机

Idea 连接远程Docker主机需要安装docker插件,高版本的Idea已经默认安装了。

如果没有安装,可以去官网下载安装

#官网地址
https://plugins.jetbrains.com/plugin/7724-docker/versions

安装好之后就可以连接Docker主机了,连接方法如下

  • 连接Docker主机

    settings->build execution...->docker->点击"+"按钮,新增docker服务器docker配置信息
    

  • Idea使用docker

    配置成功后,会在idea开发工具下方窗口【docker】里显示信息,右键点击connect。连接成功可以查 看到container和images等信息。可以对container和images进行相关操作。

5.3 Idea 运行Docker镜像

idea连接主机之后就可以运行Docker中的一些镜像了,以上面的docker-dome工程为例,在idea中运行这个镜像,idea执行镜像,其实就是将命令执行的命令图形化

  • 命令执行

    docker run -itd --name dockerdemo -p 8080:8080 192.168.242.130:5000/edwinedu/dockerdemo:0.0.1
    
  • idea执行

    • idea执行就是将上述命令图形化,选中该镜像右键选中create container

    • 配置启动命令,将上面的命令通过图形界面配置,然后执行

  • 浏览器访问