四时宝库

程序员的知识宝库

Docker Compose 容器编排实现应用的自动部署

一般一个项目有前端、后端、有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

可以看到,停止后,容器,网桥都被移除了

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接