- # 创建脚本,可以在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目录
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 images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest 5ef79149e0ec 2 weeks ago 188MB
- mysql 5.7.44 5107333e08a8 8 months ago 501MB
- centos 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 images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx v0 13ccc573fe05 9 seconds ago 189MB
复制代码 3)创建java:v0镜像
- [root@docker project_exam_system]# tree java
- java
- ├── 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 images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- java v0 7fae85c42cbe 36 seconds ago 591MB
复制代码 4)创建mysql:v0镜像
- [root@docker project_exam_system]# tree mysql/
- mysql/
- ├── Dockerfile
- └── project_exam_system.sql
- 0 directories, 2 files
- [root@docker mysql]# docker build -t mysql:v0 .
- [+] Building 0.3s (7/7) FINISHED
- docker:default
- [root@docker mysql]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- mysql 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 ps
- CONTAINER ID IMAGE COMMAND CREATED
- STATUS PORTS
- NAMES
- 79cc8614e967 mysql:v0 "docker-entrypoint.s…" 9 seconds ago
- Up 6 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
- mysql
- 29d3ce68ceca java:v0 "/usr/local/jdk/bin/…" 36 seconds ago
- Up 34 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp java
- fed2633b259b 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 NAMES
- 5fbd082f529c nginx:v0 "/docker-entrypoint.…" 4 seconds ago Up 3
- seconds 80/tcp web2
- b9c80deb9f08 nginx:v0 "/docker-entrypoint.…" 8 seconds ago Up 6
- seconds 80/tcp web1
- 45d83cda5bef 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 app
- balance roundrobin
- server app1 172.17.0.2:80 check
- server app2 172.17.0.3:80 check
- server app3 172.17.0.4:80 check
- # 启动服务
- [root@docker ~]# haproxy -f /etc/haproxy/haproxy.cfg
- [root@docker ~]# netstat -lntup | grep 5000
- tcp 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 images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- haproxy latest 4e5bebb0fd91 7 weeks ago 103MB
- # 该haproxy.cfg文件是在官方网站里下载下来的
- [root@docker ~]# vim haproxy.cfg
- # 只修改web的轮询模块即可,默认是5000端口,也可修改
- listen proxy-web
- bind 0.0.0.0:5000
- ......
- server web0 172.17.0.2:80 check weight 1 maxconn 2000
- server web1 172.17.0.3:80 check weight 1 maxconn 2000
- server web2 172.17.0.4:80 check weight 1 maxconn 2000
- [root@docker ~]# docker run -itd -p5000:5000 haproxy:latest /bin/bash
- fed2633b259b96d3c0ed5e9ca51c031c36b1e21361cb3cf9d57b9d49a9ea1710
- [root@docker ~]# docker cp haproxy.cfg fed:/usr/local/etc/haproxy
- Successfully copied 5.12kB to fed:/usr/local/etc/haproxy
- [root@docker ~]# docker attach fed
- haproxy@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:latest
- 65466d3aef2566512b63690c02e4497ddb7594b8268a26136ec040e2cb858b3b
- [root@docker ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED
- STATUS PORTS NAMES
- 65466d3aef25 haproxy:latest "docker-entrypoint.s…" 6 seconds ago Up 4
- seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp
- romantic_curie
- 79cc8614e967 mysql:v0 "docker-entrypoint.s…" 2 hours ago Up 2
- hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
- 29d3ce68ceca java:v0 "/usr/local/jdk/bin/…" 3 hours ago Up 3
- hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp java
- 5fbd082f529c nginx:v0 "/docker-entrypoint.…" 4 hours ago Up 4
- hours 80/tcp web2
- b9c80deb9f08 nginx:v0 "/docker-entrypoint.…" 4 hours ago Up 4
- hours 80/tcp web1
- 45d83cda5bef 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:8888
- mode http
- # URI相对地址
- stats uri /dbs
- # 统计报告格式
- stats realm Global\ statistics
- # 登录账户信息
- stats auth admin:123456
- [root@docker ~]# vim haproxy.cfg
- server web0 web0:80 check weight 1 maxconn 2000
- server web1 web1:80 check weight 1 maxconn 2000
- server 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:v0
- 283c87bcaea166b017160aa84ce5424dd9baf3ec8fd168a1406f7dc11be3e694
- [root@docker ~]# docker run -itd --name java1 java:v0
- e851f31c87f39c2d028e42b36bd77bcf818a8eb97c9a6cc002656fd1501c0ea6
- [root@docker ~]# docker run -itd --name java2 java:v0
- fb94c87c4fa87d08b0d621157aa33ed74ca459beb32a3c950a7703227ab2f031
- [root@docker ~]# vim haproxy.cfg
- # 复制一份proxy-web的模块,修改为java模块
- listen proxy-java
- # 修改端口为8080
- 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 权重其实没有生效
- # 修改域名为java域名,端口为java端口
- server java0 java0:8080 check weight 1 maxconn 2000
- server java1 java1:8080 check weight 1 maxconn 2000
- server 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:latest
- e5ea894c0f30988604cfd6fe5a48b9a69f14c2c3f2e373fe775c0554f37f19db
复制代码
- # 下载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.sh
- scp 10.0.0.7:/etc/docker/daemon.json /etc/docker/daemon.json
- vim /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
- # 升级pip
- pip 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
- └── web
- 3 directories, 0 files
- [root@compose ~]# cd pes
- # 在项目目录中创建docker-compoce.yml文件
- [root@compose pes]# vim docker-compose.yml
- version: "3"
- services:
- web:
- container_name: web0
- image: nginx:latest
- ports:
- - "80:80"
- volumes:
- - ./web/src/dist/:/usr/share/nginx/html/
- expose:
- - 80
- restart: "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 nginx
- Using default tag: latest
- # 执行docker compose命令创建指定容器
- [root@compose pes]# docker compose up -d
- WARN[0000] /root/pes/docker-compose.yml: `version` is obsolete
- [+] Running 1/1
- ✔ Container web0 Started
- 0.9s
- # 查看容器是否正常创建启动
- [root@compose pes]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED
- STATUS PORTS NAMES
- 5a007ca2fdbe 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一次性创建多台完全一样的容器
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |