使用Docker-Compose部署SpringBoot项目的案例

Docker-Compose是Docker官方的一个开源项目,主要用于实现对Docker容器集群的快速编排和管理。该项目由Python编写,通过调用Docker服务提供的API来管理容器。只要所操作的平台支持Docker API,就可以利用Docker-Compose进行编排管理。Docker-Compose通过简化多容器应用的部署和管理,使得开发人员能够更专注于应用程序的开发和测试。

部署SpringBoot

现在我们有一个springboot项目,需要依赖Redis、mysql5.7、nginx。

如果使用docker原生部署的话,则需要安装Redis、mysql5、nginx容器,在才可以启动我们springboot项目,这样的话部署项目的流程非常复杂,所以需要引入我们的Docker compose实现容器编排技术。

1、在服务器上创建工作目录

工作目录是用于存放部署所需要的文件等(Dockerfile、jar包、配置文件、静态资源),我这里是在根目录下创建app文件夹,里面内容如下

2、打包SpringBoot项目并上传到服务器

注意,在SpringBoot项目中的yml文件中,也需要一些小小的改动,如下:

3、编辑需要的Dockerfile文件

本项目一共需要3个,分别是springboot的、nginx、以及mysql,分别如下

3.1、Dockerfile-springboot

#镜像、容器的基础环境,这里是JDK8
FROM kdvolder/jdk8
MAINTAINER zhangb

#设置工作目录
WORKDIR /app

# 将jar包复制到容器内,注意在dockerfile中,路径都是相对路径,而不是绝对路径 
COPY /projects/SmartCommunities-0.0.1-SNAPSHOT.jar /app/SmartCommunities-0.0.1-SNAPSHOT.jar 

# 向外暴露端口  
EXPOSE 8383

# 定义容器启动时执行的命令  
ENTRYPOINT ["java","-jar","/app/SmartCommunities-0.0.1-SNAPSHOT.jar"]

3.2、Dockerfile-nginx

# 使用官方Nginx镜像作为基础  
FROM nginx:latest
MAINTAINER zhangb

# 复制自定义的Nginx配置文件  
COPY /usr/local/nginx/conf/nginx.conf nginx.conf

# 复制你的静态文件或其他资源(如果有的话)  
COPY /usr/local/nginx/html /usr/share/nginx/html

对应的nginx配置文件

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

    #access_log  logs/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       81;
        server_name  localhost;

        charset utf-8;


        location / {
            root   html;
            index  index.html index.htm;
        }	
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

    #项目的静态资源以及后端代理
    server {
	listen 80;
	server_name smartcommunity;
	
	location /{
		root /usr/share/nginx/html;
		index index.html;
	}
	location /prod-api/{
		proxy_pass http://192.168.235.138:8383/;
	}
   }


}

nginx所需要的静态资源

存放在app下的html中

3.3、Dockerfile-mysql

MAINTAINER zhangb

#/docker-entrypoint-initdb.d/目录下的所有.sh、.sql、.sql.gz文件(取决于具体的数据库镜像)将在数据库初始化时被执行或导入。
#这意味着community-linux.sql中的SQL命令将在数据库容器首次启动时被执行,从而初始化数据库
ADD ./db/communiyu01.sql /docker-entrypoint-initdb.d

4、核心docker-compose.yml文件

注意,yml中的缩进全部都是空格来完成的,如果有tab,会报错

#Docker-compose的版本
version: '3.0'  
  
#编排的服务、容器有哪些
services:  

  #mysql服务
  db:
    #定义容器名称,这里就是之前springboot的yml配置文件中的
    container_name: db  
    #所使用的mysql镜像
    image: mysql:8.0
    #通过dockerfile-mysql来构建
    build:
      context: ./
      dockerfile: Dockerfile-mysql
    #解决外部与内部连接的问题
    command: --default-authentication-plugin=mysql_native_password
    #数据库的环境
    environment:
      #初始化mysql的密码
      MYSQL_ROOT_PASSWORD: 111111  
      MYSQL_DATABASE: 'community01'
      MYSQL_PASSWORD: 111111
    ports:  
        - "3306:3306"  
    #使用的网络,注意,docker中容器的通信需要在同一网络下才能进行通信
    networks:
      - community
  
  redis:  
    image: redis:7.0
    container_name: redis  
    ports:  
        - "6379:6379"  
    networks:
      - community
  
  app:  
    build:  
      context: .  
      dockerfile: Dockerfile-springboot  
    ports:  
        - "8383:8383"  
    depends_on:  
      - db  
    networks:
      - community  

  nginx:  
    build:  
      context: .  
      dockerfile: Dockerfile-nginx  
    ports:  
        - "83:80"  
    depends_on:  
      - app
    networks:
      - community

#定义该项目下的容器所使用的网络
networks:  
  #定义的网络名称
  community:  
      #网络类型,桥接模式
      driver: bridge

同时,关于docker中的容器通信,详看Docker容器间通信详解

5、构建并运行

相关推荐
胖毁青春,瘦解百病18 分钟前
Docker镜像源设置不生效问题排查
docker·容器
fnd_LN18 分钟前
Linux文件目录 --- mkdir命令,创建目录,多级目录,设置目录权限
linux·运维·服务器
会飞的土拨鼠呀28 分钟前
Flannel是什么,如何安装Flannel
运维·云原生·kubernetes
木与子不厌30 分钟前
微服务自定义过滤器
运维·数据库·微服务
行思理1 小时前
Linux 下SVN新手操作手册
linux·运维·svn
嘤嘤怪呆呆狗1 小时前
【开发问题记录】使用 Docker+Jenkins+Jenkins + gitee 实现自动化部署前端项目 CI/CD(centos7为例)
前端·vue.js·ci/cd·docker·gitee·自动化·jenkins
沛沛老爹1 小时前
CI/CD是什么?
运维·git·ci/cd
IPdodo全球网络服务2 小时前
如何通过TikTok引流到私域流量池
运维·服务器·网络
IT 古月方源3 小时前
关于高级acl的配置和讲解
运维·开发语言·网络·tcp/ip·智能路由器
Tester_孙大壮3 小时前
运维相关知识科普
大数据·运维·数据库