docker compose简介

Docker Compose 是 Docker 官方推出的工具,用于定义和运行多容器 Docker 应用。通过单个 YAML 文件(通常命名为 docker-compose.yml),可以配置应用的服务、网络和卷,一键启动或停止整个应用栈,无需逐个操作容器。
Docker Compose 是管理多容器应用的必备工具,通过 YAML 配置简化部署流程,尤其适合开发和测试环境。对于生产环境,可结合 Kubernetes 等更强大的编排工具。

yaml文件编辑规范

•第一:YAML是一种标记性语言,类似于json数据描述语言,可读性高; 
•第二:YAML数据结构通过缩进来表示,连续项目通过减号表示,键值对用冒号分隔,数组使用中括号[]括起来,bash用花括号{}括起来; 
•第三:不支持制表符TAB缩进,只能使用空格缩进;
•第四:字符后缩进一个空格(如冒号、逗号、横杠后须加空格);
•第五:使用#号表示注释;
•第六:如果包含特殊字符用单引号' ' 标记为普通字符,用双引号表示特殊字符本身的意思,布尔值必须使用双引号" "括起来;
•第七:YAML 区分大小写;

docker compose yaml文件指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version:指定此yml文件基于的compose的版本
services:指定创建容器的服务选项
#服务名:例如nginx等
network: 网络服务创建
volume: 数据卷服务创建
hostname:容器主机名
build :指定构建镜像上下文路径
context:上下文路径
dockerfile:指定构建镜像的 Dockerfile 文件名
ports:暴露容器端口,与-p相同,但端口不能低于60;例如:- 1234:80
networks:加入顶级networks下配置的网络
deploy:指定部署和运行服务相关配置,只能在Swarm模式使用
volumes:挂载宿主机路径或命令卷
image:指定容器运行的镜像
command:执行命令,覆盖默认命令
container_name:指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale(扩展)
environment:添加环境变量
restart:重启策略,重启策略是no,always,no-failure,unless-stoped
no,默认策略,在容器退出时不重启容器。
on-failure,在容器非正常退出时(退出状态非0),才会重启容器。可加(:3) 规定重启次数
always,在容器退出时总是重启容器。
unless-stopped,在容器退出时总是重启容器
networks:配置网络,指定网卡设备等

compose命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.创建和启动服务
docker compose up

#2.删除和停止服务
docker compose down

#3.服务启动/停止/重启
docker compose start/stop/restart

#4.指定启动数量
docker compose up --scale master=2 --scale slave=2

#5.查看日志
docker compose logs [ -f 容器名称 --tail =50 ]

mysql主从部署

  • binlog 日志:主库记录所有数据修改操作,作为主从同步的数据源。
  • undo 日志:记录事务执行前的数据状态,用于回滚和多版本并发控制。
  • redo 日志:记录事务已提交的修改,确保崩溃后数据可恢复。
  • relay 日志:从库临时存储主库 binlog 内容,供 SQL 线程读取执行。

docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
version: '2.27'
services:
mysql_m:
image: mysql:5.7
container_name: mysql_m
hostname: mysql_m
ports:
- 3336:3306
networks:
- mysql_net
volumes:
- ./my_m.conf:/etc/mysql/conf.d/my.cnf
- mysql_m_volume:/var/lib/mysql
- mysql_m_volume:/var/log/mysql
environment:
- MYSQL_ROOT_PASSWORD=root

mysql_s:
image: mysql:5.7
container_name: mysql_s
hostname: mysql_s
ports:
- 3337:3306
networks:
- mysql_net
volumes:
- ./my_s.conf:/etc/mysql/conf.d/my.cnf
- mysql_s_volume:/var/lib/mysql
- mysql_s_volume:/var/log/mysql
environment:
- MYSQL_ROOT_PASSWORD=root

networks:
mysql_net:
driver: bridge
name: mysql_net
ipam:
driver: default
config:
- subnet: 192.168.100.0/24
gateway: 192.168.100.1
volumes:
mysql_m_volume:
name: mysql_m_volume
mysql_s_volume:
name: mysql_s_volume

修改主服务配置文件:my_m.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[mysqld]
#主服务器唯一ID
server_id=1
#启用二进制日志
log-bin=mysql-bin
#上面两行最重要,下面的可以不配置# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库 需要复制的主数据库名字
binlog-do-db=test
#设置logbin格式 Row、Statement、Mixed
binlog_format=STATEMENT
# Disabling symbolic-links is recommended to prevent assorted security risks 关闭配置外存储
symbolic-links=0

修改从服务配置文件:my_s.conf

1
2
3
4
5
6
[mysqld]
server-id=2
relay-log=relay-bin #启用二进制日志
log-bin=mysql-bin #上面两行最重要,下面的可以不配置# 设置不要复制的数据库(可设置多个)
# read_only=1 #从服务器只读
slave-skip-errors= 1032,1062,1007,1050 #忽略报错

执行验证

1
2
3
4
5
6
7
8
9
10
cd mysql_service/
docker compose up -d

# 进入主机容器
docker exec -it mysql_m bash
# 登录mysql
mysql -uroot -proot

show master status;
# 出现以下内容说明my_m.conf、my_s.conf配置单已生效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 创建一个账号(用户名:worker 密码:root)
create user 'worker'@'%' identified by 'root';
# 给权限
grant replication slave,replication client on *.* to 'worker'@'%';
# 建库
create database test;

# 需要在执行以下配置前再查看一下状态(会变)
show master status;

# 新开一个终端窗口进入从机容器
docker exec -it mysql_s bash
# 登录mysql
mysql -uroot -proot

#5.登录从服务器配置执行
CHANGE MASTER TO MASTER_HOST='mysql_m',
MASTER_USER='worker',
MASTER_PASSWORD='root',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=778;

#起服务
start slave;
#查看状态
show slave status\G;

#从机建库不会同步,需要先手动建库
create database test;

#在主机test库中键一张表
use test;
create table test (id int);
show tables;

#在从机中验证,会同步创建该表
use test;
show tables;

#若之前同步失败,修正后可用以下命令重新同步
stop slave;
reset master;
start slave;

#查看状态
show slave status\G;

Linux根目录扩容

第一步:先关机
第二步:添加硬盘-SCSI-创建新虚拟磁盘-设置需要添加的磁盘大小(写作最大磁盘大小)(10G)(存储为单个文件)-下一步-完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看当前磁盘占用情况
df -lh
# 查看新增物理磁盘盘符
ls /dev/sd*
# 查看新增物理情况磁盘
fdisk -l

# 第三步:创建物理卷
pvcreate /dev/sdb #sdb为上一步中新增的盘符,按实际情况设置

# 查看根目录所在卷组名称
vgdisplay #vgs
pvdisplay #pvs
lvdisplay #lvs

# 第四步:使用新增物理卷扩容根目录卷组
vgextend centos /dev/sdb
# 第五步:扩容根目录所在逻辑卷大小(按照G扩容)
lvextend -L +10G /dev/centos/root
lvextend -l +2559 /dev/centos/root #若以上不行则执行这条,2559为上报错信息
# 第六步:重新读取根目录逻辑卷信息
xfs_growfs /dev/mapper/centos-root

# 查看扩容后 磁盘占用
df -lh
# 查看磁盘挂载
lsblk