Ubuntu 使用 docker-compose 简单部署 jar 应用

chan 作者
阅读 13218 喜欢 5

ubuntu 版本: 18.04

安装 docker

Docker 的安装以及基本指令

安装 docker-compose

Docker-compose 安装

配置 docker-compose.yml

1、新建一个空文件夹例如:

/root/docker

2、创建一个 docker-compose.yml 文件:

touch docker-compose.yml

3、编辑:

vim docker-compose.yml

4、使用 docker-compose 提供的模板配置 web 应用和 mysql:

#版本号为3
version: "3"
services:
  # web 应用的服务名(自定义)
  webapp:
    #使用镜像(这里使用了openjdk镜像)
    image: openjdk
    ports:
      #设置端口映射
      - 8888:8080
    #设置为开机自动启动服务
    restart: always
    #设置容器的名称
    container_name: zqskate
    #数据卷映射,宿主机路径 /root/docker/zqskate/ 映射到容器 /data/
    volumes:
      - /root/docker/zqskate/:/data/
    #执行命令部署存放在容器 /data/ 目录下的 jar 应用
    entrypoint: java -jar /data/app.jar

  # mysql 的服务名(自定义)     
  mysql:
    #这里选择了 mysql8
    image: mysql
    #设置为开机自动启动服务
    restart: always
    #设置初始 root 密码
    environment:
      MYSQL_ROOT_PASSWORD: password
    # mysql 的初始化设置
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    #端口映射
    ports:
      - 3333:3306
    #数据卷映射
    volumes:
      - ./data:/var/lib/mysql

补充 Redis 服务的使用:
自行官网下载 redis.conf 文件放置到 volumes 映射路径中

  myRedis:
    image: redis
    container_name: my_redis
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - 6379:6379
    volumes:
      - ./redis/data:/data
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf

5、编辑应用的连接数据库地址,完成后通过 maven 打 jar 包,存放在 /root/docker/zqskate 下(该目录映射到容器的 /data/ 中)

6、启动服务:

docker-compose up -d

7、测试

关于 mysql 的一个错误

由于我的开发环境中的 mysql 版本为 5.5,而部署项目的 mysql 使用了8版本,导致了项目中部分查询语句报 “this is incompatible with sql_mode=only_full_group_by” 的错误

一、原理层面
这个错误发生在mysql 5.7 版本及以上版本会出现的问题: mysql 5.7版本默认的sql配置是:sql_mode=”ONLY_FULL_GROUP_BY”,这个配置严格执行了”SQL92标准”。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

二、sql层面 在sql执行时,出现该原因: 简单来说就是:输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就是 group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list 和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。

解决方法:

#查看运行中的容器
docker ps -a

#进入容器 4662e1efa784 为容器 id
docker exec -it 4662e1efa784 /bin/bash

#安装 vim
apt-get update
apt-get install vim

#修改 mysql 的 my.cnf 文件
vim /etc/mysql/my.cnf

#在 mysqld 下添加以下
sql_mode ='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'

#退出容器
exit

#重启 mysql 服务,成功部署
docker restart 4662e1efa784

关于容器时区问题

近期在docker中运行容器发现时间和本地时间相差8小时,找了找原因,发现是容器运行的时区不正确,验证了下宿主机上的时区是正确的,于是想到把本地时区连接到到容器里面

1、进入需要更改时区的容器

docker exec -it 容器ID bash

2、将宿主机的时区链接到容器里面

# 这里使用的是上海的时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 如果本地时区不正确,可以更改本地时区:
echo "Asia/Shanghai" > /etc/timezone

3、退出容器并重启容器

# 退出容器
exit

#重启容器
docker restart 容器ID

全部评论0