使⽤docker部署project-exam-system
- 背景,在⼀台主机之内,实现容器的编排,发布考试系统
- 环境准备
- docker
- vim /etc/docker/daemon.json
- docker-compos
- 普通的部署
- 镜像
- 前端:nginx latest服务
- 拉取nignx:latest镜像
- 测试
- 上传前端项⽬dist
- 创建启动容器
docker run -itd -p80:80 -v
/root/project_exam_system/web/dist:/u
sr/share/nginx/html ngin x:latest - 测试成功
- 出现问题,在实现登录的时候,都实现后段异常,
原因后段还没后部署7. 登录的时候请求的域名bu.yuanyu.zhangmin,我们是
hosts域名劫持来实现 - 后端的业务 jdk17 springboot 有点 不⽤单独部署
tomcat,已经在springboot中内置tomact - 准备拉取基础centos镜像
- Docker run -it centos:latest /bin/bash
- ctrl p q
- jdk17版本的⽂件
- 项⽬资源 .war. .perpreties
- 将在服务器上的jaav的资源⽂件上传到容器
- 上传jdk
docker cp jdk... c389:/ - 向容器上传为服务的项⽬⽂件
docker cp Project_exam_system.war
c389:/ - 向容器上传微服务的配置⽂件
Docker cp application.properties
c389:/ - 对已经传到容器的⽂件进⾏部署docer attach c389
- 解压⽂件到指定的⽬录,并且跳过第⼀层⽬录
tar -zxvf idk-17.0.....tar.gz -C
/usr/local/jdk --strip
components=1 - 测试启动微服务
/usr/local/jdk/bin/java -jar
Protect_exam_system.war - 修改appllcaiton.properties⽂件
- spring.datesource.url=jdbc:msyql://你的主机
的ip:3306/project_exam_system - ctrl p q 退出
- 根据容器创建镜像
docker commit 28b9 java:v0 - 查看镜像
docker images - 停⽤原来的容器
docker stop 28b93. 移除原来的容器
docker rm 28b9 - 根据新建的镜像,创建容器
docker run -itd -p8080:8080 java:v0
``` - docker ps查看容器的进程
```
docker ps
``` - 将java容器的终端附加到当前终端
docker attach ref8
``` - 启动springboot微服务
/usr/local/jdk/bin/java -jar
Project_exam_system.war - 数据持久化业务 mysq 5.7.44
- 拉取mysql:5.7.44
docker pull mysql:5.7.44 - 上传mysql⽂件
- 执⾏mysql⽂件
mysql -uroot -proot <
project_exam_system.sql - 启动mysql容器,并且映射端⼝
docker run -itd -p3306:3306
mysql:5.7.44 - 使⽤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
- 各个版本都有官⽅的镜像,直接下载 docker pull msyql:5.7.44
- 启动容器的时候,挂载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 - 被war包集成,所以我们直接启动war
- springboot 可以直接集成tomcat,build⼀个jar v包或者
是war - 我们没有安装tomcat
- application.properties
- 可以配置端⼝
- 配置数据库的访问
- 使⽤/usr/local/jdk/bin/java -jar
Project_ExamSystem-V1.0.0.war启动,但是在启动这个任务⼀
定要跳转到⽂件所在⽬录,因为在启动的同时,还需要加载
applicaiton.properrties - Dockerfile创建镜像,如果对象的主机上没有对应镜像,我们
希望使⽤⼀个⽂件创建项⽬,就需要使⽤到Dockerfile,使⽤
docker build,也需要在Dockerfile所在⽬录中执⾏docker
build,否则找到Dockerfile也是⽆法创建制作docker-compose.yml⽂件,实现⼀键部署
步骤: - 启动nginx
docker run -itd -p80:80 -v
/root/pes/web/src/dist/:/usr/share/nginx/html/
nginx:latest - 启动java容器
- 启动mysql
配置⾼可⽤的项⽬ - 先创建三个前段 nginx容器
- 端⼝不能映射80docker run -itd -v
/root/pes/web/src/dist/:/usr/share/nginx/htm
l/ nginx:latest - 现在在远程是⽆法访问nginx服务,⽽且现在也不希望外部
直接访问nginx,希望创建nginx服务的集群,这个集群被
haproxy代理,创建三个nginx容器,创建⼀个haproxy服
务,⽽且nginx容器还需要指定名称,web0 web1 web2因为
如果没有名称,那么容器就⽆法被haproxy --link - 启动haproxy容器 hap0
- 拉取haproxy镜像
docker pull haproxy
https://www.haproxy.com/documentation/ha
proxy-enterprise/getting
started/tutorials/docker
tutorial/#sidebar - 配置
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⾃动化部
署
- 安装docker
source docker.sh - 安装pip
yum -y install python2-pip - 升级pippip install --upgrade pip==20.3 -i
https://mirrors.aliyun.com/pypi/simple - 安装docker-compose
pip install docker-compose -i
https://mirrors.aliyun.com/pypi/simple - 创建pes⽬录以及⼦⽬录
cd
mkdir -p pes/{msyql,java,web} - 在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:
- 添加web服务
web:
container_name: web0
image: nginx:latest
ports:
- "80:80"
expose: - 80
volumes: - ./web/src/dist/:/usr/share/nginx/html/
restart: "always"
- docker-compose启动集群cd pes
docker-compose up -d - docker-compose暂停集群
cd pes
docker-compose stop - docker-compose移除容器
docker-compose down - docker-compose多开容器
docker-compose up -d --scale web=5