day41(考试项目前端容器的高可用+java容器的高可用+使用docker-compose部署考试前端容器+使用docker-compose一次性创建多台容器)

# 创建脚本,可以在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 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镜像

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镜像

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)查看容器状态

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

1)先创建三个前端项目(nginx容器)

        容器在不映射端口时,在远程是无法访问nginx服务,而且现在也不希望外部直接访问nginx,希望 创建nginx服务的集群,这个集群被haproxy代理,创建3个nginx容器,创建一个haproxy服务器,而且 nginx容器还需要指定名称,web0、web1、web2。因为如果没有名称,那么容器就无法被haproxy link到。

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容器

5)调用haproxy的监控界面(并改ip轮询为域名轮询)

​​​​​​​

6)使用haproxy容器调用java容器

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

新机子:

1)docker-compose环境准备

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一次性创建多台完全一样的容器

# 查看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: web0
               image: nginx:latest
                #ports:
                #- "80:80"
               volumes:
                - ./web/src/dist/:/usr/share/nginx/html/
               expose:
                - 80
                restart: "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
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值