以前我们部署一个集群环境,需要我们手动安装各种软件,现在有了docker,一切变得非常简单,只需要编写好docker file和docker-compose.yaml文件,然后执行docker-compose up就一切搞定了。简直是部署神器,码农福音。下面通过docker配置一套包含redis,mysql,nginx的guns代码集群环境,来说明利用docker如何部署springboot应用集群环境。
1. 首先安装docker环境,我安装的docker for windows。
2. 配置docker国内镜像地址,可以参考我的博客,Docker for window Docker加速器设置。
3.准备guns jar文件。
mvn package -Dmaven.test.skip=true
4.创建docker release需要的相关文件夹,我是放在d:/docker目录下的。
d:/docker/guns/guns-admin/
d:/docker/guns/guns-admin/guns-admin
d:/docker/guns/guns-admin/logs
d:/docker/guns/guns-admin/upload
d:/docker/guns/guns-admin/nginx
d:/docker/guns/guns-admin/logs/admin1
d:/docker/guns/guns-admin/logs/admin2
5. 拷贝guns-admin-1.0.0-SNAPSHOT.jar到d:/docker/guns/guns-admin/guns-admin,并在同级目录创建Dockerfile。
#基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
ADD guns-admin-1.0.0-SNAPSHOT.jar /app.jar
# 开放8080端口
EXPOSE 8080
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
6. 在d:/docker/guns/guns-admin目录下创建docker-compose.yaml文件。
mysql1:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
ports:
- "3306:3306"
expose:
- "3306"
redis1:
image: redis
ports:
- "6379:6379"
expose:
- "6379"
nginx1:
image: nginx
volumes:
- d:/docker/guns/guns-admin/nginx/nginx.conf:/etc/nginx/nginx.conf
- d:/docker/guns/guns-admin/logs/nginx:/var/log/nginx/
ports:
- "80:80"
expose:
- "80"
links:
- admin1
- admin2
admin1:
build: ./guns-admin
volumes:
- d:/docker/guns/guns-admin/upload:/upload
- d:/docker/guns/guns-admin/logs/admin1:/logs
ports:
- "8081:8080" #端口映射
expose:
- 8081 #暴露容器端口
links:
- mysql1
- redis1
admin2:
build: ./guns-admin
volumes:
- d:/docker/guns/guns-admin/upload:/upload
- d:/docker/guns/guns-admin/logs/admin2:/logs
ports:
- "8082:8080" #端口映射
expose:
- 8082 #暴露容器端口
links:
- mysql1
- redis1
7. 然后在d:/docker/guns/guns-admin/nginx文件夹创建nginx.conf文件。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
server admin1:8080 weight=5;
server admin2:8080 weight=5;
}
server {
listen 80;
server_name guns;
location / {
proxy_pass http://mysvr;
}
}
}
这里我耽搁了两天才调通,遇到了下面两个坑。
- admin1和admin2,nginx都应该通过8080端口访问,因为他们是同一个内网。
- #include /etc/nginx/conf.d/*.conf; 这句必须注释掉,否则只有nginx的default.conf会生效,完全不会跳转。
8.在d:/docker/guns/guns-admin目录执行docker-compose up命令。
docker-compose up
9.这里可以看到应用会被启动起来,但是druid会报错,因为我们的mysql还是一片空白。通过navicat连接到mysql,然后执行guns.sql文件。不出意外数据库会被创建。
10. 暂停刚开始执行的docker-compose up命令,然后再次执行docker-compose up命令。
11. 现在就可以正常访问了。
连接redis,可以看到session已经被缓存到redis当中。
到此就完成了,所有代码可以到码云上找到,guns_master0125。