docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战
一、环境介绍
操作系统:ubuntu22.04
软件环境:docker、docker-compose
二、docker安装
- 版本规定到26.1.3版本过低会引起莫名其妙的问题。
- 打开终端。更新软件包列表:
bash
sudo apt update
- 安装必要的依赖包:
bash
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
- 添加Docker的官方GPG密钥:
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 添加Docker的存储库:
bash
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 更新软件包索引:
bash
sudo apt update
- 安装Docker Engine:
bash
sudo apt install docker-ce docker-ce-cli containerd.io
- 启动Docker服务:
bash
sudo systemctl start docker
- 验证Docker是否安装成功:
bash
docker --version

- 下载官方发布的二进制文件来安装Docker Compose:
bash
sudo apt-get update
sudo apt-get install docker.io
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 下载完成后,给二进制文件添加执行权限:
bash
sudo chmod +x /usr/local/bin/docker-compose
- 验证Docker Compose是否已正确安装:
bash
docker-compose --version

- 如果需要非root用户也能运行Docker命令,可以将用户添加到docker组:
bash
sudo usermod -aG docker ${USER}
- 添加国内镜像源
bash
sudo nano /etc/docker/daemon.json
内容为
bash
{
"registry-mirrors": [
"https://dockerproxy.cn",
"https://0vmzj3q6.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://mirror.baidubce.com",
"https://dockerproxy.com",
"https://mirror.iscas.ac.cn",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru",
"https://vlgh0kqj.mirror.aliyuncs.com"
]
}
bash
sudo systemctl daemon-reload
sudo systemctl restart docker
三、中间件安装
(1)nginx
bash
docker pull nginx
bash
docker run \
-p 80:80 -p 8081:8081 -p 8082:8082 -p 8083:8083 \
--name nginx \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/nginx/log:/var/log/nginx \
-v /var/Web:/var/Web \
-d nginx
先建个空的nginx容器,把docker容器里面的配置,按照内网映射关系,把配置文件考到容器外部对应的目录下。然后再删除容器,重写按照上面的命令建。
-p 80:80 -p 8081:8081 -p 8082:8082 -p 8083:8083 \ 端口转发容器内外要一一对应。如果配置文件配置了,但是容器创建的时候 -p没有配置,转发会失效。
/var/Web 目录是前端代码部署位置。
(2)mysql8
bash
docker pull mysql:8.0.17
先建立一个空的容器,用于把容器内部的配置文件考出来。
bash
docker run -p 3306:3306 --name=mysql \
-e MYSQL_ROOT_PASSWORD=nasen \
-d --privileged=true --restart=unless-stopped mysql:8.0.17
bash
# 修改配置文件权限
chmod 644 /data/mysql/conf/my.cnf
# 创建目标目录
mkdir -p /data/mysql/conf/
# 假设容器名称为 mysql
docker cp mysql:/etc/mysql/my.cnf /data/mysql/conf/
chmod 644 /data/mysql/conf/my.cnf
docker stop mysql
docker rm mysql
下面命令是未持久化的,数据都存在容器里面。
bash
docker run -p 3306:3306 --name=mysql \
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=nasen \
-d --privileged=true --restart=unless-stopped mysql:8.0.17
持久化的命令如下:
bash
docker run -p 3306:3306 --name=mysql \
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/mysql-files/:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=nasen \
-d --privileged=true --restart=unless-stopped mysql:8.0.17
(3)minio文件系统
bash
docker pull minio/minio
bash
docker run --network=host --name minio -p 9000:9000 -p9090:9090 -d \
--restart=always \
-e MINIO_ROOT_USER=nasen \
-e MINIO_ROOT_PASSWORD=nasen \
-v /etc/ssl/certs:/etc/ssl/certs:ro \
-v /data/minio/data1:/data1 \
-v /data/minio/data2:/data2 \
-v /data/minio/config:/root/.minio minio/minio server --address ':9000' --console-address ':9090' /data{1...2}

(4)onlyoffice
bash
docker pull onlyoffice/documentserver
bash
sudo docker run -i -t -d -p 9098:80 --restart=always --name document-office \
-v /data/onlyoffice/DocumentServer/logs:/var/log/onlyofffice \
-v /data/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Daata \
-v /data/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice \
-v /data/onlyoffice/DocumentServer/db:/var/lib/postgrescl -e JWT_SECRET=7cb43b633b6f11f0a0b1c21651ae7097 onlyoffice/documentserver:latest

(5) rabbitmq
bash
docker pull rabbitmq:3-management
bash
docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 -v /home/rabbitmq:/var/www/rabbitMQ -e RABBITMQ_DEFAULT_USER=document -e RABBITMQ_DEFAULT_PASS=nasen rabbitmq:3-management
(6) redis
bash
docker pull redis:7.2.4
bash
docker run --restart=always --name redis -p 6379:6379 -d redis:7.2.4 redis-server --requirepass nasen --protected-mode no --appendonly yes
(7)nacos
bash
docker pull nacos/nacos-server:v2.2.3
bash
vim /data/nacos/conf/application.properties
bash
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
#db.num=${MYSQL_DATABASE_NUM:1}
#db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
#db.user.0=${MYSQL_SERVICE_USER}
#db.password.0=${MYSQL_SERVICE_PASSWORD}
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user.0=root
db.password.0=nasen
### The auth system to use, currently only 'nacos' and 'ldap' is supporteda:
nacos.core.auth.enabled=true
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:example}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:example}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
上面的配置文件修改数据库配置
bash
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
db.user.0=root
db.password.0=nasen
bash
docker run -d --name nacos -p 18848:8848 -p 19848:9848 \
-e MODE=standalone \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e ACOS_AUTH_ENABLE=true \
-v /data/nacos/logs:/home/nacos/logs \
-v /data/nacos/conf/application.properties:/home/nacos/conf/application.properties \
-v /data/nacos/data/:/home/nacos/data \
nacos/nacos-server:v2.2.3

(8)elasticsearch
bash
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.14.0
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "ELASTICSEARCH_USERNAME=nasen" \
-e "ELASTICSEARCH_PASSWORD=nasen" \
docker.elastic.co/elasticsearch/elasticsearch:7.14.0
(9)seata
第一步MySQL建数据库seata
bash
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
`lock_key` CHAR(20) NOT NULL,
`lock_value` VARCHAR(20) NOT NULL,
`expire` BIGINT,
primary key (`lock_key`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
第二步编辑配置文件
bash
vim /data/seata/config/resources/application.yml
编辑如下内容:
bash
# Copyright 1999-2019 Seata.io Group.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: ${log.home:${user.home}/logs/seata}
extend:
logstash-appender:
destination: 127.0.0.1:4560
kafka-appender:
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstash
console:
user:
username: seata
password: seata
seata:
config:
type: nacos
nacos:
server-addr: 127.0.0.1:18848
namespace:
group: SEATA_GROUP
username: nacos
password: nacos
context-path:
data-id: seataServer.properties
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:18848
group: SEATA_GROUP
namespace:
cluster: default
username: nacos
password: nacos
store:
# support: file 、 db 、 redis
mode: file
# server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login
第三步创建容器
bash
docker pull seataio/seata-server:1.7.1
bash
docker run -d --name seata-server --network=host -p 8091:8091 -e SEATA_CONFIG_NAME=file:/root/seata-config/registry -e SEATA_IP=127.0.0.1 seataio/seata-server:1.7.1
把容器外部的配置复制到容器内部
bash
docker cp /data/seata/config/resources/application.yml seata-server:/seata-server/resources/application.yml
bash
docker restart seata-server #重启容器重写加载配置
docker logs seata-server

日志如上则启动成功。

进入nacos看到seata注册到注册中心上!
第四步骤在nacos上追加seata的配置
进入到nacos后台,nacos nacos
bash
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicodee=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=nasen
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
第六步重启nacos
bash
docker restart nacos
bash
docker logs nacos

重启seata-server无报错算成功
bash
docker restart seata-server #重启容器重写加载配置
无报错算成功
再次登录nacos后台查看
部署成功!seata部署过程确实有点绕,大家按步骤走即可。先装nacos再部署seata!最后还得注册到nacos上,再加上数据库配置。