docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战

一、环境介绍

操作系统:ubuntu22.04
软件环境:docker、docker-compose


二、docker安装

  1. 版本规定到26.1.3版本过低会引起莫名其妙的问题。
  2. 打开终端。更新软件包列表:
bash 复制代码
sudo apt update
  1. 安装必要的依赖包:
bash 复制代码
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  1. 添加Docker的官方GPG密钥:
bash 复制代码
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 添加Docker的存储库:
bash 复制代码
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 更新软件包索引:
bash 复制代码
sudo apt update
  1. 安装Docker Engine:
bash 复制代码
sudo apt install docker-ce docker-ce-cli containerd.io
  1. 启动Docker服务:
bash 复制代码
sudo systemctl start docker
  1. 验证Docker是否安装成功:
bash 复制代码
docker --version
  1. 下载官方发布的二进制文件来安装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
  1. 下载完成后,给二进制文件添加执行权限:
bash 复制代码
sudo chmod +x /usr/local/bin/docker-compose
  1. 验证Docker Compose是否已正确安装:
bash 复制代码
docker-compose --version
  1. 如果需要非root用户也能运行Docker命令,可以将用户添加到docker组:
bash 复制代码
sudo usermod -aG docker ${USER}
  1. 添加国内镜像源
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上,再加上数据库配置。

相关推荐
R-sz24 分钟前
redis缓存工具类【当缓存未命中时,自动调用数据加载函数从数据库获取数据并存入Redis】
redis·spring·缓存
hunjinYang29 分钟前
缓存常见问题:缓存穿透、缓存雪崩以及缓存击穿
redis·缓存
熙曦Sakura1 小时前
【MySQL】C语言连接
c语言·mysql·adb
乖乖der2 小时前
python同步mysql数据
开发语言·python·mysql
liyongjie2 小时前
openEuler安装MySql8(tar包模式)
mysql
极客智谷2 小时前
缓存架构方案:Caffeine + Redis 双层缓存架构深度解析
redis·缓存·架构
mqiqe2 小时前
vue发版html 生成打包到docker镜像进行发版
vue.js·docker·html
深栈3 小时前
MySQL进阶篇(存储引擎、索引、视图、SQL性能优化、存储过程、触发器、锁)
sql·mysql·性能优化
foundbug9993 小时前
docker运行centos提示Operation not permitted
docker·容器·centos
睡觉z3 小时前
MySQL数据库初体验
数据库·mysql·oracle