当前位置: 首页 > news >正文

培训第四十一天(docker-compose一键部署项目,haproxy容器代理多个web或java容器)

 # 创建脚本,可以在java环境中运行任何的jar包或者war包#!/bin/bash/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目录

 docker run -itd -p3306:3306 -v /root/pes/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.44

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)下载基础镜像
 [root@docker ~]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED        SIZEnginx        latest    5ef79149e0ec   2 weeks ago    188MBmysql        5.7.44    5107333e08a8   8 months ago   501MBcentos       latest    5d0da3dc9764   2 years ago    231MB
2)创建nginx:v0镜像
 [root@docker project_exam_system]# tree web/web/├── dist│?? ├── assets│?? │?? ├── AdminView-yX0Ltz_1.js│?? │?? ├── CategoryView-Ca4t3JNT.js│?? │?? ├── CityView-0ESlUfo8.css│?? │?? ├── CityView-BJTl06GN.js......│   ├── TeacherView-Cogr4CCq.js│   │   ├── TopicView-DFXgxSyC.js│   │   └── TopicView-Is6fJS__.css│   ├── favicon.ico│   └── index.html└── Dockerfile[root@docker web]# docker build -t nginx:v0 .[+] Building 0.2s (7/7) FINISHED                                                docker:default[root@docker ~]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED         SIZEnginx        v0        13ccc573fe05   9 seconds ago   189MB
3)创建java:v0镜像
 [root@docker project_exam_system]# tree javajava├── application.properties├── Dockerfile├── java.sh├── jdk│   ├── bin│   │   ├── jar│   │   ├── jarsigner│   │   ├── java│   │   ├── javac......│   │       ├── rmiregistry.1│   │       └── serialver.1│   ├── README│   └── release├── jdk-17_linux-x64_bin.tar.gz└── Project_ExamSystem-V1.0.0.war[root@docker java]# docker build -t java:v0 .[+] Building 7.2s (9/9) FINISHED                                                docker:default[root@docker java]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED          SIZEjava         v0        7fae85c42cbe   36 seconds ago   591MB
4)创建mysql:v0镜像
 [root@docker project_exam_system]# tree mysql/mysql/├── Dockerfile└── project_exam_system.sql0 directories, 2 files[root@docker mysql]# docker build -t mysql:v0 .[+] Building 0.3s (7/7) FINISHED                                                docker:default[root@docker mysql]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED          SIZEmysql        v0        258d8ed442ac   16 seconds ago   512MB
5)启动nginx容器
 [root@docker ~]# docker run -itd -p80:80 nginx:v0
6)启动java容器
 [root@docker ~]# docker run -itd --name java -p8080:8080 java:v0
7)启动mysql容器
 [root@docker ~]# docker run -itd --name mysql -p3306:3306 mysql:v0 
8)查看容器状态
 [root@docker ~]# docker psCONTAINER ID   IMAGE            COMMAND                   CREATED             STATUS             PORTS                                                  NAMES79cc8614e967   mysql:v0         "docker-entrypoint.s…"   9 seconds ago       Up 6 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql29d3ce68ceca   java:v0          "/usr/local/jdk/bin/…"   36 seconds ago      Up 34 seconds      0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              javafed2633b259b   haproxy:latest   "docker-entrypoint.s…"   12 minutes ago      Up 11 minutes      0.0.0.0:5000->5000/tcp, :::5000->5000/tcp              wizardly_edison# 之后这些容器可以全部直接删除[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到。

 # 端口不能映射80,并指定名称[root@docker ~]# docker run -itd --name web0 nginx:v0 45d83cda5bef619b937d25e581db31401841b955f9367dbffbc79a236e632612[root@docker ~]# docker run -itd --name web1 nginx:v0 b9c80deb9f08a4c2327c1784c8fdb3ab8044c48160ee29102f27e2b52495b9f4[root@docker ~]# docker run -itd --name web2 nginx:v0 5fbd082f529cdab21b3a2eb74ae6d9560c694fe2a5368e1ad63affe1ad1c93e8# 查看容器状态[root@docker ~]# docker ps CONTAINER ID   IMAGE      COMMAND                   CREATED          STATUS          PORTS     NAMES5fbd082f529c   nginx:v0   "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds    80/tcp    web2b9c80deb9f08   nginx:v0   "/docker-entrypoint.…"   8 seconds ago    Up 6 seconds    80/tcp    web145d83cda5bef   nginx:v0   "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   80/tcp    web0
2)haproxy容器外部测试

在宿主机上安装了haproxy,编辑配置文件,代理三个nginx容器中的web服务,是直接添加容器的ip地址

 # 安装haproxy[root@docker ~]# yum -y install haproxy# 查看三个nginx容器的IP地址[root@docker ~]# docker inspect 45 | grep IPA"SecondaryIPAddresses": null,"IPAddress": "172.17.0.2","IPAMConfig": null,"IPAddress": "172.17.0.2",[root@docker ~]# docker inspect b9 | grep IPA"SecondaryIPAddresses": null,"IPAddress": "172.17.0.3","IPAMConfig": null,"IPAddress": "172.17.0.3",[root@docker ~]# docker inspect 5f | grep IPA"SecondaryIPAddresses": null,"IPAddress": "172.17.0.4","IPAMConfig": null,"IPAddress": "172.17.0.4",# 修改配置文件[root@docker ~]# vim /etc/haproxy/haproxy.cfg# 注释静态资源# use_backend static          if url_static# 修改轮询模块backend appbalance     roundrobinserver  app1 172.17.0.2:80 checkserver  app2 172.17.0.3:80 checkserver  app3 172.17.0.4:80 check# 启动服务[root@docker ~]# haproxy -f /etc/haproxy/haproxy.cfg [root@docker ~]# netstat -lntup | grep 5000tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      1985/haproxy # 测试访问过后可以直接删除进程来停止服务[root@docker ~]# kill -9 1985(进程号)[root@docker ~]# netstat -lntup | grep 5000

3)创建haproxy容器

创建一个haproxy容器,将配置文件导入到容器,在容器中启动haproxy,也是可以的

 # 拉取haprxy镜像[root@docker ~]# docker pull haproxy[root@docker ~]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED        SIZEhaproxy      latest    4e5bebb0fd91   7 weeks ago    103MB# 该haproxy.cfg文件是在官方网站里下载下来的[root@docker ~]# vim haproxy.cfg # 只修改web的轮询模块即可,默认是5000端口,也可修改listen proxy-webbind 0.0.0.0:5000......server web0 172.17.0.2:80 check weight 1 maxconn 2000server web1 172.17.0.3:80 check weight 1 maxconn 2000server web2 172.17.0.4:80 check weight 1 maxconn 2000[root@docker ~]# docker run -itd -p5000:5000 haproxy:latest /bin/bashfed2633b259b96d3c0ed5e9ca51c031c36b1e21361cb3cf9d57b9d49a9ea1710[root@docker ~]# docker cp haproxy.cfg fed:/usr/local/etc/haproxySuccessfully copied 5.12kB to fed:/usr/local/etc/haproxy[root@docker ~]# docker attach fedhaproxy@fed2633b259b:~$ ls /usr/local/etc/haproxy/haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg# 启动服务haproxy@fed2633b259b:~$ haproxy -f /usr/local/etc/haproxy/haproxy.cfg 

4)使用haproxy容器调用web容器
 # -itd 交互 终端  后台# link 锚定web容器# v 将配置文件挂载到容器中[root@docker ~]# docker run -itd --link web0 --link web1 --link web2 -p5000:5000 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest65466d3aef2566512b63690c02e4497ddb7594b8268a26136ec040e2cb858b3b[root@docker ~]# docker psCONTAINER ID   IMAGE            COMMAND                   CREATED         STATUS         PORTS                                                  NAMES65466d3aef25   haproxy:latest   "docker-entrypoint.s…"   6 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp              romantic_curie79cc8614e967   mysql:v0         "docker-entrypoint.s…"   2 hours ago     Up 2 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql29d3ce68ceca   java:v0          "/usr/local/jdk/bin/…"   3 hours ago     Up 3 hours     0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              java5fbd082f529c   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp                                                 web2b9c80deb9f08   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp                                                 web145d83cda5bef   nginx:v0         "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp                                                 web0# 删除该haproxy容器(使用的是ip地址,要改为使用域名才可以进行link)[root@docker ~]# docker rm -f 65

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

6)使用haproxy容器调用java容器
 [root@docker ~]# docker run -itd --name java0 java:v0283c87bcaea166b017160aa84ce5424dd9baf3ec8fd168a1406f7dc11be3e694[root@docker ~]# docker run -itd --name java1 java:v0e851f31c87f39c2d028e42b36bd77bcf818a8eb97c9a6cc002656fd1501c0ea6[root@docker ~]# docker run -itd --name java2 java:v0fb94c87c4fa87d08b0d621157aa33ed74ca459beb32a3c950a7703227ab2f031[root@docker ~]# vim haproxy.cfg # 复制一份proxy-web的模块,修改为java模块listen proxy-java# 修改端口为8080bind 0.0.0.0:8080mode http# 负载均衡算法# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobinbalance roundrobin# 日志格式option tcplog# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;#option mysql-check user haproxy# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效# 修改域名为java域名,端口为java端口server java0 java0:8080 check weight 1 maxconn 2000server java1 java1:8080 check weight 1 maxconn 2000server java2 java2:8080 check weight 1 maxconn 2000#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000# 使用keepalive检测死链# option tcpka[root@docker ~]# docker run -itd --link web0 --link web1 --link web2 --link java0 --link java1 --link java2 -p8080:8080 -p5000:5000 -p8888:8888 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:lateste5ea894c0f30988604cfd6fe5a48b9a69f14c2c3f2e373fe775c0554f37f19db

 # 下载http-tools,使用ab测试承载量[root@docker ~]# yum -y install http-tools[root@docker ~]# ab -n 100 -c 10 http://10.0.0.7:5000/

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

新机子:

1)docker-compose环境准备
 # 配置docker环境source docker.shscp 10.0.0.7:/etc/docker/daemon.json /etc/docker/daemon.jsonvim /etc/docker/daemon.json {       "registry-mirrors" : ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"]}  systemctl start docker# 安装pip(python包管理器)yum -y install python2-pip# 升级pippip install --upgrade pip==20.3  -i https://mirrors.aliyun.com/pypi/simple# 安装docker-compose[root@compose ~]# pip install docker-compose --ignore-installed requests -i https://mirrors.aliyun.com/pypi/simple
2)使用compose构建自动化部署文件
 # 创建项目目录[root@compose ~]# mkdir -p pes/{java,mysql,web}[root@compose ~]# tree pes/pes/├── java├── mysql└── web3 directories, 0 files[root@compose ~]# cd pes# 在项目目录中创建docker-compoce.yml文件[root@compose pes]# vim docker-compose.ymlversion: "3"services:web:container_name: web0image: nginx:latestports:- "80:80"volumes:- ./web/src/dist/:/usr/share/nginx/html/expose:- 80restart: "always"#        mysql:#                container_name: mysql0#                image: mysql:5.7.44#        java:#                container_name: java0#                image: java:v0[root@compose pes]# mkdir -p web/src/[root@compose pes]# scp -r 10.0.0.7:/root/project_exam_system/web/dist web/src/[root@compose pes]# ls web/src/dist# 拉取nginx镜像[root@compose pes]# docker pull nginxUsing default tag: latest# 执行docker compose命令创建指定容器[root@compose pes]# docker compose up -dWARN[0000] /root/pes/docker-compose.yml: `version` is obsolete [+] Running 1/1✔ Container web0  Started                                                                0.9s # 查看容器是否正常创建启动[root@compose pes]# docker psCONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS              PORTS                               NAMES5a007ca2fdbe   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   web0

3)使用docker compose一次性创建多台完全一样的容器
# 查看docker-compose的帮助文档
[root@compose ~]# docker-compose --help
scale              Set number of containers for a service
# 查看docker-compose scale的帮助文档
[root@compose ~]# docker-compose scale --help
Usage: scale [options] [SERVICE=NUM...]
# 一次性创建多台相同容器时,不能为容器启相同的名称,映射相同的端口,所以需要在yml文件中将这两行注释掉
[root@compose pes]# vim docker-compose.yml 
version: "3"
services:web:#container_name: web0image: nginx:latest#ports:#- "80:80"volumes:- ./web/src/dist/:/usr/share/nginx/html/expose:- 80restart: "always"
# 使用scale选项创建3台相同的web容器
[root@compose pes]# docker compose up --scale web=3 -d
WARN[0000] /root/pes/docker-compose.yml: `version` is obsolete 
[+] Running 3/3✔ Container pes-web-3  Started                                                           0.8s ✔ Container pes-web-1  Started                                                           0.5s ✔ Container pes-web-2  Started                                                           1.1s
# 查看容器列表
[root@compose ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS     NAMES
dd63d63e1ced   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29 minutes   80/tcp    pes_web_2
12edb14dfae7   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29 minutes   80/tcp    pes_web_1
89fa62180f85   nginx:latest   "/docker-entrypoint.…"   29 minutes ago   Up 29 minutes   80/tcp    pes_web_3
# docker-compose暂停集群
[root@compose ~]# cd pes/
[root@compose pes]# docker-compose stop
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backend
Stopping pes-web-1 ... done
Stopping pes-web-3 ... done
Stopping pes-web-2 ... done
[root@compose pes]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# docker-compose移除集群
[root@compose pes]# docker-compose down
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backend
Removing pes-web-1 ... done
Removing pes-web-3 ... done
Removing pes-web-2 ... done
Removing network pes_default
[root@compose pes]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

相关文章:

  • mysql学习教程,从入门到精通,MySQL数据类型基础教程(4)
  • 若依框架(前后端分离)增加手机号验证码登录
  • SpringBoot项目集成支付宝
  • VS-E5PH3006L-N3 600V 30A 高效低损耗整流器 二极管 电动 / 混动汽车电池充电的可靠之选
  • 【Python】3.基础语法(3)函数
  • 【每日刷题】Day106
  • GoF 代理模式
  • 什么是 AWS CloudWatch?
  • Day54 | Floyd 算法 A * 算法
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • 第四章 Java核心类库 第四节 异常处理
  • 重头开始嵌入式第三十天(Linux系统编程 ip头)
  • 骨灵冷火!Solon Cloud Gateway 照面发布
  • rabbitmq高可用集群搭建
  • 【软件测试专栏】软件测试 — 用例篇
  • 【译】JS基础算法脚本:字符串结尾
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • javascript 哈希表
  • js算法-归并排序(merge_sort)
  • JS学习笔记——闭包
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Netty源码解析1-Buffer
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 机器学习 vs. 深度学习
  • 力扣(LeetCode)357
  • 学习ES6 变量的解构赋值
  • 一起参Ember.js讨论、问答社区。
  • 正则表达式
  • 阿里云重庆大学大数据训练营落地分享
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​queue --- 一个同步的队列类​
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (9)目标检测_SSD的原理
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (pojstep1.3.1)1017(构造法模拟)
  • (rabbitmq的高级特性)消息可靠性
  • (windows2012共享文件夹和防火墙设置
  • (排序详解之 堆排序)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (数据结构)顺序表的定义
  • (算法二)滑动窗口
  • (原创)可支持最大高度的NestedScrollView
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转) ns2/nam与nam实现相关的文件
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Unity3DUnity3D在android下调试
  • . NET自动找可写目录
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NetCore项目nginx发布
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net中ListT 泛型转成DataTable、DataSet
  • :class的用法及应用