使⽤docker部署project-exam-system
1. 背景,在⼀台主机之内,实现容器的编排,发布考试系统
2. 环境准备
1. docker
1. vim /etc/docker/daemon.json
2. docker-compos
3. 普通的部署
1. 镜像
1. 前端:nginx latest服务
1. 拉取nignx:latest镜像
2. 测试
3. 上传前端项⽬dist
4. 创建启动容器
docker run -itd -p80:80 -v
/root/project_exam_system/web/dist:/u
sr/share/nginx/html ngin x:latest
5. 测试成功
6. 出现问题,在实现登录的时候,都实现后段异常,
原因后段还没后部署7. 登录的时候请求的域名bu.yuanyu.zhangmin,我们是
hosts域名劫持来实现
2. 后端的业务 jdk17 springboot 有点 不⽤单独部署
tomcat,已经在springboot中内置tomact
1. 准备拉取基础centos镜像
2. Docker run -it centos:latest /bin/bash
3. ctrl p q
4. jdk17版本的⽂件
5. 项⽬资源 .war. .perpreties
6. 将在服务器上的jaav的资源⽂件上传到容器
1. 上传jdk
docker cp jdk... c389:/
2. 向容器上传为服务的项⽬⽂件
docker cp Project_exam_system.war
c389:/
3. 向容器上传微服务的配置⽂件
Docker cp application.properties
c389:/
4. 对已经传到容器的⽂件进⾏部署docer attach c389
5. 解压⽂件到指定的⽬录,并且跳过第⼀层⽬录
tar -zxvf idk-17.0.....tar.gz -C
/usr/local/jdk --strip
components=1
6. 测试启动微服务
/usr/local/jdk/bin/java -jar
Protect_exam_system.war
7. 修改appllcaiton.properties⽂件
1. spring.datesource.url=jdbc:msyql://你的主机
的ip:3306/project_exam_system
8. ctrl p q 退出
9. 根据容器创建镜像
docker commit 28b9 java:v0
10. 查看镜像
docker images
11. 停⽤原来的容器
docker stop 28b93. 移除原来的容器
docker rm 28b9
4. 根据新建的镜像,创建容器
docker run -itd -p8080:8080 java:v0
```
14. docker ps查看容器的进程
```
docker ps
```
15. 将java容器的终端附加到当前终端
docker attach ref8
```
16. 启动springboot微服务
/usr/local/jdk/bin/java -jar
Project_exam_system.war
17. 数据持久化业务 mysq 5.7.44
1. 拉取mysql:5.7.44
docker pull mysql:5.7.44
2. 上传mysql⽂件
3. 执⾏mysql⽂件
mysql -uroot -proot <
project_exam_system.sql
4. 启动mysql容器,并且映射端⼝
docker run -itd -p3306:3306
mysql:5.7.44
5. 使⽤exec指令访问数据库管理界⾯
docker exec -it cdc8 mysql -uroot -
proot
# 由于在java的配置⽂件中,访问数据库的账号
和密码不是root,⽽是zhangmin
create user 'zhangmin'@'%' identified
by 'zhangmin';
grant all on *.* to 'zhangmin'@'%';
flush privileges;回顾
nmt
nginx
1.下载镜像,启动镜像,将本地的dist项⽬的⽬录挂载在容器
的/usr/share/nginx/html
2.启动服务
3.前后端分离的项⽬,并⾮所有的请求都是来⾃于同⼀个位置,
设置请求的时候还是需要在hosts⽂件中挟持域名
4.域名是固定的,但是,域名可以绑定不同的ip
mysql
1. 各个版本都有官⽅的镜像,直接下载 docker pull msyql:5.7.44
2. 启动容器的时候,挂载data⽬录,3. 制作data的时候,顺⼿删除auto.cnf
tomcat
docker run -itd -p3306:3306 -v
/root/pes/mysql/data:/var/lib/mysql
msyql:5.7.44
docker run -itd -p3306:3306 -e
MYSQL_ROOT_PASSWORD
1. 被war包集成,所以我们直接启动war
2. springboot 可以直接集成tomcat,build⼀个jar v包或者
是war
3. 我们没有安装tomcat
4. application.properties
1. 可以配置端⼝
2. 配置数据库的访问
5. 使⽤/usr/local/jdk/bin/java -jar
Project_ExamSystem-V1.0.0.war启动,但是在启动这个任务⼀
定要跳转到⽂件所在⽬录,因为在启动的同时,还需要加载
applicaiton.properrties
6. Dockerfile创建镜像,如果对象的主机上没有对应镜像,我们
希望使⽤⼀个⽂件创建项⽬,就需要使⽤到Dockerfile,使⽤
docker build,也需要在Dockerfile所在⽬录中执⾏docker
build,否则找到Dockerfile也是⽆法创建制作docker-compose.yml⽂件,实现⼀键部署
步骤:
1. 启动nginx
docker run -itd -p80:80 -v
/root/pes/web/src/dist/:/usr/share/nginx/html/
nginx:latest
2. 启动java容器
3. 启动mysql
配置⾼可⽤的项⽬
1. 先创建三个前段 nginx容器
1. 端⼝不能映射80docker run -itd -v
/root/pes/web/src/dist/:/usr/share/nginx/htm
l/ nginx:latest
2. 现在在远程是⽆法访问nginx服务,⽽且现在也不希望外部
直接访问nginx,希望创建nginx服务的集群,这个集群被
haproxy代理,创建三个nginx容器,创建⼀个haproxy服
务,⽽且nginx容器还需要指定名称,web0 web1 web2因为
如果没有名称,那么容器就⽆法被haproxy --link
3. 启动haproxy容器 hap0
1. 拉取haproxy镜像
docker pull haproxy
https://www.haproxy.com/documentation/ha
proxy-enterprise/getting
started/tutorials/docker
tutorial/#sidebar
2. 配置
global
daemon
# nbproc 1 # pidfile /var/run/haproxy.pid
# ⼯作⽬录
# chroot /usr/local/etc/haproxy
defaults
log 127.0.0.1 local0 err #[err
warning info debug]
mode http #默认的模
式mode { tcp|http|health },tcp是4层,http
是7层,health只会返回OK
retries 2 #两次连接
失败就认为是服务器不可⽤,也可以通过后⾯设置
option redispatch #当
serverId对应的服务器挂掉后,强制定向到其他健康
的服务器
option abortonclose #当服务器
负载很⾼的时候,⾃动结束掉当前队列处理⽐较久的链
接
option dontlognull #⽇志中不
记录负载均衡的⼼跳检测记录
maxconn 4096 #默认的最
⼤连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超
时
timeout server 30000ms #服务器超
时 #timeout check 2000 #=⼼跳检
测超时
######## 监控界⾯配置 #################
listen admin_status
# 监控界⾯访问信息
bind 0.0.0.0:8888
mode http
# URI相对地址
stats uri /dbs
# 统计报告格式
stats realm Global\ statistics
# 登录账户信息
stats auth admin:123456
########frontend配置##############
######## mysql负载均衡配置 ###############
listen proxy-mysql
bind 0.0.0.0:3306
mode tcp
# 负载均衡算法
# static-rr 权重, leastconn 最少连
接, source 请求IP, 轮询 roundrobin
balance roundrobin
# ⽇志格式
option tcplog # 在 mysql 创建⼀个没有权限的haproxy
⽤户,密码为空。 haproxy⽤户
# create user 'haproxy'@'%'
identified by ''; FLUSH PRIVILEGES;
option mysql-check user haproxy
# 这⾥是容器中的IP地址,由于配置的是
轮询roundrobin,weight 权重其实没有⽣效
server MYSQL_1
192.168.130.100:3306 check weight 1
maxconn 2000
server MYSQL_2
192.168.130.101:3306 check weight 1
maxconn 2000
#server MYSQL_3
192.168.130.102:3306 check weight 1
maxconn 2000
# 使⽤keepalive检测死链
# option tcpka
########################################
#
######## mysql负载均衡配置 ###############
listen proxy-web
bind 0.0.0.0:5000
mode http
# 负载均衡算法 # static-rr 权重, leastconn 最少连
接, source 请求IP, 轮询 roundrobin
balance roundrobin
# ⽇志格式
option tcplog
# 在 mysql 创建⼀个没有权限的haproxy
⽤户,密码为空。 haproxy⽤户
# create user 'haproxy'@'%'
identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这⾥是容器中的IP地址,由于配置的是
轮询roundrobin,weight 权重其实没有⽣效
server web0 10.1.1.10:80 check
weight 1 maxconn 2000
server web1 10.1.1.10:81 check
weight 1 maxconn 2000
server web2 10.1.1.10:82 check
weight 1 maxconn 2000
#server MYSQL_3
192.168.130.102:3306 check weight 1
maxconn 2000
# 使⽤keepalive检测死链
# option tcpka
########################################
#1. 在宿主机上安装了haproxy,配置,代理三个的
nginx容器中的web服务,也是直接添加容器的ip地
址
systemctl start haproxy
2. 创建⼀个haproxy,将配置⽂件导⼊到容器,在容器
中启动haproxy,也是可以的
docker cp
/root/pes/haproxy/haproxy.cfg 容器名
称|id:/usr/local/etc/haproxy/haproxy.
cfg
# 启动
haproxy -f
/usr/local/etc/haproxy/haproxy.cfg
3. 实际的使⽤haproxy容器,只需要将配置⽂件挂载到
指定的⽬录就可以docker run
-itd #交互 终端 后台
--link=web0 锚定web0
--link=web1
--link=web2
-p5000:5000
-v
#/root/pes/haproxy/haproxy.cfg:/usr/l
ocal/etc/haproxy/haproxy.cfg
# 将配置⽂件挂载到容器中
haproxy:latest #镜像
3. 启动
4. 代理java服务
# 通⽤java容器
docker stop java01
docker rm java01
# 开启三个java容器,名称分别为java0 java1
java2
docker run -itd --name java0 -v
/root/pes/java/src/:/java/src java:v0
docker run -itd --mane java1 -v
/root/pes/java/src/:/java/src java:v0docker run -itd --name java2 -v
/root/pes/java/src/:/java/src java:v0
#配置haproxy.cfg
listen proxy-java
bind 0.0.0.0:8080
mode http
# 负载均衡算法
# static-rr 权重, leastconn 最少连
接, source 请求IP, 轮询 roundrobin
balance roundrobin
# ⽇志格式
option tcplog
# 在 mysql 创建⼀个没有权限的haproxy
⽤户,密码为空。 haproxy⽤户
# create user 'haproxy'@'%'
identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这⾥是容器中的IP地址,由于配置的是
轮询roundrobin,weight 权重其实没有⽣效
server j0 java0:8080 check
weight 1 maxconn 2000
server j1 java1:8080 check
weight 1 maxconn 2000
server j2 java2:8080 check
weight 1 maxconn 2000#server MYSQL_3
192.168.130.102:3306 check weight 1
maxconn 2000
# 使⽤keepalive检测死链
# option tcpka
########################################
#
# 移除haproxy容器,重新创建
docker stop hap0
docker -itd --name hap0 --link=web0 --
link=web1 --link=web2 --link=java0 --
linke=java1 --link=java2 -p8080:8080 -
p8888:8888 -p5000:5000 -v
/root/pes/haproxy/haproxy.cfg:/usr/local
/etc/haproxy/haproxy nginx:latest
5. ab压⼒测试
yum provides *bin/ab
yum -y install httpd-toolsDocker-compose⾃动化部
署
1. 安装docker
source docker.sh
2. 安装pip
yum -y install python2-pip
3. 升级pippip install --upgrade pip==20.3 -i
https://mirrors.aliyun.com/pypi/simple
4. 安装docker-compose
pip install docker-compose -i
https://mirrors.aliyun.com/pypi/simple
5. 创建pes⽬录以及⼦⽬录
cd
mkdir -p pes/{msyql,java,web}
6. 在pes⽬录下创建并且编辑dockerr-compose.yml⽂件
cd pes
vim docker-compose.yml
version: "3"
servies:
web:
container_name: web0
image: nginx:latest ports:
- "80:80"
expose:
- 80
volumes:
- ./web/src/dist/:/usr/share/nginx/html/
restart: "always"
java:
mysql:
7. 添加web服务
web:
container_name: web0
image: nginx:latest
ports:
- "80:80"
expose:
- 80
volumes:
- ./web/src/dist/:/usr/share/nginx/html/
restart: "always"
8. docker-compose启动集群cd pes
docker-compose up -d
9. docker-compose暂停集群
cd pes
docker-compose stop
10. docker-compose移除容器
docker-compose down
11. docker-compose多开容器
docker-compose up -d --scale web=5
04-29
4874
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
03-10
08-31
608
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-31
507
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-06