前言

说一下为啥使用docker-compose来部署项目,docker-compose可以同时制作(build)和启动多个镜像服务;当我们需要把一个项目整体迁移到另外一台服务器时,不需要进行单个处理,通过docker-compose.yml配置文件,统一打包成镜像,并将镜像文件启动;
PS docker-compose如何安装大家自行去网上查找教程吧;在这里我就不介绍了

准备工作

因为我们要部署的是一个java项目,就需要一个java后台服务,一个mysql数据库,另外我又加了一个缓存redis;
java项目:使用的spirng-boot
mysql: 使用的版本是5.7.18
redis: 使用的最新版本
这里最主要的问题是我们需要将我们java项目中所需要的初始化sql文件和数据导入到表中;不用再启动完mysql之后再进行导入操作

mysql Dockerfile配置

因为我们希望在启动项目的时候能够初始化我们的初始化数据和表结构所以需要这步来完成

  1. 构建mysql镜像

所需要的文件目录

Dockerfile文件配置


FROM mysql:5.7.18
#mysql的工作位置
ENV WORK_PATH /usr/local/

#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#初始化数据库的SQL
ENV FILE_0 sakila-schema.sql
ENV FILE_1 sakila-data.sql

#执行SQL
ENV INSTALL_DATA_SHELL docker-entrypoint.sh

COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/

#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL

#设置容器启动时执行的命令
#CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]

其中 sakila-schema.sql 表示初始化数据库,和表结构的sql文件 ; sakila-data.sql为初始化数据的sql文件

ENV FILE_0 sakila-schema.sql
ENV FILE_1 sakila-data.sql
  1. 新建初始化数据sql文件
    sakila-schema.sql文件内容
CREATE DATABASE `compose_demo` CHARACTER SET 'utf8mb4';

use compose_demo;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` varchar(36) NOT NULL,
  `age` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

sakila-data.sql文件内容


INSERT INTO `compose_demo`.`user` (`id`, `age`, `name`, `phone`) VALUES ('4028b8816b018279016b01828add0000', '18', '张三', '13838385438');

  1. 创建docker-entrypoint.sh脚本文件
#!/bin/bash
#-u为数据库用户名 -p为密码如果数据库密码不是root记得修改这里
mysql -uroot -proot <<EOF
source /usr/local/sakila-schema.sql;
source /usr/local/sakila-data.sql;

至此mysql配置相关已经完成

java项目部分

  1. Dockerfile构建
    因为我创建的java项目名称为compose-demo如果创建的项目名称不同记得修改 ADD中的参数
FROM openjdk:8-jdk-alpine
VOLUME /tmp
#根据自己定义的项目名称进行修改
ADD compose-demo-0.0.1-SNAPSHOT.jar compose-demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/compose-demo-0.0.1-SNAPSHOT.jar"]	
  1. 打包maven命令打包项目

  2. 将打包好的项目和Dockerfile放至到一个目录下方便构建镜像

创建docker-compose.yml文件

docker-compose.yml中我们将我们之前整理的文件在这里进行构建镜像,同时启动项目

version: "2"

services:
   mysql:
   #找到当前目录下mysql构建镜像
    build: ./mysql
    #镜像名称
    image: compose-mysql:test
    #项目名称
    container_name: compose-mysql
    #端口映射
    ports:
     - "3301:3306"
     #将mysql目录映射到本地 应根据自己所需要映射的目录进行修改
    volumes:
     - "/root/temp/compose-demo/conf:/etc/mysql/conf.d"
     - "/root/temp/compose-demo/logs:/logs"
     - "/root/temp/compose-demo/data:/var/lib/mysql"
    #设置编码格式
    command: [
           '--character-set-server=utf8mb4',
           '--collation-server=utf8mb4_unicode_ci'
    ]
    #设置初始化密码
    environment:
     MYSQL_ROOT_PASSWORD: "root"
   #redis直接拉去redis镜像启动redis
   redis:
     image: redis:latest
     container_name: compose-redis
     ports:
      - "6380:6379"
     volumes:
      - "/root/temp/compose-demo/redis_data:/data"
    
   compose-java:
   #找到当前目录下的java文件夹构建酱香
    build: ./java
    #镜像名称
    image: compose-java:test
    container_name: compose-java
    ports:
     - "8888:8888"

PS:我再进行测试时发现配置的mysql数据库编码不生效 所以导致初始化的数据出现了乱码现象可以用一下方式解决
创建my.cnf文件


#For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
[client]
default-character-set=utf8mb4
#explicit_defaults_for_timestamp=true
#default-time-zone='Asia/Shanghai' 
[mysqld]
#
#Remove leading # and set to the amount of RAM for the most important data
#cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
#innodb_buffer_pool_size = 128M
#
#Remove leading # to turn on a very important data integrity option: logging
#changes to the binary log between backups.
#log_bin
#
#Remove leading # to set options mainly useful for reporting servers.
#The server defaults are faster for transactions and fast SELECTs.
#Adjust sizes as needed, experiment to find the optimal values.
#join_buffer_size = 128M
#sort_buffer_size = 2M
#read_rnd_buffer_size = 2M
#character-set-client-handshake=FALSE
character-set-server = utf8mb4 
#character_set_server=utf8mb4
collation-server = utf8mb4_unicode_ci 
#collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

lower_case_table_names=1 
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-bin=/var/lib/mysql/mysql-bin
server-id=123456
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#[mysql]
#default_character_set=utf8mb4

将文件放至到我们映射出来的conf目录下就可以了
比如我在启动mysql时将配置文件映射到/root/temp/compose-deme/conf
这个文件夹下了;所以我手动在compose-deme/conf文件夹下创建my.cnf
在这里插入图片描述
创建完毕 目录结构应该是这样的;
然后将文件夹拷贝到linux下执行 cd到当前目录下执行以下命令

#如果需要后台运行的话 在后面加上-d就可以了
sudo docker-compose up

在这里插入图片描述

如果一切顺利启动完成是连接数据库查看初始化数据是否存在

在这里插入图片描述
初始化表结构已创建
在这里插入图片描述
初始化数据已存在

接下来访问项目
http://ip:8888/getUserInfo?name=张三
在这里插入图片描述
测试redis是否正常连接
http://ip:8888/setRedis?key=name&val=lisi
在这里插入图片描述
http://ip:8888/getRedisName?key=name
在这里插入图片描述
至此全部搞定!!!
如果有不懂的可以评论或者私信问我;另外附上git地址方便大家测试
链接: githup地址(如果觉得可以别忘记点个小星星哦).

Logo

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

更多推荐