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: 111111ports: - "3306:3306" #使用的网络,注意,docker中容器的通信需要在同一网络下才能进行通信networks:- communityredis: image: redis:7.0container_name: redis ports: - "6379:6379" networks:- communityapp: build: context: . dockerfile: Dockerfile-springboot ports: - "8383:8383" depends_on: - db networks:- community nginx: build: context: . dockerfile: Dockerfile-nginx ports: - "83:80" depends_on: - appnetworks:- community#定义该项目下的容器所使用的网络
networks: #定义的网络名称community: #网络类型,桥接模式driver: bridge
同时,关于docker中的容器通信,详看Docker容器间通信详解
5、构建并运行