使用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、构建并运行

相关推荐
北京阿法龙科技有限公司12 分钟前
AR眼镜基于上下文智能识别:电力运维高效规范操作应用方案|阿法龙XR云平台
运维·ar·xr
RisunJan29 分钟前
docker一键部署项目
运维·docker·容器
你的人类朋友31 分钟前
😎 Node.js 应用多阶段构建 Dockerfile 详解
后端·docker·容器
victory04311 小时前
K8S NFS 静态配置和动态配置 StorageClass
云原生·容器·kubernetes
运维 小白1 小时前
k8s 部署NFS和动态供应器
云原生·容器·kubernetes
luyun0202021 小时前
Windows 11操作更丝滑,绝了
java·运维·figma
wanhengidc2 小时前
全面了解云手机的安全性
运维·服务器·游戏·智能手机·云计算
hweiyu002 小时前
Docker(K8S)容器架构教程(视频教程)
docker·架构·kubernetes
menge23333 小时前
Linux DNS域名解析服务器练习
linux·运维·服务器
努力成为一个程序猿.3 小时前
Clickhouse数据副本和分片
运维·clickhouse·debian