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容器间通信详解