🌟ansible批量部署docker
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
ansible-playbook top.yml

ansible all -m shell -a 'docker --version'
ansible all -m shell -a 'docker-compose --version'

🌟docker-compose启动数据库(db02)
📁准备部署文件
📝书写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:
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/
spring:
datasource:
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
#!/bin/bash
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)
📁准备部署文件
📝书写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
count=`ps -ef | grep nginx | wc -l`
if [ ${count} -eq 1