以前我们部署一个集群环境,需要我们手动安装各种软件,现在有了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。