docker-compose部署Java常用工具

一、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是否打开
在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是一个双子座的程序猿吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值