一、docke-compose部署MySQL
1、拉取MySQL镜像
docker pull mysql:8.0.18
2、创建挂载目录
mkdir -p /home/docker/mysql8/log
mkdir -p /home/docker/mysql8/data
mkdir -p /home/docker/mysql8/conf.d
3、添加my.cnf配置文件(可选)
根据自身情况进行配置,如没有需要可以跳过该步骤
vim /home/docker/mysql8/conf.d/my.cnf
# [client]配置
[client]
# 设置MySQL客户端默认字符集utf8mb4
default-character-set=utf8mb4
# 指定了MySQL服务器使用的Unix套接字文件路径
socket=/var/lib/mysql/mysql.sock
#[mysql]配置
[mysql]
# 设置MySQL客户端默认字符集utf8mb4
default-character-set=utf8mb4
# 指定了MySQL服务器使用的Unix套接字文件路径
socket=/var/lib/mysql/mysql.sock
#[mysqld]配置
[mysqld]
port=3306 # 端口号
user=root # 用户名
# 设置sql模式 sql_mode模式引起的分组查询出现*this is incompatible with sql_mode=only_full_group_by,这里最好剔除ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id = 1
# MySQL8 的密码认证插件 如果不设置低版本navicat无法连接
default_authentication_plugin=mysql_native_password
# 禁用符号链接以防止各种安全风险
symbolic-links=0
# 允许最大连接数
max_connections=1000
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=0
max_allowed_packet=16M
# 设置时区
default-time_zone='+8:00'
4、编写docker-compose.yml文件
进入docker-compose目录,编写docker-compose.yml文件
cd /usr/local/bin/
vim docker-compose.yml
version: '3'
services:
mysql: # 服务名称
image: mysql:8.0.18 # mysql版本
container_name: mysql8 # 容器名称
environment:
- MYSQL_ROOT_PASSWORD=123456 # root用户密码
# - TZ=Asia/Shanghai # 设置容器时区,下面挂载方式同步的宿主机时区和时间了,这里忽略
volumes:
- /home/docker/mysql8/log:/var/log/mysql # 映射日志目录,宿主机:容器
- /home/docker/mysql8/data:/var/lib/mysql # 映射数据目录,宿主机:容器
- /home/docker/mysql8/conf.d:/etc/mysql/conf.d # 映射配置目录,宿主机:容器
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro(read only),表示只读。
ports:
- 3306:3306 # 指定宿主机端口与容器端口映射关系,宿主机:容器
restart: always # 表示容器随docker启动自启
5、启动容器
docker-compose -f docker-compose.yml up -d
6、查看容器启动情况
查看容器启动情况
docker ps
7、连接客户端测试
执行下面命令,使用交互式命令进入容器,使用MySQL自带客户端连接工具连接,也可以使用dbeaver或者navicat等客户端连接工具连接测试
docker exec -it 容器ID /bin/bash
- 使用MySQL自带客户端连接工具连接
mysql -h127.0.0.1 -uroot -p123456
- 使用dbeaver客户端连接工具远程连接
如果远程连接失败,查看下防火墙有没有开放3306端口,或者使用的比如阿里云、腾讯云等服务器有没有开放3306端口
#检测防火墙状态 active (running),就是运行状态
systemctl status firewalld
# 停止防火墙
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld
二、docker-compose部署Redis
1、创建配置、数据。日志目录
我这里统一放在了我自己的docker目录下,和mysql8一起,大家可以自行选择
mkdir -p redis/{config,data,logs}
2、创建日志文件
touch redis/logs/redis.log
3、进入配置目录,创建redis.conf配置文件
touch redis.conf
将下面的配置内容添加至新创建的配置文件中
#redis.conf
# 关闭保护模式,允许远程连接
protected-mode no
tcp-backlog 511
tcp-keepalive 300
daemonize yes
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile "6379.log"
databases 16
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
rdb-del-sync-files no
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
requirepass "123456789"
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4kb
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
save 3600 1
save 300 100
save 60 10000
4、编写docker-compose.yml文件
我这里是MySQL和Redis放在了一个docker-compose文件,如何使单独的,把MySQL的部分换成Redis的部分就可以了
version: '3'
services:
redis: # 服务名称
image: "redis:latest" # redis镜像版本
container_name: redis # 容器名称
restart: always # 容器开机自启
privileged: true # 获取宿主机root权限
ports:
- 6379:6379 # 指定宿主机端口与容器端口映射关系,宿主机:容器
volumes:
- /etc/docker/redis/config/redis.conf:/etc/redis/redis.conf:rw # 映射配置文件目录,宿主机:容器
- /etc/docker/redis/data:/data:rw # 映射数据目录,宿主机:容器
- /etc/docker/redis/logs:/logs:rw # 映射日志目录,宿主机:容器
command:
# 执行的命令
redis-server /etc/redis/redis.conf # 指定配置文件启动redis-server进程
mysql: # 服务名称
image: mysql:8.0.18 # 或其它mysql版本
container_name: mysql8 # 容器名称
environment:
- MYSQL_ROOT_PASSWORD=123456 # root用户密码
# - TZ=Asia/Shanghai # 设置容器时区 我这里通过下面挂载方式同步的宿主机时区和时间了,这里忽略
volumes:
- /etc/docker/mysql8/log:/var/log/mysql # 映射日志目录,宿主机:容器
- /etc/docker/mysql8/data:/var/lib/mysql # 映射数据目录,宿主机:容器
- /etc/docker/mysql8/conf.d:/etc/mysql/conf.d # 映射配置目录,宿主机:容器
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
ports:
- 3306:3306 # 指定宿主机端口与容器端口映射关系,宿主机:容器
restart: always # 容器随docker启动自启
# docker-compose.yml
5、启动容器
docker-compose -f docker-compose.yml up -d
6、查询容器启动情况
docker ps
可以看到Redis已经启动成功了
7、可以使用Redis的客户端连接工具进行测试连接
需要注意的是我这里是在第三步中redis.conf配置文件中配置了密码的
如使用redis客户端没有连接成功,检查服务器,比如阿里云,是否开放了6379端口(或者是自己定义的端口)
三、docker-compose部署RocketMQ
1、拉取RocketMQ镜像
镜像地址:https://hub.docker.com/r/apache/rocketmq/tags
docker pull apache/rocketmq:5.1.0
2、拉取RocketMQ控制台镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
3、创建NameServer需要挂载的文件
目录可以按自己安排
# 日志目录
mkdir /etc/docker/rocketmq/nameserver/logs -p
# 脚本目录
mkdir /etc/docker/rocketmq/nameserver/bin -p
这里需要设置权限:如果不设置会导致NameServer容器内部无法写日志文件
# 777 文件所属者、文件所属组和其他人有读取 & 写入 & 执行全部权限
chmod 777 -R /etc/docker/rocketmq/nameserver/*
创建挂载文件
NameServer启动脚本中有一个自动计算最大堆内存和新生代内存的函数会导致在不同硬件环境下设置最大堆内存和新生代内存环境变量不被应用,这里先提前copy一份容器内部启动脚本做挂载,如果想自定义内存也可以自己调整。
1.启动容器
docker run -d --privileged=true --name rmqnamesrv apache/rocketmq:5.1.0 sh mqnamesrv
2.复制容器内启动脚本到挂载目录/etc/docker/rocketmq/nameserver/bin
docker cp rmqnamesrv:/home/rocketmq/rocketmq-5.1.0/bin/runserver.sh /etc/docker/rocketmq/nameserver/bin/runserver.sh
3.修改runserver.sh
vim /etc/docker/rocketmq/nameserver/bin/runserver.sh
注释掉调用calculate_heap_sizes函数的位置并保存,拉到脚本最底部就能看到
4.停止并删除容器
docker stop rmqnamesrv
docker rm rmqnamesrv
4、创建Broker需要挂载的文件夹和文件
# 创建需要的挂载目录用于挂载容器内部数据、配置文件、以及日志
mkdir /etc/docker/rocketmq/broker/logs -p
mkdir /etc/docker/rocketmq/broker/data -p
mkdir /etc/docker/rocketmq/broker/conf -p
mkdir /etc/docker/rocketmq/broker/bin -p
chmod 777 -R /etc/docker/rocketmq/broker/*
在/etc/docker/rocketmq/broker/conf创建broker.conf文件,通过这个文件把RocketMQ的broker管理起来
vim /etc/docker/rocketmq/broker/conf/broker.conf
添加如下内容到配置文件
# 集群名称 单机配置可以随意填写,如果是集群部署在同一个集群中集群名称必须一致类似Nacos的命名空间
brokerClusterName = DefaultCluster
# broker节点名称 单机配置可以随意填写,如果是集群部署在同一个集群中节点名称不要重复
brokerName = broker-a
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0
brokerId = 0
# Broker服务地址 String 内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP1 = 101.132.155.185
# Broker 对外服务的监听端口 默认值10911
# 端口(注意:broker启动后,会占用3个端口,分别在listenPort基础上-2,+1,供内部程序使用,所以集群一定要规划好端口,避免冲突)
listenPort=10911
# Broker角色 默认值ASYNC_MASTER
# ASYNC_MASTER 异步复制Master,只要主写成功就会响应客户端成功,如果主宕机可能会出现小部分数据丢失
# SYNC_MASTER 同步双写Master,主和从节点都要写成功才会响应客户端成功,主宕机也不会出现数据丢失
brokerRole = ASYNC_MASTER
# 刷盘方式 SYNC_FLUSH(同步刷新)相比于ASYNC_FLUSH(异步处理)会损失很多性能,但是也更可靠,所以需要根据实际的业务场景做好权衡,默认值ASYNC_FLUSH
flushDiskType = ASYNC_FLUSH
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 72
# 消息大小 单位字节 默认1024 * 1024 * 4
maxMessageSize=4194304
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数,默认值4
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# 失败重试时间,默认重试16次进入死信队列,第一次1s第二次5s以此类推。
# 延时队列时间等级默认18个,可以设置多个比如在后面添加一个1d(一天),使用的时候直接用对应时间等级即可,从1开始到18,如果添加了第19个直接使用等级19即可
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
# 指定TM在20秒内应将最终确认状态发送给TC,否则引发消息回查。默认为60秒
transactionTimeout=20
# 指定最多回查5次,超过后将丢弃消息并记录错误日志。默认15次。
transactionCheckMax=5
# 指定设置的多次消息回查的时间间隔为10秒。默认为60秒。
transactionCheckInterval=10
拷贝容器内Broker启动脚本到宿主机
Broker启动脚本中有一个自动计算最大堆内存和新生代内存的函数会导致在不同硬件环境下设置最大堆内存和新生代内存环境变量不被应用,,这里先提前copy一份容器内部启动脚本做挂载,如果想自定义内存可以自己调整。
1.启动容器
docker run -d --name rmqbroker --privileged=true apache/rocketmq:5.1.0 sh mqbroker
2.复制容器内启动脚本到挂载目录/etc/docker/rocketmq/nameserver/bin
docker cp rmqbroker:/home/rocketmq/rocketmq-5.1.0/bin/runbroker.sh /etc/docker/rocketmq/broker/bin/runbroker.sh
3.修改runbroker.sh
vim /etc/docker/rocketmq/broker/bin/runbroker.sh
注释掉调用calculate_heap_sizes函数的位置并保存,拉到脚本最底部就能看到
4.停止并删除容器
docker stop rmqbroker
docker rm rmqbroker
7、编写docker-compose文件
我这里已经创建了docker-compose.yml文件,且已经配置了MySQL和Redis,根据自身情况配置docker-compose文件
vim docker-compose.yml
配置如下内容:(我这里是追加文件内容,如果是RocketMQ一个服务,需要打开前面注释部分)
#version: '3.8'
#services:
rmqnamesrv: # 服务名称
image: apache/rocketmq:5.1.0 # 版本
container_name: rmqnamesrv # 容器名称
ports:
- 9876:9876 # 指定宿主机端口与容器端口映射关系,宿主机:容器
restart: always # 容器开机自启
privileged: true # 获取宿主机root权限
volumes:
- /etc/docker/rocketmq/nameserver/logs:/home/rocketmq/logs # 映射日志文件目录,宿主机:容器
- /etc/docker/rocketmq/nameserver/bin/runserver.sh:/home/rocketmq/rocketmq-5.1.0/bin/runserver.sh # 运行脚本文件
environment:
- MAX_HEAP_SIZE=256M
- HEAP_NEWSIZE=128M
command: ["sh","mqnamesrv"] # 容器启动时执行的命令
broker: # RocketMQ 的 Broker 部分
image: apache/rocketmq:5.1.0 # 版本
container_name: rmqbroker # 容器名称
ports:
- 10909:10909 # 指定宿主机端口与容器端口映射关系,宿主机:容器
- 10911:10911
restart: always # 容器开机自启
privileged: true # 获取宿主机root权限
volumes:
- /etc/docker/rocketmq/broker/logs:/home/rocketmq/logs # 映射日志文件目录,宿主机:容器
- /etc/docker/rocketmq/broker/store:/home/rocketmq/logs
- /etc/docker/rocketmq/broker/conf/broker.conf:/home/rocketmq/broker.conf # 映射配置文件目录,宿主机:容器
- /etc/docker/rocketmq/broker/bin/runbroker.sh:/home/rocketmq/rocketmq-5.1.0/bin/runbroker.sh # 运行脚本文件
depends_on:
- 'rmqnamesrv' # 指定依赖关系
environment:
- NAMESRV_ADDR=rmqnamesrv:9876 # 指定宿主机端口与容器端口映射关系,宿主机:容器
- MAX_HEAP_SIZE=512M
- HEAP_NEWSIZE=256M
command: ["sh","mqbroker","-c","/home/rocketmq/broker.conf"] # 容器启动时执行的命令
rmqdashboard:
image: apacherocketmq/rocketmq-dashboard:latest # RocketMQ控制台版本
container_name: rocketmq-dashboard # 容器名称
ports:
- 8080:8080 # 指定宿主机端口与容器端口映射关系,宿主机:容器
restart: always # 容器开机自启
privileged: true # 获取宿主机root权限
depends_on:
- 'rmqnamesrv' # 指定依赖关系
environment:
- JAVA_OPTS= -Xmx256M -Xms256M -Xmn128M -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false # 环境变量
8、启动服务
docker-compose -f docker-compose.yml up -d
可以看到都启动成功了!
9、连接测试
访问http://ip:8080,如果访问不成功检查服务器端口8080是否打开