云盘算实训41——部署project_exam_system项目(续)

打印 上一主题 下一主题

主题 846|帖子 846|积分 2538

  1. # 创建脚本,可以在java环境中运行任何的jar包或者war包
  2. #!/bin/bash
  3. /usr/local/jdk/bin/java -jar /java/src/*.?ar
复制代码
一、思绪分析

(1)nginx
1、下载镜像,将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ 2、启动容器
3、该项目是一个前后端分离的项目,并非所有的请求都是来自同一个位置,设置请求的时候照旧需 要在hosts文件中挟持域名
4、域名是固定的,但是,域名可以绑定不同的ip 5、以是我们设置前端请求发送给一个bu.yuanyu.zhangmin的域名,然后在本机中将域名挟制给我 们的docker服务器,当我们发送请求给该域名时,docker服务器将给我们作出回应
(2)mysql
1、各个版本都有官方的镜像,直接下载docker pull mysql:5.7.44 2、启动容器的时候,挂载data目录
3、制作data的时候,顺⼿删除auto.cnf
(3)tomcat
1、被war包集成,以是我们直接启动war 2、springboot可以直接集成tomcat,build一个jar包或者是war包
3、我们没有安装tomcat 4、application.properties(将tomcat毗连数据库)
1、可以配置端口
2、配置数据库的访问
5、使用/usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war启动,但是在启动这个任务时 一定要跳转到application.properties文件所在目录,由于在启动的同时,还必要加载applicaiton.properties
二、制作docker-compose.yml文件,实现一键部署

1、底子准备(包管底子镜像无问题)

1)下载底子镜像
  1. [root@docker ~]# docker images
  2. REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
  3. nginx       latest   5ef79149e0ec   2 weeks ago   188MB
  4. mysql        5.7.44   5107333e08a8   8 months ago   501MB
  5. centos       latest   5d0da3dc9764   2 years ago   231MB
复制代码
2)创建nginx:v0镜像
  1. [root@docker project_exam_system]# tree web/
  2. web/
  3. ├── dist
  4. │?? ├── assets
  5. │?? │?? ├── AdminView-yX0Ltz_1.js
  6. │?? │?? ├── CategoryView-Ca4t3JNT.js
  7. │?? │?? ├── CityView-0ESlUfo8.css
  8. │?? │?? ├── CityView-BJTl06GN.js
  9. ......
  10. │   ├── TeacherView-Cogr4CCq.js
  11. │   │   ├── TopicView-DFXgxSyC.js
  12. │   │   └── TopicView-Is6fJS__.css
  13. │   ├── favicon.ico
  14. │   └── index.html
  15. └── Dockerfile
  16. [root@docker web]# docker build -t nginx:v0 .
  17. [+] Building 0.2s (7/7) FINISHED                                            
  18.   docker:default
  19. [root@docker ~]# docker images
  20. REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
  21. nginx       v0       13ccc573fe05   9 seconds ago   189MB
复制代码
3)创建java:v0镜像
  1. [root@docker project_exam_system]# tree java
  2. java
  3. ├── application.properties
  4. ├── Dockerfile
  5. ├── java.sh
  6. ├── jdk
  7. │   ├── bin
  8. │   │   ├── jar
  9. │   │   ├── jarsigner
  10. │   │   ├── java
  11. │   │   ├── javac
  12. ......
  13. │   │       ├── rmiregistry.1
  14. │   │       └── serialver.1
  15. │   ├── README
  16. │   └── release
  17. ├── jdk-17_linux-x64_bin.tar.gz
  18. └── Project_ExamSystem-V1.0.0.war
  19. [root@docker java]# docker build -t java:v0 .
  20. [+] Building 7.2s (9/9) FINISHED                                            
  21.   docker:default
  22. [root@docker java]# docker images
  23. REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
  24. java         v0       7fae85c42cbe   36 seconds ago   591MB
复制代码
4)创建mysql:v0镜像
  1. [root@docker project_exam_system]# tree mysql/
  2. mysql/
  3. ├── Dockerfile
  4. └── project_exam_system.sql
  5. 0 directories, 2 files
  6. [root@docker mysql]# docker build -t mysql:v0 .
  7. [+] Building 0.3s (7/7) FINISHED                                            
  8.   docker:default
  9. [root@docker mysql]# docker images
  10. REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
  11. mysql       v0       258d8ed442ac   16 seconds ago   512MB
复制代码
5)启动nginx容器
  1. [root@docker ~]# docker run -itd -p80:80 nginx:v0
复制代码
6)启动java容器
  1. [root@docker ~]# docker run -itd --name java -p8080:8080 java:v0
复制代码
7)启动mysql容器
  1. [root@docker ~]# docker run -itd --name mysql -p3306:3306 mysql:v0
复制代码
8)检察容器状态
  1. [root@docker ~]# docker ps
  2. CONTAINER ID   IMAGE           COMMAND                   CREATED            
  3. STATUS             PORTS                                                
  4. NAMES
  5. 79cc8614e967   mysql:v0         "docker-entrypoint.s…"   9 seconds ago      
  6. Up 6 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp  
  7. mysql
  8. 29d3ce68ceca   java:v0          "/usr/local/jdk/bin/…"   36 seconds ago    
  9. Up 34 seconds      0.0.0.0:8080->8080/tcp, :::8080->8080/tcp             java
  10. fed2633b259b   haproxy:latest   "docker-entrypoint.s…"   12 minutes ago    
  11. Up 11 minutes      0.0.0.0:5000->5000/tcp, :::5000->5000/tcp            
  12. wizardly_edison
  13. # 之后这些容器可以全部直接删除
  14. [root@docker ~]# docker rm -f 79(容器编号) 29(容器编号) fe(容器编号)
复制代码

2、配置高可用的项目(使用haproxy调用web和java容器)

1)先创建三个前端项目(nginx容器)
容器在不映射端口时,在长途是无法访问nginx服务,而且如今也不希望外部直接访问nginx,希望 创建nginx服务的集群,这个集群被haproxy代理,创建3个nginx容器,创建一个haproxy服务器,而且
nginx容器还必要指定名称,web0、web1、web2。由于如果没有名称,那么容器就无法被haproxy link到。
  1. # 端口不能映射80,并指定名称
  2. [root@docker ~]# docker run -itd --name web0 nginx:v0
  3. 45d83cda5bef619b937d25e581db31401841b955f9367dbffbc79a236e632612
  4. [root@docker ~]# docker run -itd --name web1 nginx:v0
  5. b9c80deb9f08a4c2327c1784c8fdb3ab8044c48160ee29102f27e2b52495b9f4
  6. [root@docker ~]# docker run -itd --name web2 nginx:v0
  7. 5fbd082f529cdab21b3a2eb74ae6d9560c694fe2a5368e1ad63affe1ad1c93e8
  8. # 查看容器状态
  9. [root@docker ~]# docker ps
  10. CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS  
  11.       PORTS     NAMES
  12. 5fbd082f529c   nginx:v0   "/docker-entrypoint.…"   4 seconds ago   Up 3
  13. seconds    80/tcp   web2
  14. b9c80deb9f08   nginx:v0   "/docker-entrypoint.…"   8 seconds ago   Up 6
  15. seconds    80/tcp   web1
  16. 45d83cda5bef   nginx:v0   "/docker-entrypoint.…"   12 seconds ago   Up 11
  17. seconds   80/tcp   web0
复制代码
2)haproxy容器外部测试
在宿主机上安装了haproxy,编辑配置文件,代理三个nginx容器中的web服务,是直接添加容器的
ip地址
  1. # 安装haproxy
  2. [root@docker ~]# yum -y install haproxy
  3. # 查看三个nginx容器的IP地址
  4. [root@docker ~]# docker inspect 45 | grep IPA
  5.            "SecondaryIPAddresses": null,
  6.            "IPAddress": "172.17.0.2",
  7.                    "IPAMConfig": null,
  8.                    "IPAddress": "172.17.0.2",
  9. [root@docker ~]# docker inspect b9 | grep IPA
  10.            "SecondaryIPAddresses": null,
  11.            "IPAddress": "172.17.0.3",
  12.                    "IPAMConfig": null,
  13.                    "IPAddress": "172.17.0.3",
  14. [root@docker ~]# docker inspect 5f | grep IPA
  15.            "SecondaryIPAddresses": null,
  16.            "IPAddress": "172.17.0.4",
  17.                    "IPAMConfig": null,
  18.                    "IPAddress": "172.17.0.4",
  19. # 修改配置文件
  20. [root@docker ~]# vim /etc/haproxy/haproxy.cfg
  21. # 注释静态资源
  22.   # use_backend static         if url_static
  23. # 修改轮询模块
  24. backend app
  25.   balance     roundrobin
  26.   server app1 172.17.0.2:80 check
  27.   server app2 172.17.0.3:80 check
  28.   server app3 172.17.0.4:80 check
  29. # 启动服务
  30. [root@docker ~]# haproxy -f /etc/haproxy/haproxy.cfg
  31. [root@docker ~]# netstat -lntup | grep 5000
  32. tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN  
  33.    1985/haproxy
  34. # 测试访问过后可以直接删除进程来停止服务
  35. [root@docker ~]# kill -9 1985(进程号)
  36. [root@docker ~]# netstat -lntup | grep 5000
复制代码

3)创建haproxy容器
创建一个haproxy容器,将配置文件导入到容器,在容器中启动haproxy,也是可以的
  1. # 拉取haprxy镜像
  2. [root@docker ~]# docker pull haproxy
  3. [root@docker ~]# docker images
  4. REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
  5. haproxy     latest   4e5bebb0fd91   7 weeks ago   103MB
  6. # 该haproxy.cfg文件是在官方网站里下载下来的
  7. [root@docker ~]# vim haproxy.cfg
  8. # 只修改web的轮询模块即可,默认是5000端口,也可修改
  9. listen proxy-web
  10.       bind 0.0.0.0:5000
  11. ......
  12.       server web0 172.17.0.2:80 check weight 1 maxconn 2000
  13. server web1 172.17.0.3:80 check weight 1 maxconn 2000
  14.       server web2 172.17.0.4:80 check weight 1 maxconn 2000
  15. [root@docker ~]# docker run -itd -p5000:5000 haproxy:latest /bin/bash
  16. fed2633b259b96d3c0ed5e9ca51c031c36b1e21361cb3cf9d57b9d49a9ea1710
  17. [root@docker ~]# docker cp haproxy.cfg fed:/usr/local/etc/haproxy
  18. Successfully copied 5.12kB to fed:/usr/local/etc/haproxy
  19. [root@docker ~]# docker attach fed
  20. haproxy@fed2633b259b:~$ ls /usr/local/etc/haproxy/haproxy.cfg
  21. /usr/local/etc/haproxy/haproxy.cfg
  22. # 启动服务
  23. haproxy@fed2633b259b:~$ haproxy -f /usr/local/etc/haproxy/haproxy.cfg
复制代码

4)使用haproxy容器调用web容器
  1. # -itd 交互 终端 后台
  2. # link 锚定web容器
  3. # v 将配置文件挂载到容器中
  4. [root@docker ~]# docker run -itd --link web0 --link web1 --link web2 -
  5. p5000:5000 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
  6. haproxy:latest
  7. 65466d3aef2566512b63690c02e4497ddb7594b8268a26136ec040e2cb858b3b
  8. [root@docker ~]# docker ps
  9. CONTAINER ID   IMAGE           COMMAND                   CREATED        
  10. STATUS         PORTS                                                 NAMES
  11. 65466d3aef25   haproxy:latest   "docker-entrypoint.s…"   6 seconds ago   Up 4
  12. seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp            
  13. romantic_curie
  14. 79cc8614e967   mysql:v0         "docker-entrypoint.s…"   2 hours ago     Up 2
  15. hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
  16. 29d3ce68ceca   java:v0          "/usr/local/jdk/bin/…"   3 hours ago     Up 3
  17. hours     0.0.0.0:8080->8080/tcp, :::8080->8080/tcp             java
  18. 5fbd082f529c   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4
  19. hours     80/tcp                                                 web2
  20. b9c80deb9f08   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4
  21. hours     80/tcp                                                 web1
  22. 45d83cda5bef   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4
  23. hours     80/tcp                                                 web0
  24. # 删除该haproxy容器(使用的是ip地址,要改为使用域名才可以进行link)
  25. [root@docker ~]# docker rm -f 65
复制代码

5)调用haproxy的监控界面(并改ip轮询为域名轮询)
  1. # 只查看即可,创建haproxy服务器容器时将相应端口映射出去就行,记得初始的账户和密码
  2. [root@docker ~]# vim haproxy.cfg
  3. ######## 监控界面配置 #################
  4. listen admin_status
  5.        # 监控界面访问信息
  6.       bind 0.0.0.0:8888
  7.       mode http
  8.        # URI相对地址
  9.       stats uri /dbs
  10.        # 统计报告格式
  11.       stats realm Global\ statistics
  12.        # 登录账户信息
  13.       stats auth admin:123456
  14. [root@docker ~]# vim haproxy.cfg
  15.       server web0 web0:80 check weight 1 maxconn 2000
  16.       server web1 web1:80 check weight 1 maxconn 2000
  17.       server web2 web2:80 check weight 1 maxconn 2000
  18. [root@docker ~]# docker run -itd --link web0 --link web1 --link web2 -
  19. p5000:5000 -p8888:8888 -v
  20. /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
  21. # 删除该haproxy容器
  22. [root@docker ~]# docker rm -f 8af
复制代码


6)使用haproxy容器调用java容器
  1. [root@docker ~]# docker run -itd --name java0 java:v0
  2. 283c87bcaea166b017160aa84ce5424dd9baf3ec8fd168a1406f7dc11be3e694
  3. [root@docker ~]# docker run -itd --name java1 java:v0
  4. e851f31c87f39c2d028e42b36bd77bcf818a8eb97c9a6cc002656fd1501c0ea6
  5. [root@docker ~]# docker run -itd --name java2 java:v0
  6. fb94c87c4fa87d08b0d621157aa33ed74ca459beb32a3c950a7703227ab2f031
  7. [root@docker ~]# vim haproxy.cfg
  8. # 复制一份proxy-web的模块,修改为java模块
  9. listen proxy-java
  10. # 修改端口为8080
  11.       bind 0.0.0.0:8080
  12.       mode http
  13.        # 负载均衡算法
  14.        # static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
  15.       balance roundrobin
  16.        # 日志格式
  17.       option tcplog
  18.        # 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
  19.        # create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
  20.        #option mysql-check user haproxy
  21.         # 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
  22. # 修改域名为java域名,端口为java端口
  23.       server java0 java0:8080 check weight 1 maxconn 2000
  24.       server java1 java1:8080 check weight 1 maxconn 2000
  25.       server java2 java2:8080 check weight 1 maxconn 2000
  26.        #server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
  27.        # 使用keepalive检测死链
  28.        # option tcpka
  29. [root@docker ~]# docker run -itd --link web0 --link web1 --link web2 --link
  30. java0 --link java1 --link java2 -p8080:8080 -p5000:5000 -p8888:8888 -v
  31. /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
  32. e5ea894c0f30988604cfd6fe5a48b9a69f14c2c3f2e373fe775c0554f37f19db
复制代码

  1. # 下载http-tools,使用ab测试承载量
  2. [root@docker ~]# yum -y install http-tools
  3. [root@docker ~]# ab -n 100 -c 10 http://10.0.0.7:5000/
复制代码


3、编辑docker-compose.yml文件,一键部署完备项目

新机子:
1)docker-compose环境准备
  1. # 配置docker环境
  2. source docker.sh
  3. scp 10.0.0.7:/etc/docker/daemon.json /etc/docker/daemon.json
  4. vim /etc/docker/daemon.json
  5. {      
  6.        "registry-mirrors" : [
  7.                "https://do.nark.eu.org",
  8.                "https://dc.j8.work",
  9.                "https://docker.m.daocloud.io",
  10.                "https://dockerproxy.com",
  11.                "https://docker.mirrors.ustc.edu.cn",
  12.                "https://docker.nju.edu.cn"
  13.       ]
  14. }  
  15. systemctl start docker
  16. # 安装pip(python包管理器)
  17. yum -y install python2-pip
  18. # 升级pip
  19. pip install --upgrade pip==20.3  -i https://mirrors.aliyun.com/pypi/simple
  20. # 安装docker-compose
  21. [root@compose ~]# pip install docker-compose --ignore-installed requests -i
  22. https://mirrors.aliyun.com/pypi/simple
复制代码
2)使用compose构建自动化部署文件
  1. # 创建项目目录
  2. [root@compose ~]# mkdir -p pes/{java,mysql,web}
  3. [root@compose ~]# tree pes/
  4. pes/
  5. ├── java
  6. ├── mysql
  7. └── web
  8. 3 directories, 0 files
  9. [root@compose ~]# cd pes
  10. # 在项目目录中创建docker-compoce.yml文件
  11. [root@compose pes]# vim docker-compose.yml
  12. version: "3"
  13. services:
  14. web:
  15.               container_name: web0
  16.               image: nginx:latest
  17.               ports:
  18.                - "80:80"
  19.               volumes:
  20.                - ./web/src/dist/:/usr/share/nginx/html/
  21.               expose:
  22.                - 80
  23.                restart: "always"
  24. #       mysql:
  25. #               container_name: mysql0
  26. #               image: mysql:5.7.44
  27. #       java:
  28. #               container_name: java0
  29. #               image: java:v0
  30. [root@compose pes]# mkdir -p web/src/
  31. [root@compose pes]# scp -r 10.0.0.7:/root/project_exam_system/web/dist
  32. web/src/
  33. [root@compose pes]# ls web/src/
  34. dist
  35. # 拉取nginx镜像
  36. [root@compose pes]# docker pull nginx
  37. Using default tag: latest
  38. # 执行docker compose命令创建指定容器
  39. [root@compose pes]# docker compose up -d
  40. WARN[0000] /root/pes/docker-compose.yml: `version` is obsolete
  41. [+] Running 1/1
  42. ✔ Container web0 Started                                                  
  43.              0.9s
  44. # 查看容器是否正常创建启动
  45. [root@compose pes]# docker ps
  46. CONTAINER ID   IMAGE         COMMAND                   CREATED            
  47. STATUS             PORTS                               NAMES
  48. 5a007ca2fdbe   nginx:latest   "/docker-entrypoint.…"   About a minute ago  
  49. Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   web0
复制代码

3)使用docker compose一次性创建多台完全一样的容器
  1. # 查看docker-compose的帮助文档
  2. [root@compose ~]# docker-compose --help
  3. scale             Set number of containers for a service
  4. # 查看docker-compose scale的帮助文档
  5. [root@compose ~]# docker-compose scale --help
  6. Usage: scale [options] [SERVICE=NUM...]
  7. # 一次性创建多台相同容器时,不能为容器启相同的名称,映射相同的端口,所以需要在yml文件中将这
  8. 两行注释掉
  9. [root@compose pes]# vim docker-compose.yml
  10. version: "3"
  11. services:
  12.       web:
  13.                #container_name: web0
  14.               image: nginx:latest
  15.                #ports:
  16.                #- "80:80"
  17.               volumes:
  18.                - ./web/src/dist/:/usr/share/nginx/html/
  19.               expose:
  20.                - 80
  21.                restart: "always"
  22. # 使用scale选项创建3台相同的web容器
  23. [root@compose pes]# docker compose up --scale web=3 -d
  24. WARN[0000] /root/pes/docker-compose.yml: `version` is obsolete
  25. [+] Running 3/3
  26. ✔ Container pes-web-3 Started                                            
  27.               0.8s
  28. ✔ Container pes-web-1 Started                                            
  29.               0.5s
  30. ✔ Container pes-web-2 Started                                            
  31.               1.1s
  32. # 查看容器列表
  33. [root@compose ~]# docker ps
  34. CONTAINER ID   IMAGE         COMMAND                   CREATED        
  35. STATUS         PORTS     NAMES
  36. dd63d63e1ced   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29
  37. minutes   80/tcp   pes_web_2
  38. 12edb14dfae7   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29
  39. minutes   80/tcp   pes_web_1
  40. 89fa62180f85   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29
  41. minutes   80/tcp   pes_web_3
  42. # docker-compose暂停集群
  43. [root@compose ~]# cd pes/
  44. [root@compose pes]# docker-compose stop
  45. /usr/lib/python2.7/site-packages/paramiko/transport.py:33:
  46. CryptographyDeprecationWarning: Python 2 is no longer supported by the Python
  47. core team. Support for it is now deprecated in cryptography, and will be
  48. removed in the next release.
  49. from cryptography.hazmat.backends import default_backend
  50. Stopping pes-web-1 ... done
  51. Stopping pes-web-3 ... done
  52. Stopping pes-web-2 ... done
  53. [root@compose pes]# docker ps
  54. CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES
  55. # docker-compose移除集群
  56. [root@compose pes]# docker-compose down
  57. /usr/lib/python2.7/site-packages/paramiko/transport.py:33:
  58. CryptographyDeprecationWarning: Python 2 is no longer supported by the Python
  59. core team. Support for it is now deprecated in cryptography, and will be
  60. removed in the next release.
  61. from cryptography.hazmat.backends import default_backend
  62. Removing pes-web-1 ... done
  63. Removing pes-web-3 ... done
  64. Removing pes-web-2 ... done
  65. Removing network pes_default
  66. [root@compose pes]# docker ps -a
  67. CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表