一般一个项目有前端、后端、有redis缓存,有数据库,还有数据库的初始化数据,项目上线前生产环境上什么都还没有,包括项目运行的环境。本文介绍采用Docker Compose编排方式实现项目jeecg-boot后端服务及数据库和Redis的自动部署(前提是服务器上已经安装好docker环境并且安装了Docker Compose容器部署工具),不包括前端,前端另外采用nginx单独去部署,因为考虑到挂载还要修改nginx.conf 的配置文件,所以这里我们只实现后端、数据库、数据库初始化、redis的部署,容器互相之间只能通过容器创建的时候的虚拟IP进行通讯,但是虚拟IP每一次容器的创建不一样,业界一般是设置其可以通过容器的服务名称进行通讯,这样子不管以后这个容器被创建了多少次,只要保证容器的服务名称不变,那容器与容器之间的通讯就不会有问题,下面就开始这一过程;
1、准备jeecg-boot的后端服务应用程序及数据库脚本,jeecg-app是应用后端服务,里面是一个jeecg-boot.jar 包,jeecg-db里面是数据库的初始化脚本jeecg-boot.sql,jeecg-redis 是redis缓存,目前里面是什么都没有,如果以后要单独做redis.conf 挂载的话,里面一般存的是redis的配置文件
2、将准备好的应用jeecg-boot上传到宿主机/usr/images目录下面
3、因为我的应用是mysql数据库,所以要构建mysql容器并初始化数据库,注意保持与本地的数据库版本一致,我这里采用最新的mysql,还有,mysql数据库默认数据库表名是大小写敏感的,这个在下面做容器编排的时候要注意設置数据库忽略大小写敏感
4、进入到/usr/images/jeecg-boot/jeecg-db目录下编写数据库的Dockerfile构建文件
FROM mysql
WORKDIR /docker-entrypoint-initdb.d #mysql所有初始化数据库的脚本都要放在这个目录,官网规定的
ADD jeecg-boot.sql . # 将数据库脚本放在/docker-entrypoint-initdb.d目录下面
EXPOSE 3306 #将容器3306端口暴露出来
5、进入到/usr/images/jeecg-boot/jeecg-app目录下编写后台服务的Dockerfile构建文件,应用需要jdk环境,所以需要构建java镜像环境,我这里也是构造最新的
编写Dockerfile文件
FROM openjdk
WORKDIR /usr/local/jeecg-app
ADD jeecg-boot.jar .
ADD application.yml .
ADD application-dev.yml .
EXPOSE 8080
CMD ["java","-jar","jeecg-boot.jar"]
6、在/usr/images/jeecg-boot/jeecg-redis下面编写缓存的Dockerfile
注:如果需要用到自己的redis.conf 进行特殊的配置,官网也告诉了我们怎么做
7、在/usr/images/jeecg-boot下面构建docker-compose.yml文件,下面说明两种编排方式
①、第一种编排方式
version: '3'
services:
db:
build: ./jeecg-db/
ports:
- "3306:3306"
restart: always #如果上方镜像对应的容器停止了,会自动重启
networks:
- my_net
environment:
MYSQL_ROOT_PASSWORD: root
command:
--lower_case_table_names=1
jeecg_redis:
build: ./jeecg-redis/
ports:
- "6379:6379"
restart: always
networks:
- my_net
app:
build: ./jeecg-app/
ports:
- "8080:8080"
restart: always
networks:
- my_net
networks:
my_net:
driver: bridge
②、第二种编排方式,这个更加简单
version: '3'
services:
db:
build: ./jeecg-db/
restart: always #如果上方镜像对应的容器停止了,会自动重启
environment:
MYSQL_ROOT_PASSWORD: root
command:
--lower_case_table_names=1
jeecg_redis:
build: ./jeecg-redis/
restart: always
app:
build: ./jeecg-app/
ports:
- "8080:8080"
restart: always
depends_on:
- db #设置指向了上面容器的名称,他们两个通过服务名实现了两个容器的互联互通
- jeecg_redis
8、按编排顺序启动 docekr-compose up -d
①、如果第7步是以第一种编排方式进行编排,启动的时候如下
②、如果第7步是以第二中编排方式进行编排,启动的时候如下所示,可以看到它默认也创建了一个网桥jeecg-boot_default
9、验证部署是否成功
访问http://192.168.18.132:8080/jeecg-boot/
可以看到,这里我们就已经部署成功了,而且容器之间都可以互相通讯,app可以访问数据库和缓存redis
注:jeecg-app工程连接数据库容器和redis容器,不是以ip连接了,它直接以redis和数据库容器的名称进行连接,因为容器每一次创建,虚拟IP都会发生变化,所以用容器的名称进行通讯更为通用
10、停止容器docekr-compose down
可以看到,停止后,容器,网桥都被移除了