docker-compose启动前后端分离集群项目

🌟ansible批量部署docker

  • 1️⃣创建roles目录结构
mkdir -p docker/{files,templates,tasks,handlers}

  • 2️⃣在group_vars/all/main.yml中定义变量列表
  • 3️⃣在tasks目录下编写tasks任务
- name: 1.删除 runc命令
  file:
    path: /usr/local/bin/runc
    state: absent

- name: 2.创建docker目录
  file:
    path: /etc/docker/
    state: directory

- name: 3.分发docker部署文件
  copy:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
  loop:
    - { src: docker-27.0.3.tgz,dest: /tmp/ }
    - { src: docker-compose,dest: /tmp/ }
    - { src: docker.service,dest: /usr/lib/systemd/system/ }
    - { src: daemon.json,dest: /etc/docker/ }

- name: 4.解压docker安装包
  unarchive:
    src: /tmp/docker-27.0.3.tgz
    dest: /tmp/
    owner: root
    group: root
    mode: '0755'
    remote_src: yes

- name: 5.docker命令和docker-compose命令移动到bin目录下
  copy:
    src: "{{ item }}"
    dest: /bin/
    owner: root
    group: root
    mode: '0755'
    remote_src: yes
  loop:
    - /tmp/docker/
    - /tmp/docker-compose

- name: 6.加载配置文件
  systemd:
    daemon_reload: yes

- name: 7.重启服务
  systemd:
    name: docker
    state: restarted
  • 4️⃣在files目录下准备部署文件
    • docker-27.0.3.tgz
    • daemon.json
    • docker.service
    • docker-compose
  • 5️⃣在templates目录下创建j2模板文件
  • 6️⃣在handlers目录下编写handlers
  • 7️⃣在roles目录下编写主playbook
- hosts: all
  roles:
    - docker
  • 8️⃣运行主playbook
ansible-playbook top.yml

  • 9️⃣检查验证
ansible all -m shell -a 'docker --version'
ansible all -m shell -a 'docker-compose --version'

🌟docker-compose启动数据库(db02)

📁准备部署文件

  • xzs-mysql.sql

📝书写Dockerfile

FROM mysql:8.0-debian
LABEL author=zhu desc="exam db"

ENV MYSQL_ROOT_PASSWORD="1"
ENV MYSQL_DATABASE=exam
ENV MYSQL_USER=exam
ENV MYSQL_PASSWORD="1"

ADD xzs-mysql.sql /docker-entrypoint-initdb.d/

📝书写docker-compose

services:
  exam_db:
    image: "web:exam_db"
    build:
      context: .
      dockerfile: Dockerfile
    container_name: exam_db_v1
    ports:
      - 3306:3306
      - 33060:33060
    restart: always

💡docker-compose生成镜像

docker-compose build

🚀docker-compose启动镜像

docker-compose up -d

🔍检查验证

docker exec -it exam_db_v1 mysql -uexam -p1

🌟docker-compose启动jar(web03/web04)

📁准备部署文件

  • xzs-3.9.0.jar(后端代码)
  • application-prod.yml(后端配置文件)
#server后端服务的配置
server:
  port: 8000
  undertow:
    io-threads: 16
    worker-threads: 4000
    buffer-size: 1024
    direct-buffers: true
  compression:
    enabled: true
    min-response-size: 1
#日志
logging:
  path: /app/code/exam/backend/

#数据库,redis等等配置
spring:
  datasource:
    #mysql://数据库地址:端口号/库名字?
    url: jdbc:mysql://172.16.1.52:3306/exam?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true
    username: exam
    password: 1
    driver-class-name: com.mysql.cj.jdbc.Driver

  • entry.sh(入口命令,需要执行权限)
#!/bin/bash
##############################################################
# File Name:entry.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar

📝书写Dockerfile

FROM ubuntu:22.04
LABEL author=zhu desc="exam_ubuntu images"

ENV VER=3.9.0
ENV ENVIR=prod
ENV CONF=application-${ENVIR}.yml
ENV CODE=xzs-${VER}.jar
ENV DIR /app/code/exam/backend/

RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openjdk-11-jdk curl
RUN mkdir -p ${DIR}
WORKDIR ${DIR}

ADD ${CONF} .
ADD ${CODE} .
ADD entry.sh .

EXPOSE 8000

CMD ["./entry.sh"]

HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl http://127.0.0.1:8000

📝书写docker-compose

services:
  exam:
    image: "web:exam_backend"
    build:
      context: .
      dockerfile: Dockerfile
    container_name: exam_v1
    ports:
      - 8000:8000
    restart: always

💡docker-compose生成镜像

docker-compose build

🚀docker-compose启动镜像

docker-compose up -d

🔍检查验证

http://10.0.0.9:8000/student
http://10.0.0.10:8000/student

http://10.0.0.9:8000/admin
http://10.0.0.10:8000/admin

🌟接入4层负载均衡(lb01/lb02)

🍀负载均衡配置

1.修改yum源
vim /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

2.安装nginx
yum -y install nginx

3.检查是否支持4层负载均衡
nginx -V |& grep stream
--with-stream

3.修改nginx配置文件
vim /etc/nginx/nginx.conf
stream {
    upstream exam_pools {
        server 10.0.0.9:8000;
        server 10.0.0.10:8000;
        hash $remote_addr consistent;
    }
    log_format basic '$remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time';

    access_log /var/log/nginx-l4.log basic;
    server {
        listen 8000;
        proxy_pass exam_pools;
    }
}

4.重启nginx
nginx -t
systemctl enable nginx --now
systemctl reload nginx

5.检查
ss -lntup | grep 8000

🌟docker-compose启动前端(web01/web02)

📁准备部署文件

  • exam-web.tar.gz

📝书写Dockerfile

FROM ubuntu:22.04
LABEL author=zhu desc="zrlog_ubuntu images"

ENV CODE_NAME=exam-web.tar.gz
ENV CODE_DIR=/app/code/exam/front/
ENV CONF=exam.conf

RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g'   /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx curl

RUN mkdir -p ${CODE_DIR}
ADD ${CODE_NAME} ${CODE_DIR}
ADD ${CONF} /etc/nginx/conf.d/

EXPOSE 80 443

CMD ["nginx","-g","daemon off;"]

# 监控业务是否正常
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl http://127.0.0.1:80

📝书写docker-compose

services:
  exam_front:
    image: "web:exam_front"
    build:
      context: .
      dockerfile: Dockerfile
    container_name: exam_front_v1
    ports:
      - 80:80
    restart: always

💡docker-compose生成镜像

docker-compose build

🚀docker-compose启动镜像

docker-compose up -d

🔍检查验证

http://student.zhubl.xyz/ 学生端 student 123456
http://admin.zhubl.xyz/   管理端 admin   123456

🌟接入7层负载均衡

1.修改yum源
vim /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

2.安装nginx
yum -y install nginx

3.修改nginx配置文件
vim /etc/nginx/conf.d/exam.conf
upstream l7_pools {
  server 10.0.0.7:80;
  server 10.0.0.8:80;
  hash $remote_addr consistent;
}
server {
  listen 80;
  server_name admin.zhubl.xyz;
  location / {
    proxy_pass http://l7_pools;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-Ip $remote_addr;
  }
}
server {
  listen 80;
  server_name student.zhubl.xyz;
  location / {
    proxy_pass http://l7_pools;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-Ip $remote_addr;
  }
}

4.重启nginx
nginx -t
systemctl enable nginx --now
systemctl reload nginx

🌟接入高可用(lb01)

1.安装keepalived
yum -y install keepalived

2.备份配置文件
cp /etc/keepalived/keepalived.conf{,.bak}

3.修改配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
   router_id lb01  
}
vrrp_script check_lb.sh {   
   script /server/scripts/check_lb.sh
   interval 2
   weight  1
   user root 
}

vrrp_instance vip_3 {    
    state MASTER    
    interface ens33
    virtual_router_id 51 
    priority 100    
    advert_int 1        
    authentication {   
        auth_type PASS
        auth_pass 1111  
    }
    virtual_ipaddress { 
        10.0.0.3 dev ens33 label ens33:1
    }
    track_script  {
      check_lb.sh 
    }
}

vrrp_instance vip_4 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4 dev ens33 label ens33:2
    }
}

4.编写脚本
vim /server/scripts/check_lb.sh
#1.vars
count=`ps -ef | grep nginx | wc -l`

#2.stop keepalived
if [ ${count} -eq 1