Docker常用应用部署
Docker常用应用部署
一、Ubuntu系统Docker快速安装
Docker官网安装文档:https://docs.docker.com/engine/install/ubuntu/
# 文本处理的流编辑器 -i直接修改读取的文件内容,而不是输出到终端
# sed -i 's/原字符串/新字符串/' /home/1.txt
# 下面这个是修改ubuntu的源
sudo sed -i 's/cn.archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 更新
sudo apt update -y
sudo apt install curl
# 抓取docker安装脚本到一个文件中
curl -fsSL get.docker.com -o get-docker.sh
# 执行脚本,通过脚本下载 推荐设置阿里云镜像下载加速 默认管理员登陆不加sudo;有警告就忽略
sudo sh get-docker.sh --mirror Aliyun#==========解决每次输入sudo问题===========
# 将当前用户加入到docker组,这样每次使用就不需要sudo了
sudo gpasswd -a ${USER} docker
# 更新用户组,这样才能生效
newgrp - docker
sudo service docker restart#============加速器================
# 加速器网址:https://www.daocloud.io/mirror#accelerator-doc,可能有时会失效
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 查看配置文件,自己添加加速器
vi /etc/docker/daemon.json
# {"registry-mirrors": ["http://hub-mirror.c.163.com"]}# 下面地址任选一种就好
#腾讯云的镜像地址
https://mirror.ccs.tencentyun.com
#网易的镜像地址
http://hub-mirror.c.163.com
#下面的地址是假的,需要自己去阿里云 的容器镜像服务-》镜像加速器去复制自己的镜像地址
https://xxxx.mirror.aliyuncs.com
#daocloud发布的镜像地址
http://f1361db2.m.daocloud.io
# 最后要重启
sudo systemctl restart docker.service
# 安装ssh
sudo apt install openssh-server#===========docker-compose=============
# 在官网下载符合条件的:https://github.com/docker/compose/releases
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# wget也可以使用来下载
mv /usr/local/bin/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 记得添加权限
chmod +x /usr/local/bin/docker-compose# 放在bin目录下,在其他位置可以直接使用
sudo mv /usr/local/bin/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 第二种方法
sudo install docker-compose-linux-x86_64 /usr/local/bin/docker-compose
docker-compose ps# ============================================
# 2023/6/20可用源
# 编辑 Docker 配置文件
sudo vim /etc/docker/daemon.json
{"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://ccr.ccs.tencentyun.com"]
}
# 方法一,采用 systemctl 来重启,推荐
sudo systemctl daemon-reload
sudo systemctl restart docker
# 方法二,采用 service 来重启
sudo service docker restart
# 文本处理的流编辑器 -i直接修改读取的文件内容,而不是输出到终端
# sed -i 's/原字符串/新字符串/' /home/1.txt
# 下面这个是修改ubuntu的源
sudo sed -i 's/cn.archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 更新
sudo apt update -y
sudo apt install curl
# 抓取docker安装脚本到一个文件中
curl -fsSL get.docker.com -o get-docker.sh
# 执行脚本,通过脚本下载 推荐设置阿里云镜像下载加速 默认管理员登陆不加sudo;有警告就忽略
sudo sh get-docker.sh --mirror Aliyun#==========解决每次输入sudo问题===========
# 将当前用户加入到docker组,这样每次使用就不需要sudo了
sudo gpasswd -a ${USER} docker
# 更新用户组,这样才能生效
newgrp - docker
sudo service docker restart#============加速器================
# 加速器网址:https://www.daocloud.io/mirror#accelerator-doc,可能有时会失效
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 查看配置文件,自己添加加速器
vi /etc/docker/daemon.json
# {"registry-mirrors": ["http://hub-mirror.c.163.com"]}# 下面地址任选一种就好
#腾讯云的镜像地址
https://mirror.ccs.tencentyun.com
#网易的镜像地址
http://hub-mirror.c.163.com
#下面的地址是假的,需要自己去阿里云 的容器镜像服务-》镜像加速器去复制自己的镜像地址
https://xxxx.mirror.aliyuncs.com
#daocloud发布的镜像地址
http://f1361db2.m.daocloud.io
# 最后要重启
sudo systemctl restart docker.service
# 安装ssh
sudo apt install openssh-server#===========docker-compose=============
# 在官网下载符合条件的:https://github.com/docker/compose/releases
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# wget也可以使用来下载
mv /usr/local/bin/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 记得添加权限
chmod +x /usr/local/bin/docker-compose# 放在bin目录下,在其他位置可以直接使用
sudo mv /usr/local/bin/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 第二种方法
sudo install docker-compose-linux-x86_64 /usr/local/bin/docker-compose
docker-compose ps# ============================================
# 2023/6/20可用源
# 编辑 Docker 配置文件
sudo vim /etc/docker/daemon.json
{"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://ccr.ccs.tencentyun.com"]
}
# 方法一,采用 systemctl 来重启,推荐
sudo systemctl daemon-reload
sudo systemctl restart docker
# 方法二,采用 service 来重启
sudo service docker restart
二、Docker安装基本应用
1、Tomcat安装
# 指定时区和中文乱码
docker run -d -p 8080:8080 \
--name tomcat \
--restart=always \
-v /home/docker/tomcat/logs/:/usr/local/tomcat/logs/ \
# 这里需要自行创建好webapps内容,或者进入容器将webapps.list改成webapps
-v /home/docker/tomcat/webapps/:/usr/local/tomcat/webapps/ \
-v /etc/localtime:/etc/localtime \
-e TZ="Asia/Shanghai" \
-e LANG="C.UTF-8" \
tomcat:latest#==========================
docker run --name tomcat -p 8080:8080 \
-v tomcatconf:/usr/local/tomcat/conf \
-v tomcatwebapp:/usr/local/tomcat/webapps \
-d tomcat:jdk8-openjdk-slim-buster
docker-compose部署
version: '3'
services:tomcat:image: tomcat:latestcontainer_name: tomcatrestart: alwaysports:- 8080:8080environment:TZ: "Asia/Shanghai"LANG: "C.UTF-8"volumes:- /opt/tomcat/conf/server.xml:/usr/local/tomcat/server.xml- /opt/tomcat/webapps:/usr/local/tomcat/webapps- /opt/tomcat/logs:/usr/local/tomcat/logs
2、Nginx安装
# https://www.digitalocean.com/community/tools/nginx
# 注意 外部的/nginx/conf下面的内容必须存在,否则挂载会覆盖
docker run -p 80:80 -p 443:443 --name nginx \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
-v /usr/local/docker/nginx/conf/:/etc/nginx \
-d nginx:1.20.1
docker-compose部署
version: '3'
services:nginx:container_name: nginximage: nginxrestart: alwaysports:- 80:80- 443:443privileged: truevolumes:- /etc/localtime:/etc/localtime:ro- ./conf/nginx/log/:/var/log/nginx# 注意:如下挂载都是覆盖#- ./conf/nginx/conf.d:/etc/nginx/conf.d#- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro#- ./conf/nginx/html:/usr/share/nginx/html
3、Mysql安装
3.1 单机版安装
# 5.7版本
docker run -p 3306:3306 --name mysql57 \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7#8.x版本,引入了 secure-file-priv 机制,磁盘挂载将没有权限读写data数据,所以需要将权限透传,或者
chmod -R 777 /app/mysql/data# --privileged 特权容器,容器内使用真正的root用户
docker run -p 3306:3306 --name mysql8 \
-v /app/mysql/conf:/etc/mysql/conf.d \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro
-e MYSQL_ROOT_PASSWORD=123456 \
--privileged \
-d mysql# 针对配置文件,新建 my.cnf (/usr/local/mysql/conf),否则中文乱码
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
docker-compose部署
version : '3'
services:mysql:# 容器名container_name: mysql5# 重启策略restart: alwaysimage: mysql:5.7ports:- "3306:3306"volumes:# 挂载配置文件# - ./mysql/db/:/docker-entrypoint-initdb.d# 挂载配置文件- ./mysql/conf:/etc/mysql/conf.d# 挂载日志- ./mysql/logs:/logs# 挂载数据- ./mysql/data:/var/lib/mysqlcommand: ['mysqld','--innodb-buffer-pool-size=80M','--character-set-server=utf8mb4','--collation-server=utf8mb4_unicode_ci','--default-time-zone=+8:00','--lower-case-table-names=1']environment:# root 密码MYSQL_ROOT_PASSWORD: 123456#======================mysql8.0=================
version: '3'
services:mysql:container_name: mysql8restart: always# 注意8.0以后的问题privileged: trueimage: mysql:8.0volumes:# 挂载配置文件- ./mysql/conf:/etc/mysql/conf.d# 挂载日志- ./mysql/logs:/logs# 挂载数据- ./mysql/data:/var/lib/mysqlcommand:--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=trueenvironment:- TZ=Asia/Shanghai - LANG=C.UTF-8 - MYSQL_ROOT_PASSWORD=rootports:- 33106:3306network_mode: "bridge"
3.2 主从复制
# 1、新建主服务器容器实例3307
docker run -p 3307:3306 --name mysql-master \
-v /usr/local/docker/mysql-master/log:/var/log/mysql \
-v /usr/local/docker/mysql-master/data:/var/lib/mysql \
-v /usr/local/docker/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7# 2、进入/usr/local/docker/mysql-master/conf目录下新建 my.cnf
#==================================
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#====================================# 3、修改完配置后重启master实例
docker restart mysql-master# 4、进入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot# 5、master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';# 6、新建从服务器容器实例3308
docker run -p 3308:3306 --name mysql-slave \
-v /usr/local/docker/mysql-slave/log:/var/log/mysql \
-v /usr/local/docker/mysql-slave/data:/var/lib/mysql \
-v /usr/local/docker/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7# 7、进入/usr/local/docker/mysql-slave/conf目录下新建my.cnf
# ====================================================
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-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
# ====================================================# 8、修改完配置后重启slave实例
docker restart mysql-slave# 9、在主数据库中查看主从同步状态
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
show master status;
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 | 617 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)# 10、在从数据库中配置主从复制
change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
mysql> change master to master_host='106.14.76.55', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.03 sec)# master_host:主数据库的IP地址;
# master_port:主数据库的运行端口;
# master_user:在主数据库创建的用于同步数据的用户账号;
# master_password:在主数据库创建的用于同步数据的用户密码;
# master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
# master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
# master_connect_retry:连接失败重试的时间间隔,单位为秒。 # 11、在从数据库中查看主从同步状态
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
show slave status \G;# 12、在从数据库中开启主从同步看到Slave_IO_Running和Slave_SQL_Running启动就行
start slave;
4、Redis安装
4.1 单机版安装
# 提前准备好redis.conf文件,创建好相应的文件夹。如:
port 6379
# 开启redis数据持久化,可选
appendonly yes
# 开启redis验证,可选
requirepass 123
#注释掉,允许redis外地连接
# bind 127.0.0.1
#将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
daemonize no #更多配置参照 https://raw.githubusercontent.com/redis/redis/6.0/redis.conf
docker run -p 6379:6379 --name redis \
--privileged=true \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data -d redis:6.0.8 \
redis-server /etc/redis/redis.conf --appendonly yes
docker-compose部署
version: '3'
services:redis:image: redis:6.2.5container_name: redisprivileged: truevolumes:- ../redis/data:/data- ../redis/conf/redis.conf:/usr/local/etc/redis/redis.conf- ../redis/logs:/logscommand: ["redis-server","/usr/local/etc/redis/redis.conf"]privileged: trueports:- 6379:6379environment:- TZ="Asia/Shanghai"restart: always
4.2 集群安装
# port:节点端口;
# requirepass:设置密码,访问时需要验证
# protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
# daemonize:是否以守护线程的方式启动(后台启动),默认 no;
# appendonly:是否开启 AOF 持久化模式,默认 no;
# cluster-enabled:是否开启集群模式,默认 no;
# cluster-config-file:集群节点信息文件;
# cluster-node-timeout:集群节点连接超时时间;
# cluster-announce-ip:集群节点 IP
# 注意: 如果你想要你的redis集群可以供外网访问,这里直接填 服务器的IP 地址即可;如若为了安全,只是在服务器内部进行访问,这里还需要做一些修改。
# cluster-announce-port:集群节点映射端口;
# cluster-announce-bus-port:集群节点总线端口#shell脚本循环生成配置文件
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF>>/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 首先创建自定义网络
docker network create --driver bridge --subnet 172.38.0.0/24 --gateway 172.38.0.1 redis
#分别启动docker容器,shell脚本,注意配置文件的生成
for i in $(seq 1 6);\
do \
docker run -p 637${i}:6379 -p 1637${i}:16379 \
--name redis-${i} --privileged=true \
-v /mydata/redis/node-${i}/data:/data \
-v /mydata/redis/node-${i}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${i} redis \
redis-server /etc/redis/redis.conf
done# 随机进入一个容器
docker exec -it redis-1 /bin/bash
# 生成集群,--cluster-replicas 1 表示为每个master创建一个slave节点
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
# 进入客户端
redis-cli -p 6379
# 查看集群结点状况
cluster nodes
# 查看集群信息
cluster info
# 需要进入集群模式,否则会报错
redis-cli -p 6379 -c
# 集群会自动计算哈希槽存储位置,若主节点宕机,从节点会成为主节点
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
4.3 主从扩容
# 1、新建6377、6378两个节点+新建后启动+查看是否8节点,注意配置文件的创建
docker run -p 6377:6379 -p 16377:16379 --name redis-7 --privileged=true -v /mydata/redis/node-7/data:/data -v /mydata/redis/node-7/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.17 redis redis-server /etc/redis/redis.conf
docker run -p 6378:6379 -p 16378:16379 --name redis-8 --privileged=true -v /mydata/redis/node-8/data:/data -v /mydata/redis/node-8/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.18 redis redis-server /etc/redis/redis.conf# 2、进入6377容器实例内部
docker exec -it redis-7 /bin/bash# 3、将新增的6377节点(空槽号)作为master节点加入原集群
# redis-cli --cluster add-node 自己实际IP地址:6377 自己实际IP地址:6371
# 6377 就是将要作为master新增节点
# 6371 就是原来集群节点里面的领路人,相当于6377找到组织加入集群
# 这里我直接使用了内部网络
redis-cli --cluster add-node 172.38.0.17:6379 172.38.0.11:6379 # 4、检查集群情况第1次
redis-cli --cluster check 172.38.0.11:6379# 5、重新分派槽号
redis-cli --cluster reshard 172.38.0.11:6379# 因为4台,16384/4=4096,每台分4分之一
How many slots do you want to move (from 1 to 16384)? 4096
# 172.38.0.17:6379 的id
What is the receiving node ID? 3a732104b11d3cf81d1128def9f0158fb5708ca7
# 输入 all
Source node #1: all# 6、检查集群情况第2次
redis-cli --cluster check 172.38.0.11:6379
172.38.0.11:6379 (9c109831...) -> 0 keys | 4096 slots | 1 slaves.
172.38.0.12:6379 (0100361c...) -> 0 keys | 4096 slots | 1 slaves.
172.38.0.13:6379 (348dc3b1...) -> 0 keys | 4096 slots | 1 slaves.
172.38.0.17:6379 (5d34f842...) -> 0 keys | 4096 slots | 0 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 9c109831a0afd33f7c13500caf39d3191a13e0b3 172.38.0.11:6379slots:[1365-5460] (4096 slots) master1 additional replica(s)
M: 0100361c6056686b671f84877af18ffd22b4c428 172.38.0.12:6379slots:[6827-10922] (4096 slots) master1 additional replica(s)
M: 348dc3b13714d0b07236c2ba6c5147f270b08800 172.38.0.13:6379slots:[12288-16383] (4096 slots) master1 additional replica(s)
S: 6fc86fc554f1f939564e6acc346da222a886ab6a 172.38.0.14:6379slots: (0 slots) slavereplicates 348dc3b13714d0b07236c2ba6c5147f270b08800
S: 2a2fe251d41085ec7eb53e9bf4e4c749e5d9dbb9 172.38.0.15:6379slots: (0 slots) slavereplicates 9c109831a0afd33f7c13500caf39d3191a13e0b3
M: 5d34f8422f8b68ea87bd2f8388c686fdbcfdc9a1 172.38.0.17:6379slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
S: 9068998c9b5cd5e4cca939738cc42a2954770b47 172.38.0.16:6379slots: (0 slots) slavereplicates 0100361c6056686b671f84877af18ffd22b4c428
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.## 为什么172.38.0.17是3个新的区间,以前的还是连续?
## 重新分配成本太高,所以前3家各自匀出来一部分,从三个旧节点分别匀出1364个坑位给新节点172.38.0.17 # 7、为主节点172.38.0.17分配从节点172.38.0.18
# redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli --cluster add-node 172.38.0.18:6379 172.38.0.17:6379 --cluster-slave --cluster-master-id 3a732104b11d3cf81d1128def9f0158fb5708ca7 # 8、检查集群情况第3次
redis-cli --cluster check 172.38.0.18:6379
4.4 主从缩容
# 1、将172.38.0.17和172.38.0.18下线
# 2、检查集群情况 获得172.38.0.18的从节点ID
redis-cli --cluster check 172.38.0.11:6379# 3、将172.38.0.18从节点删除 从集群中将4号从节点172.38.0.18删除
# redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 172.38.0.18:6379 bdf8a5114bbad6d400aa8b1a5e3f29b174d6676e
## 检查一下发现只剩下7台机器了
redis-cli --cluster check 172.38.0.11:6379# 4、将172.38.0.17的槽号清空,重新分配,本例将清出来的槽号都给172.38.0.11
redis-cli --cluster reshard 172.38.0.11:6379How many slots do you want to move (from 1 to 16384)?4096
# 172.38.0.11的id
What is the receiving node ID? edf165b5d01f1a1f276237517d391c86c32d9f93
# 172.38.0.17的id
Source node #1: 3a732104b11d3cf81d1128def9f0158fb5708ca7
Source node #2: done# 5、检查集群情况第二次
redis-cli --cluster check 172.38.0.11:6379
# 4096个槽位都指给172.38.0.11,它变成了8192个槽位,相当于全部都给172.38.0.11了,不然要输入3次,一锅端 # 6、将172.38.0.17删除
# redis-cli --cluster del-node ip:端口 172.38.0.17节点ID
redis-cli --cluster del-node 172.38.0.17:6379 3a732104b11d3cf81d1128def9f0158fb5708ca7# 7、检查集群情况第三次
redis-cli --cluster check 172.38.0.11:6379
5、MongoDB安装
version: '3'
services:mongo:image: mongo:5.0.9container_name: mongorestart: alwaysports:- 27017:27017volumes:- /etc/localtime:/etc/localtime #时区- ../mongodb/data/db:/data/db #数据- ../mongodb/log:/var/log/mongodb # 挂载日志目录# - ./config:/etc/mongo #配置目录privileged: trueenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: rootmongo-express:image: mongo-express:0.54container_name: mongo-expressrestart: alwaysports:- 8079:8081environment:ME_CONFIG_MONGODB_ADMINUSERNAME: rootME_CONFIG_MONGODB_ADMINPASSWORD: rootME_CONFIG_MONGODB_URL: mongodb://root:root@mongo:27017/
添加管理员
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
# 登录并切换db到admin
$ docker exec -it mongo mongo admin# 登录root用户,如果前面没有创建root用户可跳过此步
> db.auth('root','123456')# 创建所有数据库管理用户 admin/123456
> db.createUser({user:'admin',pwd: '123456',roles:[{role:"userAdminAnyDatabase", db:"admin"}, "readWriteAnyDatabase"]});
# Successfully added user: { ...# 使用新用户登录,返回 0=失败 1=成功
> db.auth('admin', '123456')
# 1# 创建测试库
> use testdb
# 插入测试数据
> db.testdb.insert({"name":"testdb"})
# 创建用户并授权,dbOwner代表数据库所有者角色,拥有最高该数据库最高权限。
> db.createUser({ user:"user_testdb", pwd:"123456", roles: [{ role:"readWrite", db:"testdb" }] })
>
# 退出数据库
> exit
6、MiniO安装
version: '3'
services:minio:image: minio/minio:RELEASE.2022-03-26T06-49-28Zhostname: "minio"ports:- "9000:9000" # api 端口- "9001:9001" # 控制台端口environment:MINIO_ACCESS_KEY: root #管理后台用户名MINIO_SECRET_KEY: rootroot #管理后台密码,最小8个字符volumes:- ../minio/data:/data #映射当前目录下的data目录至容器内/data目录- ../minio/config:/root/.minio/ #映射配置目录command: server --console-address ':9001' /data #指定容器中的目录 /dataprivileged: truerestart: alwayslogging:options:max-size: "50M" # 最大文件上传限制max-file: "10"driver: json-file
7、Nacos安装
# 外置数据库
version: "3"
services:nacos:image: nacos/nacos-server:${NACOS_VERSION}container_name: nacos-standalone-mysqlenv_file:- ../nacos/nacos-standlone-mysql.envvolumes:- ../nacos/standalone-logs/:/home/nacos/logs- ../nacos/init.d/custom.properties:/home/nacos/init.d/custom.propertiesports:- "8848:8848"- "9848:9848"- "9555:9555"restart: always
设置配置文件
# 同级目录下的.env
NACOS_VERSION=v2.0.4# ../nacos/nacos-standlone-mysql.env
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=192.168.31.28
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=root
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
8、其他常用软件
Docker安装基本应用
最全的Docker-compose应用部署
相关文章:
Docker常用应用部署
Docker常用应用部署 一、Ubuntu系统Docker快速安装 Docker官网安装文档:https://docs.docker.com/engine/install/ubuntu/ # 文本处理的流编辑器 -i直接修改读取的文件内容,而不是输出到终端 # sed -i s/原字符串/新字符串/ /home/1.txt # 下面这个是修…...

【数据分享】2014-2022年我国淘宝村点位数据(Excel格式/Shp格式)
电子商务是过去一二十年我国发展最快的行业,其中又以淘宝为代表,淘宝的发展壮大带动了一大批服务淘宝电子商务的村庄,这些村庄被称为淘宝村! 截至到目前,阿里研究院梳理并公布了2014-2022年共9个年份的淘宝村名单&…...

Ubuntu 安装 docker-compose
在Ubuntu上安装Docker Compose,可以按照以下步骤进行操作: 下载 Docker Compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker…...
vue2、vue3中路由守卫变化
什么是路由守卫? 路由守卫就是路由跳转的一些验证,比如登录鉴权(没有登录不能进入个人中心页)等等等 路由守卫分为三大类: 全局守卫:前置守卫:beforeEach 后置钩子:afterEach 单个…...

Leetcode—547.省份数量【中等】
2023每日刷题(八) Leetcode—547.省份数量 实现代码 static int father[210] {0};int Find(int x) {if(x ! father[x]) {father[x] Find(father[x]);}return father[x]; }void Union(int x, int y) {int a Find(x);int b Find(y);if(a ! b) {fathe…...

Nginx 防盗链
nginx防盗链问题 盗链: 就是a网站有一张照片,b网站引用了a网站的照片 。 防盗链: a网站通过设置禁止b网站引用a网站的照片。 nginx防止网站资源被盗用模块 ngx_http_referer_module 如何区分哪些是不正常的用户? HTTP Referer…...

26. 通过 cilium pwru了解网络包的来龙去脉
pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…...
刷题笔记day01-数组
704 题 主要强调,左闭右闭的情况,就是每次查询都会和 [left, right] 进行比较。所以后面的都是mid-1,mid1 的情况。 package mainfunc search(nums []int, target int) int {// 二分查找方法// 每次查找都是左闭右闭的情况left : 0right : …...

C#调用C++ 的DLL传送和接收中文字符串
1 c#向c传送中文字符串 设置:将 字符集 改为 使用多字节字符集 cpp代码: extern "C"_declspec(dllexport) int input_chn_str(char in_str[]) {cout<<in_str<<endl;return 0; }c#代码: [DllImport("Demo.dll…...

【MySQL】数据库常见错误及解决
目录 2003错误:连接错误1251错误:身份验证错误1045错误:拒绝访问错误服务没有报告任何错误net start mysql 发生系统错误 5。 1064错误:语法错误1054错误:列名不存在1442错误:触发器中不能对本表增删改1303…...

spring常见问题汇总
1. 什么是spring? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务 逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架, 为开…...
java8 Lambda表达式以及Stream 流
Lambda表达式 Lambda表达式规则 Lambda表达式可以看作是一段可以传递的代码, Lambda表达式只能用于函数式接口,而函数式接口只有一个抽象方法,所以可以省略方法名,参数类型等 Lambda格式:(形参列表&…...

基于Java的音乐网站管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

【蓝桥】小蓝的疑问
1、题目 问题描述 小蓝和小桥上完课后,小桥回顾了课上教的树形数据结构,他在地上画了一棵根节点为 1 的树,并且对每个节点都赋上了一个权值 w i w_i wi。 小蓝对小桥多次询问,每次询问包含两个整数 x , k x,k x,kÿ…...

漏洞复现-海康威视综合安防管理平台信息泄露【附Poc】
目录 【产品介绍】 【产品系统UI】 【漏洞说明】 【指纹】 【Nuclei Poc】 【验证】 【产品介绍】 海康威视(Hikvision)是一家总部位于中国杭州的公司,是全球最大的视频监控产品供应商。除了传统的CCTV摄像机和网络摄像机,海…...

【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了
【侵权联系删除】【文/郑尔巴金】 深度爆料,《完美世界》动漫第135集预告片已经更新了,但是网友们对此却是一脸槽点。从预告中可以看出,石昊在和战王战天歌的大战中被打成重伤,最后云曦也被战天歌抓住。在云曦面临生死危机的时候…...

34二叉树-BFS和DFS求树的深度
目录 LeetCode之路——104. 二叉树的最大深度 分析 解法一:广度优先遍历 解法二:深度优先遍历 总结 深度优先搜索 (DFS) 广度优先搜索 (BFS LeetCode之路——104. 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的…...
Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin
Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity…...
设计模式之创建型模式
创建型模式与对象的创建有关。 创建型模式抽象了对象实例化的过程,这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。创建型模式有以下 工厂模式(Factory Method) 意图…...

使用jdbc技术连接数据库
连接数据库 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>compile</scope></dependency> </dependencies> g…...
ubuntu 安装上传的 ffmpeg_7.1.1.orig.tar.xz并使用
在 Ubuntu 系统上离线安装 make 需要提前准备好所有依赖包。以下是详细的操作步骤: 准备工作:在有网络的机器上下载所需软件包 查找依赖关系 在有网络的 Ubuntu 机器上(需与目标机器相同版本)执行: # 获取 make 及其依…...

基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】
简述 理解情感状态对于开发下一代人机交互界面至关重要。社交互动中的人类行为会引发受感知输入影响的心理生理过程。因此,探索大脑功能与人类行为的努力或将推动具有类人特质人工智能模型的发展。这里原作者推出一个多模态情感数据集,包含42名参与者的3…...

Transformer 通关秘籍11:Word2Vec 及工具的使用
将文字文本转换为词向量(word embedding)的过程中,一个非常著名的算法模型应该就是 Word2Vec 了。 相信大家或多或少都听说过,本节就来简单介绍一下 Word2Vec 。 什么是 Word2Vec ? Word2Vec 可以非常有效的创建词嵌入向量&…...
js中common.js和ECMAScript.js区别
以下是关于 CommonJS 和 ECMAScript Modules(ESM)的详细对比分析,包含底层原理和示例说明: 🧩 核心差异对比表 特性CommonJSES Modules来源Node.js 社区规范ECMAScript 语言标准加载方式动态加载(运行时解…...

不同电脑同一个网络ip地址一样吗?如何更改
想象一下,你住在同一栋公寓楼里,所有住户对外共享一个统一的小区地址(类似公网IP),但每家每户又有独立的门牌号(类似内网IP)。网络世界中的IP地址也遵循这一逻辑:同一局域网内的设备…...
00 QEMU源码中文注释与架构讲解
QEMU源码中文注释与架构讲解 先占坑:等后续完善后再更新此文章 注释作者将狼才鲸创建日期2025-05-30更新日期NULL CSDN阅读地址:00 QEMU源码中文注释与架构讲解Gitee源码仓库地址:才鲸嵌入式/qemu 一、前言 参考网址 QEMU 源码目录简介qe…...

华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 准备工作 2.1 注册华为云账号 2.2 确…...
在 Ubuntu 服务器上 下载 Clash 文件使用代理
文件Clash.Verge_1.3.8_x64_portable.zip 在 Ubuntu 服务器上不能使用这个Clash 文件**,我们需要的是 Clash.Meta 而不是 Clash Verge GUI 客户端 也就是 Clash Verge GUI 客户端的 Windows 版本,是给 Windows 桌面环境用的图形界面,不适用…...

Linux 的编辑器--vim
1.Linux编辑器-vim使⽤ vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以…...

用 Trae IDE 打造一个桌面小爬虫:从 PyQt5 开始,轻松采集掘金首页内容
很多程序员都有这样的经历:刷掘金、看文章、找灵感、追热点。但你有没有想过,有一天让“爬虫”代替你去浏览这些内容?自动提取标题、作者、点赞数、评论数,一键生成你的专属“技术热点日报”。 今天我们就用 Trae IDE PyQt5 来完…...