centos用yum安装docker
# 1、yum 包更新到最新
yum update# 2、安装需要的软件包
yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce# 5、 查看docker版本,验证是否验证成功
docker -v# 6开启Docker服务
service docker start # 7docker 开机自启
systemctl enable docker# 8更换Docker源
编辑这个文件
vim /etc/docker/daemon.json配置docker下载加速地址
{
"registry-mirrors": ["https://17o3zxc0.mirror.aliyuncs.com"]
}:重启服务
systemctl daemon-reload
systemctl restart docker# 6丶自动启动
docker update redis --restart=alwaysDocker常用命令
Docker常见报错
changing ownership of '/var/lib/mysql/': Permission denied
-在docker run中加入 --privileged=true 给容器加上特定权限
Docker-Nacos
拉取镜像
:1.4.2mysql中创建对应数据库和表
执行sql脚本
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* 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.
*/
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(64) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL,
`group_id` varchar(128) NOT NULL,
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL,
`md5` varchar(32) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_user` text,
`src_ip` varchar(50) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY,
`password` varchar(500) NOT NULL,
`enabled` boolean NOT NULL
);
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL,
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL,
`resource` varchar(255) NOT NULL,
`action` varchar(8) NOT NULL,
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');创建本机映射目录
mkdir -p \
/usr/local/docker/nacos/conf \
/usr/local/docker/nacos/logs \
/usr/local/docker/nacos/data启动容器复制文件
4.1启动容器
docker run \
--name nacos \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-p 8848:8848 \
-d nacos/nacos-server:1.4.24.2复制文件
docker cp nacos:/home/nacos/conf/ /usr/local/docker/nacos/conf注意:复制文件后,在/root/nacos/目录下会有文件生成,
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.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.url.1=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=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.default.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:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## 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需要关注application.properties文件,里面有很多变量,需要在后面容器启动的时候设置相关的变量。
4.3删除临时容器
docker stop nacos && docker rm nacos重新启动容器
docker run \
--env MODE=standalone \
--env SPRING_DATASOURCE_PLATFORM=mysql \
--env MYSQL_SERVICE_HOST=192.168.31.10 \
--env MYSQL_SERVICE_PORT=3306 \
--env MYSQL_SERVICE_USER=root \
--env MYSQL_SERVICE_PASSWORD=123456 \
--env MYSQL_SERVICE_DB_NAME=nacos_config \
--name nacos \
-d -p 8848:8848 \
-v /usr/local/docker/nacos/conf:/opt/docker/nacos/conf \
-v /usr/local/docker/nacos/logs:/opt/docker/nacos/logs \
-v /usr/local/docker/nacos/data:/opt/docker/nacos/data \
--restart always nacos/nacos-server:latestCommon property configuration
Docker-MySQL
拉取官方MySQL镜像
根据实际业务需求拉取版本docker hub
docker pull mysql:8.0
docker images新建配置文件
mkdir -p \
/usr/local/docker/mysql/data \
/usr/local/docker/mysql/logs \
/usr/local/docker/mysql/confcd /usr/local/docker/mysql/conf
vim mysqld.cnf[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
lower_case_table_names=1
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
max_connections = 1000创建并配置启动容器
docker run --name mysql --restart=always \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-d mysql:x.x
参数说明
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d:将配置文件夹挂载到主机
-v /usr/local/docker/mysql/logs:/var/log/mysql:将日志文件夹挂载到主机
-v /usr/local/docker/mysql/data:/var/lib/mysql:将数据文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
#可能会有目录挂载配置问题。https://blog.csdn.net/qq_45564783/article/details/126440171开启远程访问
MySQL8.0
docker exec -it mysql bash
mysql -uroot -p147258;
use mysql;
#create user 'root'@'%' identified by '147258';
grant all on *.* to 'root'@'%'; --赋予root用户权限
alter user 'root'@'%' identified with mysql_native_password by '147258';
flush privileges;MySQL5.7
docker exec -it mysql bash;
mysql -uroot -p147258;
use mysql;
grant all privileges on *.* to 'root'@'%' identified by '147258' with grant option;
flush privileges;Docker-MySQL Cluster
master
新建配置文件
mkdir -p \
/usr/local/docker/mysql5.7-cluster/master/data \
/usr/local/docker/mysql5.7-cluster/master/logs \
/usr/local/docker/mysql5.7-cluster/master/conf创建临时容器拷贝配置文件
docker run -d \
-p 3310:3306 \
--name mysqltmp \
-e MYSQL_ROOT_PASSWORD=123 \
mysql:5.7
docker exec -it mysqltmp bash
mysql -uroot -p
# Enter password:
# mysql> show variables like '%datadir%';
show variables like '%datadir%';
# 拷贝容器配置文件
docker cp mysqltmp:/etc/mysql/conf.d /usr/local/docker/mysql5.7-cluster/master/conf
# 删除临时容器
docker rm -f mysqltmp编辑配置文件
touch my.cnf
vim /usr/local/docker/mysql5.7-cluster/master/conf/my.cnf简洁版
[mysqld]
server_id=101
binlog-ignore-db=mysql
log-bin=master-bin
binlog_cache_size=1M
binlog_format=mixed
binlog_expire_logs_seconds=604800
slave_skip_errors=1062完整版
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
lower_case_table_names=1
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
max_connections = 1000
## 设置server_id,同一局域网中需要唯一
server-id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=master-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
binlog_expire_logs_seconds=604800
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062启动运行
docker run --name mysql5.7-master \
-v /usr/local/docker/mysql5.7-cluster/master/logs:/var/log/mysql \
-v /usr/local/docker/mysql5.7-cluster/master/data:/var/lib/mysql \
-v /usr/local/docker/mysql5.7-cluster/master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3307:3306 \
-d mysql:5.7
参数说明
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-v /usr/local/docker/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
-v /usr/local/docker/mysql/logs:/var/log/mysql:将日志文件夹挂载到主机
-v /usr/local/docker/mysql/data:/var/lib/mysql:将数据文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '147258';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';slave
新建配置文件
mkdir -p \
/usr/local/docker/mysql5.7-cluster/slave1/data \
/usr/local/docker/mysql5.7-cluster/slave1/logs \
/usr/local/docker/mysql5.7-cluster/slave1/conf编辑配置文件
🔔
复制配置文件并编辑 参考master
简洁版
[mysqld]
server_id=102
binlog-ignore-db=mysql
log-bin=slave1-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
log_slave_updates=1
read_only=1
relay_log=mysql-relay-bin[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
lower_case_table_names=1
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
max_connections = 1000
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1启动运行
docker run --name mysql5.7-slave1 \
-v /usr/local/docker/mysql5.7-cluster/slave1/logs:/var/log/mysql \
-v /usr/local/docker/mysql5.7-cluster/slave1/data:/var/lib/mysql \
-v /usr/local/docker/mysql5.7-cluster/slave1/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3308:3306 \
-d mysql:5.7
参数说明
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-v /usr/local/docker/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
-v /usr/local/docker/mysql/logs:/var/log/mysql:将日志文件夹挂载到主机
-v /usr/local/docker/mysql/data:/var/lib/mysql:将数据文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码主从同步配置
show variables like '%log_bin%'; // 查看是否开启binlogshow master status;#配置主从
change master to master_host='192.168.31.128',master_user='slave',master_password='123456',master_port=3307,master_log_file='master-bin.000001',master_log_pos=154,master_connect_retry=30;
start slave;
#解释
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。Doker-Portainer
拉取镜像
docker pull portainer/portainer启动
docker run -d -p 9000:9000 --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime:ro \
--name portainer portainer/portainerDocker-MongoDB
拉取
docker pull mongo:4.0.3创建容器
docker create --name mongodb \
--restart=always -p 27017:27017 \
-v /usr/local/docker/mongodb:/data/db \
mongo:4.0.3启动容器
docker start mongodbDocker-Redis
下载镜像
docker pull redis创建目录
#创建配置目录
mkdir -p \
/usr/local/docker/redis/conf \
/usr/local/docker/redis/data
touch /usr/local/docker/redis/conf/redis.conf#创建配置文件持久化配置
vi /usr/local/docker/redis/conf/redis.conf
appendonly yes#添加创建实例并启动
docker run -p 6379:6379 --restart=always \
--name redis \
-v /usr/local/docker/redis/data:/data \
-v /usr/local/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--requirepass 147258连接
docker exec -it redis redis-cliDocker-Redis Cluster
Redis-master
创建目录及文件
#创建配置目录
mkdir -p \
/usr/local/docker/redis-cluster/master/conf \
/usr/local/docker/redis-cluster/master/data \
/usr/local/docker/redis-cluster/master/conf
touch /usr/local/docker/redis-cluster/master/conf/redis.conf#创建配置文件编辑配置文件
vim /usr/local/docker/redis-cluster/master/conf/redis.conf简单配置文件
save 3600 1
save 300 100
save 60 10000
cluster-enabled yes
# 用从节点来aof备份
appendonly no
# 关闭保护模式
protected-mode no
# 让redis服务后台运行
daemonize no
appendfsync everysec
auto-aof-rewrite-min-size 10M
auto-aof-rewrite-percentage 100
# 注服务器设置的密码
# requirepass 123456
logfile "/var/log/redis/redis.log"完整配置文件
#注释掉bind 127.0.0.1,使redis可以外部访问
bind 0.0.0.0
# 端口号
port 6381
#给redis设置密码
#requirepass red
##redis持久化 默认是no
appendonly yes
#开启protected-mode保护模式,需配置bind ip或者设置访问密码
#关闭protected-mode模式,此时外部网络可以直接访问
protected-mode no
#是否开启集群
#cluster-enabled no
#集群的配置文件,该文件自动生成
#cluster-config-file nodes.conf
#集群的超时时间
#cluster-node-timeout 5000
#用守护线程的方式启动
daemonize no
#防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
tcp-keepalive 300
#设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
timeout 0
tcp-backlog 511
supervised no
pidfile "/var/run/redis_6379.pid"
#日志级别 (debug,verbose, notice, 和warning。生产环境下一般开启notice)
loglevel notice
#redis生成的日志(docker容器内的目录,不是宿主机的目录)
logfile "/data/redis-s2.log"
#默认数据库数量
databases 16
always-show-logo yes
# RDB持久化策略(默认开启)
#900秒后 有一个key变化就持久话
#300秒后 有10个key变化就持久话
#60秒后 有10000个key变化就持久话
save 900 1
save 300 10
save 60 10000
#yes : RDB快照保存失败后 客户端不可想redis写入,只可读
#no : 禁用此功能
stop-writes-on-bgsave-error yes
# 保存 .rdb持久化文件时 是否使用LZF压缩 yes开启 no关闭
rdbcompression yes
#是否检查rdb快照的完整性,损失大概 百分之十 的性能
rdbchecksum yes
#rdb持久化生成的默认文件名
dbfilename "dump.rdb"
#在未启用持久性的情况下删除复制使用的 RDB 文件。
#默认情况下,此选项被禁用,但是在某些环境中,出于法规或其他安全考虑,
#RDB 文件应由 master 持久保存在磁盘上以提供副本,或由副本存储在磁盘上以加载它们以进行初始同步。
#尽快删除。请注意,此选项仅适用于同时禁用 AOF 和 RDB 持久性的实例,否则将被完全忽略。
#获得相同效果的另一种(有时是更好的)方法是在主实例和副本实例上使用无盘复制。然而,在副本的情况下,无盘并不总是一种选择。
rdb-del-sync-files no
#redis的工作目录(持久化文件和日志生成后保存的目录)
dir "/data"
#redis节点用来通信使用的ip和端口
replica-announce-ip 127.0.0.1
replica-announce-port 6379
#当副本失去与主服务器的连接时,或者当复制仍在进行中时,副本可以以两种不同的方式进行操作:
#1)如果副本服务陈旧数据设置为“是”(默认值)副本仍然会回复客户端请求,可能带有过期数据,或者如果这是第一次同步,数据集可能只是空的。
#2) 如果replica-serve-stale-data 设置为'no',则replica 将对所有类型的命令回复错误“SYNC with master in progress”,
#但对INFO、replicaOF、AUTH、PING、SHUTDOWN、REPLCONF、角色、配置、订阅、取消订阅、订阅、取消订阅、发布、发布订阅、命令、发布、主机:和延迟。
replica-serve-stale-data yes
#您可以配置副本实例以接受或不接受写入。
#就是主从复制中,slave节点是否可以写入数据(yes:不能写入;no:可以写入)
replica-read-only yes
#当使用无盘复制时,master 在开始传输之前等待一段可配置的时间(以秒为单位),
#希望多个副本到达并且传输可以并行化。对于慢速磁盘和快速(大带宽)网络,无盘复制效果更好。
repl-diskless-sync no
#启用无盘复制后,可以配置服务器等待的延迟,以便生成通过套接字将 RDB 传输到副本的子节点。
#因为一旦传输开始,就不可能为到达的新副本提供服务,新副本将排队等待下一次 RDB 传输,因此服务器等待延迟以让更多副本到达。
#延迟以秒为单位指定,默认为 5 秒。要完全禁用它,只需将其设置为 0 秒,
repl-diskless-sync-delay 5
# In many cases the disk is slower than the network, and storing and loading
# the RDB file may increase replication time (and even increase the master's
# Copy on Write memory and salve buffers).
# However, parsing the RDB file directly from the socket may mean that we have
# to flush the contents of the current database before the full rdb was
# received. For this reason we have the following options:
#
# "disabled" - Don't use diskless load (store the rdb file to the disk first)
# "on-empty-db" - Use diskless load only when it is completely safe.
# "swapdb" - Keep a copy of the current db contents in RAM while parsing
# the data directly from the socket. note that this requires
# sufficient memory, if you don't have it, you risk an OOM kill.
repl-diskless-load disabled
# Disable TCP_NODELAY on the replica socket after SYNC?
#
# If you select "yes" Redis will use a smaller number of TCP packets and
# less bandwidth to send data to replicas. But this can add a delay for
# the data to appear on the replica side, up to 40 milliseconds with
# Linux kernels using a default configuration.
#
# If you select "no" the delay for data to appear on the replica side will
# be reduced but more bandwidth will be used for replication.
#
# By default we optimize for low latency, but in very high traffic conditions
# or when the master and replicas are many hops away, turning this to "yes" may
# be a good idea.
repl-disable-tcp-nodelay no
# The replica priority is an integer number published by Redis in the INFO
# output. It is used by Redis Sentinel in order to select a replica to promote
# into a master if the master is no longer working correctly.
#
# A replica with a low priority number is considered better for promotion, so
# for instance if there are three replicas with priority 10, 100, 25 Sentinel
# will pick the one with priority 10, that is the lowest.
#
# However a special priority of 0 marks the replica as not able to perform the
# role of master, so a replica with priority of 0 will never be selected by
# Redis Sentinel for promotion.
#
# By default the priority is 100.
replica-priority 100
# ACL LOG
#
# The ACL Log tracks failed commands and authentication events associated
# with ACLs. The ACL Log is useful to troubleshoot failed commands blocked
# by ACLs. The ACL Log is stored in memory. You can reclaim memory with
# ACL LOG RESET. Define the maximum entry length of the ACL Log below.
acllog-max-len 128
# Using an external ACL file
#
# Instead of configuring users here in this file, it is possible to use
# a stand-alone file just listing users. The two methods cannot be mixed:
# if you configure users here and at the same time you activate the exteranl
# ACL file, the server will refuse to start.
#
# The format of the external ACL user file is exactly the same as the
# format that is used inside redis.conf to describe users.
#
# aclfile /etc/redis/users.acl
# Command renaming (DEPRECATED).
#
# ------------------------------------------------------------------------
# WARNING: avoid using this option if possible. Instead use ACLs to remove
# commands from the default user, and put them only in some admin user you
# create for administrative purposes.
# ------------------------------------------------------------------------
#
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
# rename-command CONFIG ""
#
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
################################### 客户端 ####################################
#客户端的最大链接
# maxclients 10000
############################## 内存管理 ################################
#redis可以占用的内存 单位字节
#当达到内存限制时,Redis 将尝试根据选择的驱逐策略删除键
#maxmemory <bytes>
# redis过期key的移除策略
#volatile-lru:从已设置过期时间的key集中,挑选最近最少使用的数据淘汰。
#volatile-ttl:从已设置过期时间的key集中,挑选将要过期的数据淘汰。
#volatile-random:从已设置过期时间的key集中,任意选择数据淘汰。
#volatile-lfu:从已设置过期时间的key集中,挑选使用频率最低的数据淘汰。
#allkeys-lru:从key集中,挑选最近最少使用的数据淘汰
#allkeys-lfu:从key集中,挑选使用频率最低的数据淘汰。
#allkeys-random:从key集中,(server.db[i].dict)任意选择数据淘汰
#noeviction:不进行移除。针对写操作,只是返回错误信息
maxmemory-policy noeviction
#LRU、LFU 和最小 TTL 算法不是精确算法,而是近似算法(为了节省内存),因此您可以对其进行调整以提高速度或准确性。
#对于默认 Redis 将检查五个键并选择最近使用较少的一个,您可以使用以下配置指令更改样本大小。
#默认值 5 会产生足够好的结果。 10 非常接近真实的 LRU,但 CPU 成本更高。 3更快但不是很准确。
# maxmemory-samples 5
#从 Redis 5 开始,默认情况下,redis主从复制环境中,salve节点会忽略 maxmemory 设置
# 除非在发生 failover 后,slave此节点被提升为 master 节点。
#这意味着只有 master 才会执行过期删除策略。
#并且 master 在 删除键之后会对 所有slave 发送 DEL (删除)命令。
# replica-ignore-maxmemory yes
#设置过期keys仍然驻留在内存中的比重,默认是为1,表示最多只能有10%的过期key驻留在内存中,
#该值设置的越小,那么在一个淘汰周期内,消耗的CPU资源也更多,因为需要实时删除更多的过期key。
#所以该值的配置是需要综合权衡的。
# active-expire-effort 1
############################# LAZY FREEING ####################################
#针对redis内存使用达到 maxmemory,并设置有淘汰策略时,在被动淘汰键时,是否采用lazy free机制。
#因为此场景开启lazy free, 可能使用淘汰键的内存释放不及时,导致redis内存超用,超过maxmemory的限制。
lazyfree-lazy-eviction no
#针对设置有TTL的键(过期时间),达到过期后,被redis清理删除时是否采用lazy free机制。此场景建议开启,因TTL本身是自适应调整的速度。
lazyfree-lazy-expire no
#针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。
#如rename命令,当目标键已存在,redis会先删除目标键,
#如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。
#此参数设置就是解决这类问题,建议可开启。
lazyfree-lazy-server-del no
#slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的所有数据,
#该配置决定是否采用异常flush机制。如果内存变动不大,建议可开启。
#可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。
replica-lazy-flush no
#当用 UNLINK 调用替换用户代码 DEL 调用并不容易时,也可以使用以下配置指令将 DEL 命令的默认行为修改为与 UNLINK 完全相同:
lazyfree-lazy-user-del no
# AOF持久化生成的文件名
appendfilename "appendonly.aof"
#aof文件刷新的频率。有三种:
#1.no 依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。
#2.always 每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全。
#3.everysec 每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据。
appendfsync everysec
#指定是否在后台aof文件rewrite期间调用fsync,
#默认为no,表示要调用fsync(无论后台是否有子进程在刷盘)。
#Redis在后台写RDB文件或重写AOF文件期间会存在大量磁盘IO,此时,在某些linux系统中,调用fsync可能会阻塞。
no-appendfsync-on-rewrite no
#aof文件增长比例,指当前aof文件比上次重写的增长比例大小。aof重写即在aof文件在一定大小之后,
#重新将整个内存写到aof文件当中,以反映最新的状态(相当于bgsave)。这样就避免了,aof文件过大
#而实际内存数据小的问题(频繁修改数据问题)。
auto-aof-rewrite-percentage 100
#aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发,
#后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.
#如果是redis恢复时,则lastSize等于初始aof文件大小。
auto-aof-rewrite-min-size 64mb
# 指redis在恢复时,会忽略最后一条可能存在问题的指令。
#默认值yes。即在aof写入时,可能存在指令写错的问题,这种情况下,yes会log并继续,而no会直接恢复失败。
aof-load-truncated yes
#在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,
#其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,
#这样Redis就可以同时兼有RDB持久化和AOF持久化的优点
#(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
aof-use-rdb-preamble yes
################################ LUA SCRIPTING ###############################
#一个Lua脚本最长的执行时间,单位为毫秒,如果为0或负数表示无限执行时间,默认为5000
lua-time-limit 5000
################################ REDIS 集群 ###############################
#如果是yes,表示启用集群,否则以单例模式启动
# cluster-enabled yes
#这不是一个用户可编辑的配置文件,这个文件是Redis集群节点自动持久化每次配置的改变,为了在启动的时候重新读取它
# cluster-config-file nodes-6379.conf
#超时时间,集群节点不可用的最大时间。如果一个master节点不可到达超过了指定时间,则认为它失败了。
#注意,每一个在指定时间内不能到达大多数master节点的节点将停止接受查询请求
# cluster-node-timeout 15000
#如果设置为0,则一个slave将总是尝试升级为master。
#如果设置为一个正数,那么最大失去连接的时间是node timeout乘以这个factor。
# cluster-replica-validity-factor 10
#一个master和slave保持连接的最小数量(即:最少与多少个slave保持连接),
#也就是说至少与其它多少slave保持连接的slave才有资格成为master
# cluster-migration-barrier 1
#如果设置为yes,这也是默认值,如果key space没有达到百分之多少时停止接受写请求。
#如果设置为no,将仍然接受查询请求,即使它只是请求部分key
# cluster-require-full-coverage yes
# 此选项设置为yes时,可防止从设备尝试对其进行故障转移master在主故障期间。 然而,仍然可以强制执行手动故障转移
# cluster-replica-no-failover no
# 是否允许集群在宕机时读取
# cluster-allow-reads-when-down no
########################## docker集群/NAT支持 ########################
# 宣布服务IP
# cluster-announce-ip 10.1.1.5
#宣布服务端口
# cluster-announce-port 6379
#宣布集群总线端口
# cluster-announce-bus-port 6380
################################## SLOW LOG ###################################
#决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的查询进行记录
slowlog-log-slower-than 10000
# 它决定 slow log 最多能保存多少条日志, slow log 本身是一个 FIFO 队列,当队列大
#小超过 slowlog-max-len 时,最旧的一条日志将被删除,而最新的一条日志加入到 slow log ,以此类推。
slowlog-max-len 128
# 能够采样不同的执行路径来知道redis阻塞在哪里。这使得调试各种延时问题变得简单,
#设置一个毫秒单位的延时阈值来开启延时监控。
latency-monitor-threshold 0
# By default all notifications are disabled because most users don't need
# this feature and the feature has some overhead. Note that if you don't
# specify at least one of K or E, no events will be delivered.
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
# 哈希在条目数量较少且最大条目不超过给定阈值时使用内存高效数据结构进行编码。可以使用以下指令配置这些阈值。
#ziplist最大条目数
hash-max-ziplist-entries 512
#ziplist单个条目value的最大字节数
hash-max-ziplist-value 64
# ziplist列表最大值,默认存在五项:
# -5:最大大小:64 Kb <——不建议用于正常工作负载
# -4:最大大小:32 Kb <——不推荐
# -3:最大大小:16 Kb <——可能不推荐
# -2:最大大小:8 Kb<——很好
# -1:最大大小:4 Kb <——好
# 正数意味着存储最多 _exactly_ 该数量的元素
# 正数意味着每个列表节点最多存储_exactly_该数量的元素。性能最高的选项通常是 -2(8 Kb 大小)或 -1(4 Kb 大小)
list-max-ziplist-size -2
# 一个quicklist两端不被压缩的节点个数。0: 表示都不压缩。这是Redis的默认值,
# 1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。3: 表示quicklist两
# 端各有3个节点不压缩,中间的节点压缩。
list-compress-depth 0
#set集合仅在一种情况下具有特殊编码:当集合仅由字符串组成时,这些字符串恰好是 64 位有符号整数范围内的基数为 10 的整数。
#以下配置设置设置了集合大小的限制,以便使用这种特殊的内存节省编码。
set-max-intset-entries 512
# 与哈希和列表类似,排序集也经过特殊编码以节省大量空间。仅当排序集的长度和元素低于以下限制时,才使用此编码:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
#value大小
#小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),
#大于hll-sparse-max-bytes使用稠密的数据结构(dense)
hll-sparse-max-bytes 3000
# Streams单个节点的字节数,以及切换到新节点之前可能包含的最大项目数。
stream-node-max-bytes 4kb
stream-node-max-entries 100
# 主动重新散列每100毫秒CPU时间使用1毫秒,以帮助重新散列主Redis散列表(将顶级键映射到值
activerehashing yes
# 对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。
client-output-buffer-limit normal 0 0 0
#对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接
client-output-buffer-limit replica 256mb 64mb 60
#对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接
client-output-buffer-limit pubsub 32mb 8mb 60
# 客户端查询缓冲区累积新命令。 默认情况下,它被限制为固定数量,以避免协议失步(例如由于客
# 户端中的错误)将导致查询缓冲区中的未绑定内存使用。 但是,如果您有非常特殊的需求,可以在
# 此配置它,例如我们巨大执行请求
# client-query-buffer-limit 1gb
# 在Redis协议中,批量请求(即表示单个字符串的元素)通常限制为512 MB。 但是,您可以在此更改此限制
# proto-max-bulk-len 512mb
# 默认情况下,hz设置为10.提高值时,在Redis处于空闲状态下,将使用更多CPU。范围介于1到500之间,
# 大多数用户应使用默认值10,除非仅在需要非常低延迟的环境中将此值提高到100
hz 10
# 启用动态HZ时,实际配置的HZ将用作基线,但是一旦连接了更多客户端,将根据实际需要使用配置的HZ值的倍数
dynamic-hz yes
# 当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步
aof-rewrite-incremental-fsync yes
# 当redis保存RDB文件时,如果启用了以下选项,则每生成32 MB数据将对文件进行fsync。 这对于以递增
# 方式将文件提交到磁盘并避免大延迟峰值非常有用
rdb-save-incremental-fsync yes
# Jemalloc background thread for purging will be enabled by default
jemalloc-bg-thread yes
# Generated by CONFIG REWRITE
user default on nopass ~* +@all启动
docker run -p 6380:6379 \
--name redis-master \
-v /usr/local/docker/redis-cluster/master/data:/data \
-v /usr/local/docker/redis-cluster/master/conf:/etc/redis/conf \
-v /usr/local/docker/redis-cluster/master/log:/var/log/redis \
-d redis:3.2 redis-server /etc/redis/conf/redis.confRedis-slave
创建目录及文件
#创建配置目录
mkdir -p \
/usr/local/docker/redis-cluster/slave1/conf \
/usr/local/docker/redis-cluster/slave1/data \
/usr/local/docker/redis-cluster/slave1/conf
touch /usr/local/docker/redis-cluster/slave1/conf/redis.conf#创建配置文件#创建配置目录
mkdir -p \
/usr/local/docker/redis-cluster/slave2/conf \
/usr/local/docker/redis-cluster/slave2/data \
/usr/local/docker/redis-cluster/slave2/conf
touch /usr/local/docker/redis-cluster/slave2/conf/redis.conf#创建配置文件#创建配置目录
mkdir -p \
/usr/local/docker/redis-cluster/slave3/conf \
/usr/local/docker/redis-cluster/slave3/data \
/usr/local/docker/redis-cluster/slave3/conf
touch /usr/local/docker/redis-cluster/slave3/conf/redis.conf#创建配置文件配置文件
# 格式: masterauth <主节点密码>
masterauth redis_jCPt6e
# 指定主节点位置
replicaof 192.168.31.128 6380
# AOF 备份相关配置
appendonly yes
appendfsync everysec
auto-aof-rewrite-min-size 64M
auto-aof-rewrite-percentage 100
# 基础运行配置
# 如果是Docker环境保持no;如果是直接在Linux跑,建议改为yes让它后台运行
daemonize no
protected-mode no
# 建议给从节点也设置密码,保持安全性一致
requirepass redis_jCPt6e
# (可选) 确保从节点只读,防止误操作破坏备份数据
replica-read-only yes启动
从节点1
docker run -p 6381:6379 \
--name redis-slave1 \
-v /usr/local/docker/redis-cluster/slave1/data:/data \
-v /usr/local/docker/redis-cluster/slave1/conf:/etc/redis/conf \
-v /usr/local/docker/redis-cluster/slave1/log:/var/log/redis \
-d redis:3.2 redis-server /etc/redis/conf/redis.conf从节点2
docker run -p 6382:6379 \
--name redis-slave2 \
-v /usr/local/docker/redis-cluster/slave2/data:/data \
-v /usr/local/docker/redis-cluster/slave2/conf:/etc/redis/conf \
-v /usr/local/docker/redis-cluster/slave2/log:/var/log/redis \
-d redis:3.2 redis-server /etc/redis/conf/redis.conf从节点3
docker run -p 6383:6379 \
--name redis-slave3 \
-v /usr/local/docker/redis-cluster/slave3/data:/data \
-v /usr/local/docker/redis-cluster/slave3/conf:/etc/redis/conf \
-v /usr/local/docker/redis-cluster/slave3/log:/var/log/redis \
-d redis:3.2 redis-server /etc/redis/conf/redis.conf查看节点状态
docker exec -it redis-master /bin/bash
redis-cli
info replicationDocker-Es
拉取镜像
docker pull elasticsearch:7.4.2创建文件夹
mkdir -p \
/usr/local/docker/elasticsearch/config
/usr/local/docker/elasticsearch/data
/usr/local/docker/elasticsearch/plugins
echo "http.host: 0.0.0.0" >> /usr/local/docker/elasticsearch/config/elasticsearch.yml运行配置并启动
docker run --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /usr/local/docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/docker/elasticsearch/data:/usr/share/elasticsearch/data \
-v /usr/local/docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2Docker-Kibana
拉取镜像
docker pull kibana:7.4.2运行配置并启动
docker run --name kibana \
-e ELASTICSEARCH_HOSTS=http://192.168.31.128:9200 \
-p 5601:5601 \
-d kibana:7.4.2🔔
#http://192.168.31.128:9200 一定改为自己虚拟机的地址.不能写127.0.0.1
Docker-Nginx
拉取
docker pull nginx创建挂载目录
# 创建挂载目录
mkdir -p \
/usr/local/docker/nginx/conf
/usr/local/docker/nginx/log
/usr/local/docker/nginx/html文件夹复制
# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /usr/local/docker/nginx/创建Nginx容器并运行
# 删除正在运行的nginx容器
docker rm -f nginxdocker run \
-p 9002:80 \
--name nginx \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/docker/nginx/log:/var/log/nginx \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-d nginx:latestDocker-Rabbit MQ
拉取
docker pull rabbitmq:3.10.19-management挂载
mkdir -p /usr/local/docker/rabbitmq启动运行
docker run -d \
--hostname rabbitmq \
--name rabbitmq \
--restart=always \
-p5672:5672 \
-p15672:15672 \
-v /usr/local/docker/rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=147258 \
rabbitmq:3.10.19-managementDocker-Rocket MQ
namesrv服务
拉取
docker pull apache/rocketmq创建namesrv数据存储路径
mkdir -p /usr/local/docker/rocketmq/data/namesrv/logs
mkdir -p /usr/local/docker/rocketmq/data/namesrv/store构建namesrv容器
docker run -d \
--restart=always \
--name rmqnamesrv \
-p 9876:9876 \
-v /usr/local/docker/rocketmq/data/namesrv/logs:/root/logs \
-v /usr/local/docker/rocketmq/data/namesrv/store:/root/store \
-e "MAX_POSSIBLE_HEAP=100000000" \
apache/rocketmq \
sh mqnamesrv创建broker节点
创建broker数据存储路径
mkdir -p /usr/local/docker/rocketmq/data/broker/logs
mkdir -p /usr/local/docker/rocketmq/data/broker/store
mkdir -p /usr/local/docker/rocketmq/conf创建配置文件
vi /usr/local/docker/rocketmq/conf/broker.conf# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = 192.168.52.136
# 磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full
diskMaxUsedSpaceRatio=95构建broker容器
docker run -d \
--restart=always \
--name rmqbroker \
--link rmqnamesrv:namesrv \
-p 10911:10911 \
-p 10909:10909 \
-v /usr/local/docker/rocketmq/data/broker/logs:/root/logs \
-v /usr/local/docker/rocketmq/data/broker/store:/root/store \
-v /usr/local/docker/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "MAX_POSSIBLE_HEAP=200000000" \
apache/rocketmq \
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf 创建rockermq-console服务
拉取镜像
docker pull pangliang/rocketmq-console-ng构建rockermq-console容器
docker run -d \
--restart=always \
--name rmqadmin \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.31.128:9876 \
-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 9999:8080 \
pangliang/rocketmq-console-ngDocker-sonarqube
sonarqube Dockerfile
FROM eclipse-temurin:17-jre
LABEL org.opencontainers.image.url=https://github.com/SonarSource/docker-sonarqube
ENV LANG='en_US.UTF-8' \
LANGUAGE='en_US:en' \
LC_ALL='en_US.UTF-8'
#
# SonarQube setup
#
ARG SONARQUBE_VERSION=9.9.1.69595
ARG SONARQUBE_ZIP_URL=https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-${SONARQUBE_VERSION}.zip
ENV JAVA_HOME='/opt/java/openjdk' \
SONARQUBE_HOME=/opt/sonarqube \
SONAR_VERSION="${SONARQUBE_VERSION}" \
SQ_DATA_DIR="/opt/sonarqube/data" \
SQ_EXTENSIONS_DIR="/opt/sonarqube/extensions" \
SQ_LOGS_DIR="/opt/sonarqube/logs" \
SQ_TEMP_DIR="/opt/sonarqube/temp"
RUN set -eux; \
groupadd --system --gid 1000 sonarqube; \
useradd --system --uid 1000 --gid sonarqube sonarqube; \
apt-get update; \
apt-get install -y gnupg unzip curl bash fonts-dejavu; \
echo "networkaddress.cache.ttl=5" >> "${JAVA_HOME}/conf/security/java.security"; \
sed --in-place --expression="s?securerandom.source=file:/dev/random?securerandom.source=file:/dev/urandom?g" "${JAVA_HOME}/conf/security/java.security"; \
# pub 2048R/D26468DE 2015-05-25
# Key fingerprint = F118 2E81 C792 9289 21DB CAB4 CFCA 4A29 D264 68DE
# uid sonarsource_deployer (Sonarsource Deployer) <infra@sonarsource.com>
# sub 2048R/06855C1D 2015-05-25
for server in $(shuf -e hkps://keys.openpgp.org \
hkps://keyserver.ubuntu.com) ; do \
gpg --batch --keyserver "${server}" --recv-keys 679F1EE92B19609DE816FDE81DB198F93525EC1A && break || : ; \
done; \
mkdir --parents /opt; \
cd /opt; \
curl --fail --location --output sonarqube.zip --silent --show-error "${SONARQUBE_ZIP_URL}"; \
curl --fail --location --output sonarqube.zip.asc --silent --show-error "${SONARQUBE_ZIP_URL}.asc"; \
gpg --batch --verify sonarqube.zip.asc sonarqube.zip; \
unzip -q sonarqube.zip; \
mv "sonarqube-${SONARQUBE_VERSION}" sonarqube; \
rm sonarqube.zip*; \
rm -rf ${SONARQUBE_HOME}/bin/*; \
ln -s "${SONARQUBE_HOME}/lib/sonar-application-${SONARQUBE_VERSION}.jar" "${SONARQUBE_HOME}/lib/sonarqube.jar"; \
chmod -R 555 ${SONARQUBE_HOME}; \
chmod -R ugo+wrX "${SQ_DATA_DIR}" "${SQ_EXTENSIONS_DIR}" "${SQ_LOGS_DIR}" "${SQ_TEMP_DIR}"; \
apt-get remove -y gnupg unzip curl; \
rm -rf /var/lib/apt/lists/*;
COPY entrypoint.sh ${SONARQUBE_HOME}/docker/
WORKDIR ${SONARQUBE_HOME}
EXPOSE 9000
USER sonarqube
STOPSIGNAL SIGINT
ENTRYPOINT ["/opt/sonarqube/docker/entrypoint.sh"]entrypoint.sh
#!/bin/bash
set -e
DEFAULT_CMD=('/opt/java/openjdk/bin/java' '-jar' 'lib/sonarqube.jar' '-Dsonar.log.console=true')
# this if will check if the first argument is a flag
# but only works if all arguments require a hyphenated flag
# -v; -SL; -f arg; etc will work, but not arg1 arg2
if [ "$#" -eq 0 ] || [ "${1#-}" != "$1" ]; then
set -- "${DEFAULT_CMD[@]}" "$@"
fi
exec "$@"运行Dockerfile
docker build --rm -t sonarqube:9.9.1 .postgres
docker pull postgres:12.4-alpine
mkdir -p /usr/local/docker/postgresql
docker run --name postgres \
--restart=always \
-e POSTGRES_PASSWORD=123456 \
-p 5433:5432 \
-v /data/postgresql:/var/lib/postgresql/data \
-d postgres:12.4-alpine// 创建sonar数据库
create database sonar;运行sonarqube
mkdir -p /usr/local/docker/sonarqube/data
mkdir -p /usr/local/docker/sonarqube/extensions
mkdir -p /usr/local/docker/sonarqube/logs
mkdir -p /usr/local/docker/sonarqube/confvi /etc/sysctl.conf
添加参数:新增如下内容在sysctl.conf文件中,当前用户拥有的内存权限大小
vm.max_map_count=262144
重启生效:让系统控制权限配置生效
sysctl -p🔔
把sonarqube映射的目录加权限
docker run -d --name sonarqube \
--restart=always \
-p 9001:9000 \
-e SONAR_JDBC_URL=jdbc:postgresql://z.walle.love:1432/sonar \
-e SONAR_JDBC_USERNAME=postgres \
-e SONAR_JDBC_PASSWORD=123456 \
-v /usr/local/docker/sonarqube/data:/opt/sonarqube/data \
-v /usr/local/docker/sonarqube/extensions:/opt/sonarqube/extensions \
-v /usr/local/docker/sonarqube/logs:/opt/sonarqube/logs \
-v /usr/local/docker/sonarqube/conf:/opt/sonarqube/conf \
-d sonarqube:9.9.1📌
默认账户密码都是admin
Docker-sonarqube-latest
创建文件夹
mkdir -p /usr/local/docker/sonarqube-latest/data
mkdir -p /usr/local/docker/sonarqube-latest/extensions
mkdir -p /usr/local/docker/sonarqube-latest/logs
mkdir -p /usr/local/docker/sonarqube-latest/conf拉取镜像
docker pull mc1arke/sonarqube-with-community-branch-plugin:25.9.0.112764-community启动
docker run -d --name sonarqube-25.6 \
--restart=always \
-p 9003:9000 \
-e SONAR_JDBC_URL=jdbc:postgresql://192.168.31.16:5433/sonar-latest \
-e SONAR_JDBC_USERNAME=postgres \
-e SONAR_JDBC_PASSWORD=123456 \
-v /usr/local/docker/sonarqube-latest/data:/opt/sonarqube/data \
-v /usr/local/docker/sonarqube-latest/extensions:/opt/sonarqube/extensions \
-v /usr/local/docker/sonarqube-latest/logs:/opt/sonarqube/logs \
-v /usr/local/docker/sonarqube-latest/conf:/opt/sonarqube/conf \
-d sonarqube:25.6.0.109173-communitydocker run -d --name sonarqube-with-branch-25.9 \
--restart=on-failure:3 \
-p 9003:9000 \
-e SONAR_JDBC_URL=jdbc:postgresql://127.0.0.1:5432/sonar \
-e SONAR_JDBC_USERNAME=user_* \
-e SONAR_JDBC_PASSWORD=password_* \
-v /usr/local/docker/sonarqube-branch/data:/opt/sonarqube/data \
-v /usr/local/docker/sonarqube-branch/extensions:/opt/sonarqube/extensions \
-v /usr/local/docker/sonarqube-branch/logs:/opt/sonarqube/logs \
-v /usr/local/docker/sonarqube-branch/conf:/opt/sonarqube/conf \
-d mc1arke/sonarqube-with-community-branch-plugin:25.9.0.112764-community👋
/setup
💡
PMD插件有bug。需要修改方法
❗
https://hub.docker.com/r/mc1arke/sonarqube-with-community-branch-plugin/tags
Docker-Jenkins
拉取镜像
docker pull jenkins/jenkins:latest-jdk17配置maven
解压maven
tar -zxvf apache-maven-3.9.6-bin.tar.gz配置环境变量
docker exec -it jenkins /bin/bash
apt-get install vim
vim /etc/profile
export M2_HOME=/usr/local/maven/apache-maven-3.9.6
export CLASSPATH=$CLASSPATH:$M2_HOME/lib
export PATH=$PATH:$M2_HOME/bin
#输入命令使配置文件生效
source /etc/profile配置jdk17
解压jdk
tar xf /usr/local/jdk/jdk-17_linux-x64_bin.tar.gz -C /usr/local/jdk配置jdk环境
vim /etc/profile
export JAVA_HOME=/usr/local/jdk/jdk-17.0.10
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile创建挂载目录
mkdir -p /usr/local/docker/jenkins
chmod 777 /usr/local/docker/jenkins启动运行
docker run -uroot \
--name jenkins \
--restart=always \
-p 8080:8080 \
-p 5000:50000 \
-v /usr/local/docker/jenkins:/var/jenkins_home \
-v /usr/local/maven/apache-maven-3.9.6:/usr/local/maven/apache-maven-3.9.6 \
-v /usr/bin/git:/usr/local/git \
-v /etc/localtime:/etc/localtime \
-v /usr/local/jdk/jdk-17.0.10:/usr/local/jdk/jdk-17.0.10 \
-v /var/lib/docker:/var/lib/docker \
-v /etc/docker/daemon.json:/etc/docker/daemon.json \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-d -u0 jenkins/jenkins:latest-jdk17配置jenkins环境变量
加载密码
docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword🔔
不能随便升级核心及其库.最新版需要jdk11 17
Docker-Gitlab
拉取镜像
docker pull gitlab/gitlab-ce创建文件夹
mkdir -p \
/usr/local/docker/gitlab/etc \
/usr/local/docker/gitlab/log \
/usr/local/docker/gitlab/data编写docker-compose.yml
version: '3.1'
services:
gitlab:
image: 'gitlab/gitlab-ce'
restart: always
container_name: gitlab
privileged: true
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.31.128'
ports:
- '180:80'
- '1443:443'
- '122:22'
volumes:
- '/usr/local/docker/gitlab/etc:/etc/gitlab'
- '/usr/local/docker/gitlab/log:/var/log/gitlab'
- '/usr/local/docker/gitlab/data:/var/opt/gitlab'
启动运行
docker run -d \
--name=gitlab \
--restart=always \
-v /etc/localtime:/etc/localtime:ro \
-p 1443:443 -p 180:80 -p 122:22 \
-v /usr/local/docker/gitlab/etc:/etc/gitlab \
-v /usr/local/docker/gitlab/log:/var/log/gitlab \
-v /usr/local/docker/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce进入容器查看密码
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_passwordDocker-Compose
下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose授权
chmod +x /usr/local/bin/docker-compose测试安装结果
docker-compose --versionDocker-harbor
下载文件
https://github.com/goharbor/harbor/releases/download/v1.10.14/harbor-offline-installer-v1.10.14.tgz修改harbor.yml配置文件
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: 192.168.31.129
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 280
# https related config
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433
# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345启动
./install.sh💡
注意容器名字冲突和端口冲突
问题
Docker-v2ray
拉取镜像
docker pull v2ray/official:latest创建文件夹
mkdir -p /usr/local/docker/v2ray
mkdir -p /usr/local/docker/v2ray/log创建配置文件
{
"log" : {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "warning"
},
"inbounds": [{
"port": 30443,//端口
"protocol": "vmess",//传输协议
"settings": {
"clients": [
{
"id": "9f4c20ac-31de-4aa2-8ae5-e87cf4245e3a",//这里GUID请通过工具生成
"level": 1,
"alterId": 64
}
]
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
}]
}启动镜像
docker run \
--restart=always \
--name=v2ray \
--net=host \
-v /usr/local/docker/v2ray/config.json:/etc/v2ray/config.json \
-v /usr/local/docker/v2ray/log:/var/log/v2ray \
-i -t -d \
v2ray/official:latestDocker-dify
安装
克隆Dify代码仓库
git clone https://github.com/langgenius/dify.git启动 Dify
进入 Dify 源代码的 Docker 目录
cd dify/docker复制环境配置文件
cp .env.example .env启动 Docker 容器
根据你系统上的 Docker Compose 版本,选择合适的命令来启动容器。你可以通过 $ docker compose version 命令检查版本,详细说明请参考 Docker 官方文档:
如果版本是 Docker Compose V2,使用以下命令:
docker compose up -d如果版本是 Docker Compose V1,使用以下命令:
docker-compose up -d检查是否所有容器都正常运行:
docker compose psDocker-Lucky
docker run -d --name lucky --restart=always --net=host -v /usr/local/docker/lucky/conf:/goodluck gdy666/luckykubesphere
参考地址
GPT
拉取镜像
docker pull yidadaa/chatgpt-next-web启动
DeepSeek
docker run -d -p 3000:3000 \
-e BASE_URL=https://api.deepseek.com \
-e OPENAI_API_KEY=sk-ea71acc6f5cf422a8ba7a587b99148de \
-e HIDE_USER_API_KEY=1 \
-e CUSTOM_MODELS=-all,+deepseek-reasoner \
-e DEFAULT_MODEL=deepseek-reasoner \
yidadaa/chatgpt-next-web