docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战
docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战
一、环境介绍
操作系统:ubuntu22.04
软件环境:docker、docker-compose
二、docker安装
- 版本规定到26.1.3版本过低会引起莫名其妙的问题。
- 打开终端。更新软件包列表:
sudo apt update
- 安装必要的依赖包:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
- 添加Docker的官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 添加Docker的存储库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 更新软件包索引:
sudo apt update
- 安装Docker Engine:
sudo apt install docker-ce docker-ce-cli containerd.io
- 启动Docker服务:
sudo systemctl start docker
- 验证Docker是否安装成功:
docker --version
- 下载官方发布的二进制文件来安装Docker Compose:
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
- 下载完成后,给二进制文件添加执行权限:
sudo chmod +x /usr/local/bin/docker-compose
- 验证Docker Compose是否已正确安装:
docker-compose --version
- 如果需要非root用户也能运行Docker命令,可以将用户添加到docker组:
sudo usermod -aG docker ${USER}
- 添加国内镜像源
sudo nano /etc/docker/daemon.json
内容为
{"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"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
三、中间件安装
(1)nginx
docker pull nginx
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
docker pull mysql:8.0.17
先建立一个空的容器,用于把容器内部的配置文件考出来。
docker run -p 3306:3306 --name=mysql \
-e MYSQL_ROOT_PASSWORD=nasen \
-d --privileged=true --restart=unless-stopped mysql:8.0.17
# 修改配置文件权限
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.cnfdocker stop mysql
docker rm mysql
下面命令是未持久化的,数据都存在容器里面。
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
持久化的命令如下:
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文件系统
docker pull minio/minio
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
docker pull onlyoffice/documentserver
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
docker pull rabbitmq:3-management
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
docker pull redis:7.2.4
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
docker pull nacos/nacos-server:v2.2.3
vim /data/nacos/conf/application.properties
# 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
上面的配置文件修改数据库配置
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
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
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
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 = InnoDBDEFAULT 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 = InnoDBDEFAULT 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 = InnoDBDEFAULT 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 = InnoDBDEFAULT 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);
第二步编辑配置文件
vim /data/seata/config/resources/application.yml
编辑如下内容:
# 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: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata
seata:config:type: nacosnacos:server-addr: 127.0.0.1:18848namespace:group: SEATA_GROUPusername: nacospassword: nacoscontext-path:data-id: seataServer.propertiesregistry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:18848group: SEATA_GROUPnamespace:cluster: defaultusername: nacospassword: nacosstore:# support: file 、 db 、 redismode: file
# server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login
第三步创建容器
docker pull seataio/seata-server:1.7.1
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
把容器外部的配置复制到容器内部
docker cp /data/seata/config/resources/application.yml seata-server:/seata-server/resources/application.yml
docker restart seata-server #重启容器重写加载配置
docker logs seata-server
日志如上则启动成功。
进入nacos看到seata注册到注册中心上!
第四步骤在nacos上追加seata的配置
进入到nacos后台,nacos nacos
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
docker restart nacos
docker logs nacos
重启seata-server无报错算成功
docker restart seata-server #重启容器重写加载配置
无报错算成功
再次登录nacos后台查看
部署成功!seata部署过程确实有点绕,大家按步骤走即可。先装nacos再部署seata!最后还得注册到nacos上,再加上数据库配置。