安装目录
#部署目录变量并打印到控制台
mkdir-p /home/install/test && echo'export data=/home/install/test' >> /etc/profile && source /etc/profile && echo$data
mkdir-p /install/test && echo'export data=/install/test' >> /etc/profile && source /etc/profile && echo$data
#ip变量并打印到控制台
echo'export ipTemp=192.168.1.10' >> /etc/profile && source /etc/profile && source /etc/profile&& echo$ipTemp
chmod-R 777 dir
设置快捷命令
alias ll='ls -l --color=auto'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
docker
mysql
5.7
单机
配置文件
mkdir -p $data/mysqlOfone && cd $data/mysqlOfone
cat > $data/mysqlOfone/mysqld.cnf <<-'EOF'
[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_general_ci
character_set_server = utf8mb4
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
lower_case_table_names = 1 # 忽略mysql查询大小写
skip-name-resolve #禁用dns反查
#设置时区
default-time-zone = 'Asia/Shanghai'
EOF
启动脚本
cat >$data/mysqlOfone/install.sh <<-'EOF'
#!/bin/bash
read -p "端口: " port
#dir_work=$(cd `dirname $0`; pwd)
dir_work=$data
mkdir $dir_work/mysql$port/{data,conf,logs} -p
# 检查目录是否成功创建并且是目录
directories=("data" "conf" "logs")
for dir_name in "${directories[@]}"; do
dir_path="$dir_work/mysql$port/$dir_name"
if [ -d "$dir_path" ]; then
echo "目录 $dir_path 存在且是一个目录。"
else
echo "错误: $dir_path 不存在或不是一个目录。脚本终止。"
exit 1
fi
done
cp mysqld.cnf $dir_work/mysql$port/conf
docker run -d -p $port:3306 --privileged=true --restart always -v $dir_work/mysql$port/logs:/var/log/mysql -v $dir_work/mysql$port/conf:/etc/mysql/conf.d -v $dir_work/mysql$port/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql$port mysql:5.7.39
EOF
启动:
sh install.sh
#ubuntu
bash install.sh
链接
192.168.1.10 #ip
3306 #端口
root #用户名
123456 #密码
集群-主从
主配置文件夹
mkdir -p $data/mysql-master/conf
cd $data/mysql-master/conf
主配置文件
cat >my.cnf <<-'EOF'
[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4
## 设置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
##忽略mysql查询大小写
lower_case_table_names = 1
#设置时区
default-time-zone = 'Asia/Shanghai'
EOF
启动mysql主
docker run -p 3310:3306 --privileged=true --restart always --name mysql-master-3310
-v $data/mysql-master/log:/var/log/mysql
-v $data/mysql-master/data:/var/lib/mysql
-v $data/mysql-master/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7.37
从配置文件夹
mkdir -p $data/mysql-slave/conf
cd $data/mysql-slave/conf
从配置文件
cat >my.cnf <<-'EOF'
[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4
[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
##忽略mysql查询大小写
lower_case_table_names = 1
#设置时区
default-time-zone = 'Asia/Shanghai'
EOF
启动mysql从
docker run -p 3320:3306 --privileged=true --restart always --name mysql-slave3320
-v $data/mysql-slave/log:/var/log/mysql
-v $data/mysql-slave/data:/var/lib/mysql
-v $data/mysql-slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7.37
进入主服务
docker exec -it mysql-master-3310 /bin/bash
mysql -uroot -p123456
#查看server_id是否生效
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| server_id | 1 |
| server_id_bits | 32 |
+----------------+-------+
#开权限
mysql> grant replication slave,replication client on *.* to 'slave01'@'%' identified by "123456";
mysql> flush privileges;
#看master信息 File 和 Position 从服务上要用
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 154 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
进入从服务
docker exec -it mysql-slave3320 /bin/bash
mysql -uroot -p123456
#查看server_id是否生效
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| server_id | 2 |
| server_id_bits | 32 |
+----------------+-------+
#在执行下面这个命令之前,进入主数据库 重新查看最新master信息 File 和 Position 从服务上要用
#修改master_host,master_port
# 连接主mysql服务 master_log_file 和 master_log_pos的值要填写主master里查出来的值
change master to master_host='192.168.17.143',master_user='slave01',master_password='123456',master_port=3310,master_log_file='mall-mysql-bin.000004', master_log_pos=612,master_connect_retry=30;
#启动slave
mysql> start slave;
#查看状态
mysql> show slave status G
#删除记录
mysql> reset slave;
#停止
mysql> stop slave;
mysql> change master to master_host='192.168.17.128',master_user='slave',master_password='123456',master_port=3360,master_log_file='mysql-bin.000004', master_log_pos=610,master_connect_retry=30;
#启动slave
mysql> start slave;
8.0
单机
配置文件
mkdir -p $data/mysqlOf8 && cd $data/mysqlOf8
cat >$data/mysqlOf8/mysqld.cnf <<-'EOF'
[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_general_ci
character_set_server = utf8mb4
skip-log-bin
key_buffer_size=512M
sort_buffer_size=32M
innodb_buffer_pool_size=2G
lower_case_table_names = 1 # 忽略mysql查询大小写
bulk_insert_buffer_size = 256M
tmp_table_size = 256M
read_buffer_size = 8M
read_rnd_buffer_size = 32M
#设置时区
default-time-zone = 'Asia/Shanghai'
#日志大小
innodb_log_file_size=256M
#日志缓存大小
innodb_log_buffer_size=12M
innodb_flush_log_at_trx_commit=2
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
default_authentication_plugin=mysql_native_password
#保存7天
binlog_expire_logs_seconds=604800
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
EOF
启动脚本
cat >$data/mysqlOf8/install.sh <<-'EOF'
#!/bin/bash
read -p "端口: " port
dir_work=$(cd `dirname $0`; pwd)
mkdir $dir_work/{data,conf,logs} -p
cp mysqld.cnf $dir_work/conf
docker run -d -p $port:3306 --privileged=true --restart always -v $dir_work/logs:/var/log/mysql -v $dir_work/conf:/etc/mysql/conf.d -v $dir_work/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql$port mysql:8.0.28
EOF
启动:
sh install.sh
链接
192.168.1.10 #ip
3380 #端口
root #用户名
123456 #密码
报错1
连接数据库出现Host 'xxx' is blocked because of many connection error; unblock with 'mysqladmin flush-hosts'的解决方法(xshell-Linux-mysql)
问题截图:
mysql --default-character-set=utf8 -u root -p123456 -h localhost -P 3306 -A #登录
show variables like '%max_connect_errors%';
set global max_connect_errors=3000; #为了安全最好小一点。
报错2
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "docker-entrypoint.sh": executable file not found in $PATH: unknown.
下载
https://github.com/opencontainers/runc/tags
mv runc.amd64 runc
cp runc /usr/local/bin/
cp runc /usr/local/sbin/
cp runc /usr/bin/
集群
postgresql
单机
创建文件并授权
mkdir -p $data/pg/data && chmod -R 777 $data/pg/data
创建容器
docker run --name postgres1 -e POSTGRES_USER="postgres" -e POSTGRES_DB="postgres" -e POSTGRES_PASSWORD=123456 -p 5433:5432 --privileged=true --restart always -v $data/pg/data:/var/lib/postgresql/data -v $data/pg/logs:/var/log/postgresql -d postgres:12
查询
docker exec -it postgres1 bash #进入
psql -U postgres #登录数据库
链接
192.168.1.10 #ip
5433 #端口
postgres #用户名
123456 #密码
集群
部署ip分布图
ip 容器名 备注 用户名 密码
172.16.110.87 postgres-master postgresql11.9主服务 root Test@123
172.16.110.88 postgres-slave postgresql11.9从服务 root Test@123
第一台pg
加载镜像
docker load -i postgres11.9-docker.tar
新建包并授权
mkdir -p $data/pg/data && chmod -R 777 $data/pg
启动容器
docker run --name postgres-master -e POSTGRES_USER="postgres" -e POSTGRES_DB="postgres" -e POSTGRES_PASSWORD=postgres -p 5432:5432 --privileged=true --restart always -v $data/pg/data:/var/lib/postgresql/data -d postgres:11.9
配置文件
追加配置
cat >> $data/pg/data/postgresql.conf <<-'EOF'
temp_buffers = 512MB
work_mem = 32MB
maintenance_work_mem = 512MB
max_stack_depth = 4096kB
archive_mode = on # 允许归档
archive_command = '/bin/date' # 用该命令来归档logfile segment,这里取消归档。
wal_level = replica #开启热备
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 64 # 设置流复制保留的最多的xlog数目,一份是 16M,注意机器磁盘 16M*64 = 1G
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 200 # 这个设置要注意下,从库的max_connections必须要大于主库的
EOF
修改配置
sed -i 's/shared_buffers = 128MB/shared_buffers = 8192MB/' $data/pg/data/postgresql.conf
pg_hba.conf配置文件
vi $data/pg/data/pg_hba.conf
# replication privilege 在这个下面加入
host replication replica 0.0.0.0/0 md5
确认
cat $data/pg/data/pg_hba.conf
最后几行如下图
进入容器
docker exec -it postgres-master bash
新增同步用户
#登录数据库
psql -U postgres
#创建用户
CREATE ROLE replica login replication encrypted password 'replica';
#查看所有用户
du
#退出数据库
exit
#退出容器
exit
重启容器
docker restart postgres-master
删除容器和目录
重置使用,一般不要操作
docker rm -f postgres-master && rm -rf $data/pg
第二台pg
加载镜像
docker load -i postgres11.9-docker.tar
启动容器
docker run --name postgres-slave -e POSTGRES_USER="postgres" -e POSTGRES_DB="postgres" -e POSTGRES_PASSWORD=postgres -p 5432:5432 --privileged=true --restart always -v $data/pg/data:/var/lib/postgresql/data -d postgres:11.9
进入容器
docker exec -it postgres-slave bash
配置从pg
#登录服务器
su postgres
#删除配置
rm -rf /var/lib/postgresql/data/*
#确认是否删除成功
cd /var/lib/postgresql/data
#查看所有文件
ls
#ip为主pg的ip
pg_basebackup -h 172.16.110.87 -U replica -D /var/lib/postgresql/data -X stream -P
等待10几秒,自动跳出容器
172.16.110.87为postgres-master节点ip地址
cat >$data/pg/data/recovery.conf <<-'EOF'
standby_mode = on
primary_conninfo = 'host=172.16.110.87 port=5432 user=replica password=replica'
recovery_target_timeline = 'latest'
EOF
修改
sed -i 's/max_connections = 200/max_connections = 1000/' $data/pg/data/postgresql.conf
追加配置
cat >> $data/pg/data/postgresql.conf <<-'EOF'
hot_standby = on
wal_receiver_status_interval = 10s
max_standby_streaming_delay = 30s
hot_standby_feedback = on
EOF
重启容器
docker restart postgres-slave
查看日志
docker logs --tail 300 -f postgres-slave
删除容器和目录
docker rm -f postgres-slave
rm -rf $data/pg
验证
docker exec -it postgres-master bash
psql -U postgres
#进入主库
SELECT usename , application_name , client_addr, sync_state FROM pg_stat_replication;
主库上,我们创建test_ms表,并插入了一条数据,我们就可以在备库上进行查询观察是否同步成功:
CREATE DATABASE "test";
create table test_ms(id int4);
insert into test_ms values(6);
接下来,我们再主库上,再操作
insert into test_ms values(9);
delete from test_ms where id=6;
那么我们如果在备份库上进行数据操作,情况会怎样呢?我们再备份上执行:
postgres=# insert into test_ms values(6);
ERROR: cannot execute INSERT in a read-only transaction
STATEMENT: insert into test_ms values(6);
ERROR: cannot execute INSERT in a read-only transaction
结论:备份库只允许读,不允许写和删除
主备切换测试
在主服务上操作
docker stop postgres-master;
1.在备库上执行pg_ctl promote命令**备库,如果recovery.conf变成recovery.done表示备库已切换成主库
docker exec -it postgres-slave bash
su postgres
/usr/lib/postgresql/11/bin/pg_ctl promote -D $PGDATA
waiting for server to promote.... done
server promoted
在新库中(postgres-slave)查询
select pg_is_in_recovery();
也可以利用,备份库只允许读,不允许写和删除这个结论,这个在切好的主库(postgres-slave),插入数据和删除数据验证.
Sql Server
docker pull mcr.microsoft.com/mssql/server:2019-latest
mkdir -p $data/sqlserver && chmod -R 777 $data/sqlserver
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=fei891025%" -p 1433:1433 --name sqlserver2019 --privileged=true --restart always -v $data/sqlserver:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-latest
docker exec -it sqlserver2019 /bin/bash #进入容器
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P fei891025% #进入数据库
select name from sys.Databases
go
docker rm -f sqlserver2019
rm -rf $data/sqlserver
下载驱动
https://learn.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15
并安装
cmd 执行
odbcad32
确认驱动
添加DSN
输入用户名和密码
sa #用户
fei891025% #密码
链接
192.168.1.10,1433 #主机
master #初始化数据库
sa #用户
fei891025% #密码
常用sql
-- 查询版本
SELECT @@VERSION;
mariadb
docker pull mariadb
mkdir -p $data/mariadb/data
docker run --name mariadb -d -p 3390:3306 --privileged=true --restart always -e MYSQL_ROOT_PASSWORD=123456 -v $data/mariadb/data:/var/lib/mysql mariadb
tomcat
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
docker exec -it mytomcat8 bash
ngnix
mkdir $data/nginx/conf -p
docker run --privileged=true --restart always --name nginx_test -d -p 100:80 nginx:1.23
docker cp nginx_test:/etc/nginx $data/nginx/conf/
docker cp nginx_test:/usr/share/nginx/html/ $data/nginx/
docker rm -f nginx_test
#预留81到90端口,共10个端口,/usr/local/share/front为前端的部署目录
docker run --privileged=true --restart always --name nginx_one -d -p 81-90:81-90
-v $data/nginx/conf/nginx:/etc/nginx/
-v $data/nginx/html:/usr/share/nginx/html
-v /usr/local/share/front:/usr/local/share/front
nginx:1.23
docker restart nginx_one #重新加载nginx配置文件
docker logs --tail 300 -f nginx_one #查看日志
docker exec -it nginx_one /bin/bash #进入容器
docker rm -f nginx_one #删除容器
修改配置
cd $data/nginx/conf/nginx/conf.d
vi default.conf
listen 81; # listen 80改为81
:wq #保存
docker restart nginx_one
请求地址
http://192.168.1.10:81/
前端
测试页面
cat >/usr/local/share/front/index.html <<-'EOF'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>你好</title>
</head>
<body>
<h1>测试</h1>
</body>
</html>
EOF
配置文件
cat >$data/nginx/conf/nginx/conf.d/test.conf <<-'EOF'
server {
listen 83;
server_name 152.136.54.94;
location / {
#文件根目录,
root /usr/local/share/html;
#默认页名称
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
EOF
反向代理
cat >$data/nginx/conf/nginx/conf.d/rearEnd.conf <<-'EOF'
upstream tempone{
#不能带http前缀和路径
server 152.136.54.94:8080;
}
#一个server等于一个虚拟主机vhost
server {
#监听端口号
listen 83;
#主机名或者域名
server_name 152.136.54.94;
#匹配路径
location / {
proxy_pass http://tempone;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
}
#报错编码对应页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
EOF
重启
docker restart nginx_one
代理nacos
cat >$data/nginx/conf/nginx/conf.d/nacos.conf <<-'EOF'
server {
listen 81;
server_name localhost;
location / {
proxy_pass http://121.5.133.79:8848/nacos/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
EOF
重启
docker restart nginx_one
代理mysql和pg,redis
#内网ip:10.0.4.7
cat >> $data/nginx/conf/nginx/nginx.conf <<-'EOF'
stream {
#代理mysql
upstream mysql_server {
server 10.0.4.7:3306;
}
server {
listen 82;
proxy_pass mysql_server;
}
#代理pg
upstream pgsql {
server 10.0.4.7:5433;
}
server {
listen 83;
proxy_connect_timeout 30s;
proxy_timeout 30s;
proxy_pass pgsql;
}
#代理redis
upstream redis {
server 10.0.4.7:6379;
}
server {
listen 84;
proxy_pass redis;
}
}
EOF
重新加载配置
docker restart nginx_one #重启容器,重新加载配置文件
查看日志
docker logs --tail 300 -f nginx_one #查看日志
redis
单机
下载配置文件
https://redis.io/docs/management/config/
创建容器
docker run -p 6389:6379 --privileged=true --restart always --name redisStandAlone -v $data/redisStandAlone/data:/data -d redis:6.2.6 --appendonly yes --requirepass "12345678"
验证
docker exec -it redisStandAlone /bin/bash #进入容器
redis-cli -p 6379 -a 12345678 #连接集群 -c优化路由
删除容器
docker rm -f redisStandAlone
查看日志
docker logs --tail 300 -f redisStandAlone
redis主从集群
mkdir -p $data/redis #创建文件夹
chmod -R 777 $data/redis #授权文件
cd $data/redis #进入文件夹
vi redis-cluster.tmpl #编辑
需要配置文件
redis-cluster.tmpl内容
修改cluster-announce-ip为本地ip
port ${PORT}
masterauth abc20211221!
requirepass abc20211221!
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.10
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
maxmemory 1024MB
maxmemory-policy volatile-ttl
配置文件说明
appendonly no #开启aof缓存,但是要频繁I/O,建议关掉
maxmemory 1024MB #最大内存限制,否则可能内存撑爆
maxmemory-policy volatile-ttl #淘汰策略,如果内存撑爆了不会拒绝插入数据
生成配置文件和目录
for port in `seq 7001 7006`; do
mkdir -p ./${port}/conf
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf
&& mkdir -p ./${port}/data;
done
创建6个容器
for port in `seq 7001 7006`; do
docker run -d --net=host --privileged=true --restart always -v $data/redis/${port}/conf/redis.conf:/etc/redis/redis.conf -v $data/redis/${port}/data:/data --restart always --name=redis-${port} redis:6.2.6 redis-server /etc/redis/redis.conf;
done
创建集群
docker exec -it redis-7001 /bin/bash #进入容器
redis-cli -a abc20211221! --cluster create 192.168.1.10:7001 192.168.1.10:7002 192.168.1.10:7003 192.168.1.10:7004 192.168.1.10:7005 192.168.1.10:7006 --cluster-replicas 1 #创建集群
# --cluster-replicas 1 表示为每个master创建一个slave节点
验证集群
docker exec -it redis-7001 /bin/bash #进入容器
redis-cli -c -p 7001 -a abc20211221! #连接集群 -c优化路由
cluster info #查看集群信息
cluster nodes #查看节点
auth abc20211221! #验证密码正确性(abc20211221!密码)
不需要配置文件
创建持久化文件目录
for port in `seq 6381 6386`; do
mkdir -p $data/redis${port}/data;
done
启动容器
for port in `seq 6381 6386`; do
docker run -d --name redis-node-${port} --net host --privileged=true --restart always -v $data/redis${port}/data:/data redis:6.2.6 --cluster-enabled yes --appendonly yes --port ${port} --requirepass 'abc20211221!' --masterauth 'abc20211221!' ;
done
创建集群
docker exec -it redis-node-6381 /bin/bash #进入容器
redis-cli -a abc20211221! --cluster create 192.168.1.10:6381 192.168.1.10:6382 192.168.1.10:6383 192.168.1.10:6384 192.168.1.10:6385 192.168.1.10:6386 --cluster-replicas 1 #创建集群
验证集群
docker exec -it redis-node-6381 /bin/bash #进入容器
redis-cli -c -p 6381 -a abc20211221! #连接集群 -c优化路由
cluster info #查看集群信息
cluster nodes #查看节点
auth abc20211221! #查看密码是否正确
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221! #查看集群信息
主从扩容
创建持久化文件目录
for port in `seq 6387 6388`; do
mkdir -p $data/redis${port}/data;
done
启动容器
for port in `seq 6387 6388`; do
docker run -d --name redis-node-${port} --net host --privileged=true --restart always -v $data/redis${port}/data:/data redis:6.2.6 --cluster-enabled yes --appendonly yes --port ${port} --requirepass 'abc20211221!' --masterauth 'abc20211221!' ;
done
进入容器
docker exec -it redis-node-6387 /bin/bash
将新增的6387作为master节点加入集群
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:63816387 就是将要作为master新增节点6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
#加入集群
redis-cli --cluster add-node 192.168.17.143:6387 192.168.17.143:6381 -a abc20211221!
查看节点信息
docker exec -it redis-node-6381 /bin/bash
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221!
重新分派槽号
命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.17.143:6381 -a abc20211221!
参考下图
重新查看节点信息
docker exec -it redis-node-6381 /bin/bash
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221!
为什么6387是3个新的区间,以前的还是连续?
重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
新增从节点到6387下
命令格式:
redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
如下:
redis-cli --cluster add-node 192.168.17.143:6388 192.168.17.143:6387 --cluster-slave --cluster-master-id 128f99dd3c1e09b734c768062e1de58054da9f2f -a abc20211221!
#192.168.17.143:6387的编号
128f99dd3c1e09b734c768062e1de58054da9f2f
查看集群信息
docker exec -it redis-node-6381 /bin/bash
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221!
redis-cli -c -p 6381 -a abc20211221! #连接集群 -c优化路由
cluster info #查看集群信息
cluster nodes #查看节点
auth abc20211221! #查看密码是否正确
主从缩容
查看集群信息得到6378的id
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221! #查看集群信息
将6378删除掉
命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.17.143:6388
258b5b906b189ff569bf019fd8bcaf742274a74f -a abc20211221!
重新分配槽位
redis-cli --cluster reshard 192.168.17.143:6381 -a abc20211221!
move的4096 ,16384/master台数,
下图为6387的槽位移动到6381下
确认集群
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221!
删除6387
redis-cli --cluster del-node 192.168.17.143:6387
128f99dd3c1e09b734c768062e1de58054da9f2f -a abc20211221!
确认集群
redis-cli --cluster check 192.168.17.143:6381 -a abc20211221!
删除容器
for port in `seq 6387 6388`; do
docker rm -f redis-node-${port}
rm -rf $data/redis${port}
done
gitlab
官方文档:https://docs.gitlab.com/ee/
官网地址
https://docs.gitlab.cn/jh/install/docker.html
创建容器
docker run -d -p 443:443 -p 9100:9100 -p 222:22 --name gitlab --privileged=true --restart always -v $data/gitlab/config:/etc/gitlab -v $data/gitlab/logs:/var/log/gitlab -v $data/gitlab/data:/var/opt/gitlab --shm-size 256m registry.gitlab.cn/omnibus/gitlab-jh:latest
修改配置文件
cat >> $data/gitlab/config/gitlab.rb<<-'EOF'
# 配置http协议所使用的访问地址,不加端口号默认为80
#修改ip
external_url 'http://192.168.1.10:9100'
nginx['listen_port'] = 9100
# 配置ssh协议所使用的访问地址和端口
#配置ip
gitlab_rails['gitlab_ssh_host'] = '192.168.1.10'
#此端口是run时22端口映射的222端口
gitlab_rails['gitlab_shell_ssh_port'] = 222
# 关闭业务监控
prometheus_monitoring['enable'] = false
puma['enable'] = true
puma['worker_timeout'] = 60
# 进程数(最低2,默认cpu核数+1)
puma['worker_processes'] = 2
puma['min_threads'] = 4
puma['per_worker_max_memory_mb'] = 300
# sidekiq并发数
sidekiq['max_concurrency'] = 16
#数据库缓存大小
postgresql['shared_buffers'] = "256MB"
# 数据库并发数
postgresql['max_worker_processes'] = 8
# 邮箱是否启用
gitlab_rails['smtp_enable'] = true
# SMTP服务的地址
gitlab_rails['smtp_address'] = "smtp.qq.com"
# 端口
gitlab_rails['smtp_port'] = 465
# 你的QQ邮箱(发送账号)
gitlab_rails['smtp_user_name'] = "1115758907@qq.com"
# 授权码
gitlab_rails['smtp_password'] = "viuztdmmikbpgdhc"
# 域名
gitlab_rails['smtp_domain'] = "smtp.qq.com"
# 登录验证
gitlab_rails['smtp_authentication'] = "login"
# 使用了465端口,就需要配置下面三项
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
# 你的QQ邮箱(发送账号)
gitlab_rails['gitlab_email_from'] = '1115758907@qq.com'
EOF
重启gitlab容器
docker restart gitlab #等5分钟左右
删除容器
docker rm -f gitlab
查看日志
docker logs --tail 300 -f gitlab
修改密码
docker exec -it gitlab bash #进入容器
#查看密码进入页面去修改密码
cat /etc/gitlab/initial_root_password #查看密码
# WARNING: This value is valid only in the following conditions
# 1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
# 2. Password hasn't been changed manually, either via UI or via command line.
#
# If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.
#密码
Password: PIkQp601lbr4YjFa+VXBguzNsoybvTZkKHpMSEq/scA=
# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
#另一种方式修改密码
gitlab-rails console -e production #启动Ruby on Rails控制台
user = User.where(id: 1).first
user.password = 'abc123456' #更改密码
user.password_confirmation = 'abc123456' #更改密码
user.save! #保存更改
登录
192.168.1.10:9100 #使用端口80
Nacos(1.4.3)
单机:
启动容器
docker pull nacos/nacos-server:v1.4.3
docker run -d -p 8848:8848
-e MODE=standalone
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=$ipTemp
-e MYSQL_SERVICE_PORT=3306
-e MYSQL_SERVICE_DB_NAME=nacos
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_DATABASE_NUM=1
-e JVM_XMS=512m
-e JVM_XMX=512m
-v $data/nacos/logs:/home/nacos/logs
--restart always --name nacos nacos/nacos-server:v1.4.3
docker run -d -p 8848:8848
-e MODE=standalone
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=192.168.1.10
-e MYSQL_SERVICE_PORT=3306
-e MYSQL_SERVICE_DB_NAME=nacos
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_DATABASE_NUM=1
-e JVM_XMS=512m
-e JVM_XMX=512m
-v $data/nacos/logs:/home/nacos/logs
--restart always --name nacos nacos/nacos-server:v1.4.3
删除容器
docker rm -f nacos
rm -rf $data/nacos #删除安装目录
docker logs --tail 300 -f nacos #查看日志
登录地址
http://192.168.1.10:8848/nacos/#/login
nacos #账号和密码
集群:
容器1
docker run -d --restart always
-e MODE=cluster
-e NACOS_APPLICATION_PORT=8845
-e NACOS_SERVERS=$ipTemp:8845,$ipTemp:8846,$ipTemp:8847
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=$ipTemp
-e MYSQL_SERVICE_PORT=3306
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_SERVICE_DB_NAME=nacos
-e NACOS_SERVER_IP=$ipTemp
-v $data/nacos-server/nacoslogs8845:/home/nacos/logs
-p 8845:8845
--name nacos8845
nacos/nacos-server:v1.4.3
容器2:
docker run -d --restart always
-e MODE=cluster
-e NACOS_APPLICATION_PORT=8846
-e NACOS_SERVERS=$ipTemp:8845,$ipTemp:8846,$ipTemp:8847
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=$ipTemp
-e MYSQL_SERVICE_PORT=3306
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_SERVICE_DB_NAME=nacos
-e NACOS_SERVER_IP=$ipTemp
-v $data/nacos-server/nacoslogs8846:/home/nacos/logs
-p 8846:8846
--name nacos8846
nacos/nacos-server:v1.4.3
容器3
docker run -d --restart always
-e MODE=cluster
-e NACOS_APPLICATION_PORT=8847
-e NACOS_SERVERS=$ipTemp:8845,$ipTemp:8846,$ipTemp:8847
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=$ipTemp
-e MYSQL_SERVICE_PORT=3306
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_SERVICE_DB_NAME=nacos
-e NACOS_SERVER_IP=$ipTemp
-v $data/nacos-server/nacoslogs8847:/home/nacos/logs
-p 8847:8847
--name nacos8847
nacos/nacos-server:v1.4.3
删除所有容器
for port in $(seq 8845 8847); do docker rm -f nacos$port; done
重启服务器
reboot #重启
部署nginx做nacos的负载均衡
配置文件如下,其他参考nginx部署
cat >$data/nginx/conf/nginx/conf.d/nacos.conf <<-'EOF'
#不能带http前缀和路径
upstream tempone{
server 192.168.1.10:8845;
server 192.168.1.10:8846;
server 192.168.1.10:8847;
}
server {
#监听端口号
listen 81;
#主机名或者域名
server_name localhost;
#匹配路径
location / {
proxy_pass http://tempone;
}
#报错编码对应页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
EOF
重启ng
docker restart nginx_one
docker logs --tail 300 -f nginx_one
sentinel(1.8.1)
docker pull bladex/sentinel-dashboard:1.7.2
docker run --name sentinel1 --restart always -d -p 8860:8858 bladex/sentinel-dashboard:1.7.2
docker rm -f sentinel
访问
http://192.168.1.10:8860/
服务名: sentinel
密码: sentinel
seata(1.42)
配置文件
mkdir -p $data/seata-server/seata-config
cat >$data/seata-server/seata-config/registry.conf <<-'EOF'
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.1.10:81"
group = "DEFAULT_GROUP"
namespace = "6ae9a1aa-bbd0-4193-a723-7d112e55f59a"
cluster = "SH"
username = "nacos"
password = "nacos"
}
}
config {
type = "nacos"
nacos {
serverAddr = "192.168.1.10:81"
namespace = "a1ecbd7c-c022-4bf8-920a-7191b9c24d05"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}
}
EOF
nacos配置需要的文件
Data ID:seataServer.properties
Group:SEATA_GROUP
配置格式:Properties
内容如下:
# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
#自己数据库的连接
store.db.url=jdbc:mysql://192.168.1.10:3306/seata1_4_2?useUnicode=true&rewriteBatchedStatements=true
#自己数据库的用户
store.db.user=root
#自己数据库的密码
store.db.password=123456
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
服务端初始化sql
连接到上面数据库192.168.1.10:3306/seata1_4_2 初始化下面的表
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_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
-- 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 = utf8;
-- 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),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
每个业务里面需要sql
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',
`xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';
下载镜像
docker pull seataio/seata-server:1.4.2 #下载镜像
启动容器
docker run -d --restart always --name seata-server -p 8091:8091
-e SEATA_CONFIG_NAME=file:/root/seata-config/registry
-e SEATA_IP=192.168.1.10
-v $data/seata-server/seata-config:/root/seata-config
seataio/seata-server:1.4.2
进入容器
docker exec -it seata-server sh #进入容器
docker logs --tail 300 -f seata-server #查看日志
删除容器
docker rm -f seata-server #删除容器
consul
单机
docker run --name=consul-server-1 --restart always --privileged=true -p 8501:8500 -v $data/consul/data:/consul/data -e CONSUL_BIND_INTERFACE=eth0 -d consul:1.11.1 agent -server -client=0.0.0.0 -bootstrap -ui -node=1
查询ip,下面join
docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul-server-1
查询节点信息
curl http://[ip]:8500/v1/catalog/nodes
访问:
http://[ip]:8500 #浏览器访问
剔除无效服务
curl -X PUT http://[ip]:8500/v1/agent/service/deregister/[service_id]
剔除无效节点
curl -X PUT http://[ip]:8500/v1/agent/force-leave/[node_id]
集群:
#添加两个Server节点,名称为-node=2,-node=3 join 为上面查询成员信息的Address
docker run --restart always --name=consul-server-2 -e CONSUL_BIND_INTERFACE=eth0 -d consul:1.11.1 agent -server -node=2 -join='172.17.0.7'
docker run --restart always --name=consul-server-3 -e CONSUL_BIND_INTERFACE=eth0 -d consul:1.11.1 agent -server -node=3 -join='172.17.0.7'
查询成员信息
docker exec consul-server-1 consul members
查看节点选举投票结果
docker exec consul-server-1 consul operator raft list-peers
删除镜像
docker rm -f consul-server-1
docker rm -f consul-server-2
docker rm -f consul-server-3
简单版可视化工具Portainer
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -v $data/portainer/portainer_data:/data portainer/portainer
首次访问 ip:9000 创建admin用户
创建容器
CAdvisor+InfluxDB+Granfana
创建docker-compose.yml文件
cat > docker-compose.yml <<-'EOF'
version: '3.1'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "8086:8086"
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
links:
- influxdb:influxsrv
command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
user: "104"
image: grafana/grafana
user: "104"
restart: always
links:
- influxdb:influxsrv
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
EOF
校验语法错误
docker-compose config -q
启动
docker-compose up -d
验证
浏览cAdvisor收集服务,http://ip:8080/ 第一次访问慢,cadvisor也有基础的图形展现功能,这里主要用它来作数据采集
浏览influxdb存储服务,http://ip:8083/
浏览grafana展现服务,http://ip:3000 ip+3000端口的方式访问,默认帐户密码(admin/admin)
设置数据库
zookeeper
单机
#创建容器
docker run -d --name zookeeper -v $data/zookeeper/data:/data -p 2191:2181 --restart always -e JVMFLAGS="-Xmx1024m" zookeeper:3.8.0
验证
#使用命令行连接
docker run -it --rm --link zookeeper:zookeeper zookeeper:3.8.0 zkCli.sh -server zookeeper
ls / #根节点
ls /services #查看节点信息
ls /zookeeper #查看某个节点下的子节点(zookeeper)
#创建节点
create /aa test # 创建持久化节点,test是数据
create -s /bb test # 创建持久序列化节点
create -e /cc test # 创建临时节点
create -e -s /dd test # 创建临时序列化节点
#增删改查
create /aa test #新增节点数据
delete /aa #删除节点
set /aa test01 #修改节点数据
get /aa #获得节点数据
create /aa/test hello
create /aa/test/hello "ni hao a" #赋值内容
docker exec -it zookeeper bash #进入容器
docker rm -f zookeeper #删除节点
查看节点信息
集群
#创建网络
docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 zoonet
docker network ls #查询所有网络
docker network inspect zoonet #查看网络详情
创建集群
docker run -d -p 2181:2181 --name zookeeper_node1 --privileged --restart always --network zoonet --ip 172.18.0.2
-v $data/zookeeper_node1/data:/data
-v $data/zookeeper_node1/datalog:/datalog
-v $data/zookeeper_node1/logs:/logs
-e ZOO_MY_ID=1
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181" zookeeper:3.8.0
docker run -d -p 2182:2181 --name zookeeper_node2 --privileged --restart always --network zoonet --ip 172.18.0.3
-v $data/zookeeper_node2/data:/data
-v $data/zookeeper_node2/datalog:/datalog
-v $data/zookeeper_node2/logs:/logs
-e ZOO_MY_ID=2
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181" zookeeper:3.8.0
docker run -d -p 2183:2181 --name zookeeper_node3 --privileged --restart always --network zoonet --ip 172.18.0.4
-v $data/zookeeper_node3/data:/data
-v $data/zookeeper_node3/datalog:/datalog
-v $data/zookeeper_node3/logs:/logs
-e ZOO_MY_ID=3
-e "ZOO_SERVERS=server.1=172.18.0.2:2888:3888;2181 server.2=172.18.0.3:2888:3888;2181 server.3=172.18.0.4:2888:3888;2181" zookeeper:3.8.0
验证集群
#创建三个窗口
docker exec -it zookeeper_node1 bash
docker exec -it zookeeper_node2 bash
docker exec -it zookeeper_node3 bash
./bin/zkServer.sh status #查看状态
docker exec -it zookeeper_node1 zkCli.sh #进入zookeeper命令行
ls /services #列出所有服务
RabbitMQ
docker search rabbitmq
docker pull rabbitmq:3.9-management
docker run --privileged=true -d -p 5672:5672 -p 15672:15672 --name rabbitmq -v $data/rabbitmq/data:/var/lib/rabbitmq --restart=always --hostname=rabbitmqhost -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.9-management
#RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
#RABBITMQ_DEFAULT_USER:默认的用户名;
#RABBITMQ_DEFAULT_PASS:默认用户名的密码
docker rm -f rabbitmq
docker exec -it rabbitmq /bin/bash
请求地址
http://192.168.1.10:15672
#账号:admin
#密码:admin
ActionMQ
docker search activemq
docker pull webcenter/activemq
docker run -d --privileged=true --restart always --name activemq -p 61617:61616 -p 8162:8161 -v $data/activemq/data:/opt/activemq/data webcenter/activemq:latest
#-p 61617:61616 容器中映射
#-p 8162:8161 web中映射
docker rm -f activemq
请求地址:
http://192.168.1.10:8162
#账号:admin
#密码:admin
RocketMQ
搜索镜像
docker search rocketmq
选择版本:
curl https://registry.hub.docker.com/v1/repositories/foxiswho/rocketmq/tags | tr -d '[[]" ]' | tr '}' ' ' | awk -F: -v image='foxiswho/rocketmq' '{if(NR!=NF && $3 != ""){printf("%s:%s ",image,$3)}}'
启动Server
mkdir $data/rocketmq_server/{logs,store} -p
chmod -R 777 $data/rocketmq_server
docker run -d --privileged=true --restart always
-v $data/rocketmq_server/logs:/home/rocketmq/logs
-v $data/rocketmq_server/store:/data/rocketmq/store
--name rmqnamesrv
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m"
-p 9876:9876
foxiswho/rocketmq:4.8.0
sh mqnamesrv
创建文件夹
mkdir $data/rocketmq_broker/{logs,store,conf} -p
chmod -R 777 $data/rocketmq_broker
配置文件
cat >$data/rocketmq_broker/conf/broker.conf <<-'EOF'
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 写自己的ip
brokerIP1 = 192.168.1.10
autoCreateTopicEnable = true
EOF
全部配置文件
https://github.com/foxiswho/docker-rocketmq.git
./docker-rocketmq/rmq/rmq/brokerconf/ #这个目录下
如下
#所属集群名字
brokerClusterName=DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样,如果在broker-a.properties使用:broker-a,
#在broker-b.properties使用:broker-b
brokerName=broker-a
#0 表示Master,>0 表示Slave
brokerId=0
#nameServer地址,分号分割
#namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
namesrvAddr=rmqnamesrv:9876
#启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed
# 解决方式1 加上一句producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP
brokerIP1=192.168.1.10
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 !!!这里仔细看是false,false,false
#原因下篇博客见~ 哈哈哈哈
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
#storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
#commitLog 存储路径
#storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
#消费队列存储
#storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
#消息索引存储路径
#storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
#checkpoint 文件存储路径
#storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
#abort 文件存储路径
#abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
启动Broker
docker run -d --privileged=true --restart always --name rmqbroker
-v $data/rocketmq_broker/logs:/home/rocketmq/logs
-v $data/rocketmq_broker/store:/home/rocketmq/store
-v $data/rocketmq_broker/conf:/home/rocketmq/conf
-e "NAMESRV_ADDR=192.168.1.10:9876"
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn128m"
-p 10911:10911 -p 10912:10912 -p 10909:10909
foxiswho/rocketmq:4.8.0
sh mqbroker -c /home/rocketmq/conf/broker.conf
console
docker run -d --privileged=true --restart always --name rmqcomsole
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.10:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
-p 8180:8080 -t styletang/rocketmq-console-ng
访问
192.168.1.10:8180
删除容器
docker rm -f rmqnamesrv
docker rm -f rmqbroker
docker rm -f rmqcomsole
kafka
docker search kafka
#需要先安装zookeeper
docker pull wurstmeister/kafka
docker run -d --name kafka
-p 9092:9092
-e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=192.168.17.143:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.17.143:9092
-e KAFKA_LISTENERS=PLAINTEXT://192.168.17.143:9092 wurstmeister/kafka
管理页面
mkdir -p $data/kafka-eagle/conf
cd $data/kafka-eagle/conf
配置文件
cat >system-config.properties <<-'EOF'
######################################
# multi zookeeper & kafka cluster list
######################################
# kafka.eagle.zk.cluster.alias=cluster1,cluster2
# cluster1.zk.list=tdn1:2181,tdn2:2181,tdn3:2181
# cluster2.zk.list=xdn10:2181,xdn11:2181,xdn12:2181
kafka.eagle.zk.cluster.alias=cluster1
cluster1.zk.list=192.168.17.143:2181
######################################
# zookeeper enable acl
######################################
cluster1.zk.acl.enable=false
cluster1.zk.acl.schema=digest
cluster1.zk.acl.username=test
cluster1.zk.acl.password=test123
######################################
# broker size online list
######################################
cluster1.kafka.eagle.broker.size=20
######################################
# zk client thread limit
######################################
kafka.zk.limit.size=25
######################################
# kafka eagle webui port
######################################
kafka.eagle.webui.port=8048
######################################
# kafka jmx acl and ssl authenticate
######################################
cluster1.kafka.eagle.jmx.acl=false
cluster1.kafka.eagle.jmx.user=keadmin
cluster1.kafka.eagle.jmx.password=keadmin123
cluster1.kafka.eagle.jmx.ssl=false
cluster1.kafka.eagle.jmx.truststore.location=/Users/dengjie/workspace/ssl/certificates/kafka.truststore
cluster1.kafka.eagle.jmx.truststore.password=ke123456
######################################
# kafka offset storage
######################################
cluster1.kafka.eagle.offset.storage=kafka
cluster2.kafka.eagle.offset.storage=zk
######################################
# kafka metrics, 15 days by default
######################################
kafka.eagle.metrics.charts=true
kafka.eagle.metrics.retain=15
######################################
# kafka sql topic records max
######################################
kafka.eagle.sql.topic.records.max=5000
######################################
# delete kafka topic token
######################################
kafka.eagle.topic.token=keadmin
######################################
# kafka sasl authenticate
######################################
cluster1.kafka.eagle.sasl.enable=false
cluster1.kafka.eagle.sasl.protocol=SASL_PLAINTEXT
cluster1.kafka.eagle.sasl.mechanism=SCRAM-SHA-256
cluster1.kafka.eagle.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka" password="kafka-eagle";
cluster1.kafka.eagle.sasl.client.id=
cluster1.kafka.eagle.blacklist.topics=
cluster1.kafka.eagle.sasl.cgroup.enable=false
cluster1.kafka.eagle.sasl.cgroup.topics=
cluster2.kafka.eagle.sasl.enable=false
cluster2.kafka.eagle.sasl.protocol=SASL_PLAINTEXT
cluster2.kafka.eagle.sasl.mechanism=PLAIN
cluster2.kafka.eagle.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-eagle";
cluster2.kafka.eagle.sasl.client.id=
cluster2.kafka.eagle.blacklist.topics=
cluster2.kafka.eagle.sasl.cgroup.enable=false
cluster2.kafka.eagle.sasl.cgroup.topics=
######################################
# kafka ssl authenticate
######################################
cluster3.kafka.eagle.ssl.enable=false
cluster3.kafka.eagle.ssl.protocol=SSL
cluster3.kafka.eagle.ssl.truststore.location=
cluster3.kafka.eagle.ssl.truststore.password=
cluster3.kafka.eagle.ssl.keystore.location=
cluster3.kafka.eagle.ssl.keystore.password=
cluster3.kafka.eagle.ssl.key.password=
cluster3.kafka.eagle.blacklist.topics=
cluster3.kafka.eagle.ssl.cgroup.enable=false
cluster3.kafka.eagle.ssl.cgroup.topics=
######################################
# kafka sqlite jdbc driver address
######################################
kafka.eagle.driver=org.sqlite.JDBC
kafka.eagle.url=jdbc:sqlite:/hadoop/kafka-eagle/db/ke.db
kafka.eagle.username=root
kafka.eagle.password=www.kafka-eagle.org
######################################
# kafka mysql jdbc driver address
######################################
#kafka.eagle.driver=com.mysql.jdbc.Driver
#kafka.eagle.url=jdbc:mysql://127.0.0.1:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
#kafka.eagle.username=root
#kafka.eagle.password=123456
EOF
nexus3
docker search nexus3 #搜索镜像
docker pull sonatype/nexus3 #拉取镜像
mkdir -p $data/nexus/nexus-data #创建文件
chmod 777 $data/nexus/nexus-data
启动
docker run -d --name nexus --privileged=true --restart=always -p 8081:8081 -v $data/nexus/nexus-data:/nexus-data sonatype/nexus3
请求地址
http://192.168.1.10:8081
查看密码并登录
cat $data/nexus/nexus-data/admin.password #进入之后,文件自动删除
#设置密码为:1
删除
docker rm -f nexus
Jenkins
docker pull jenkins/jenkins
mkdir -p $data/jenkins
chmod 777 $data/jenkins
启动
docker run -u root -d -p 8060:8080 -p 50000:50000
--privileged=true --restart=always
-v $data/jenkins:/var/jenkins_home
-v /usr/local/maven:/usr/local/maven
-v /usr/local/jdk:/usr/local/jdk
-v /etc/localtime:/etc/localtime
-v /var/run/docker.sock:/var/run/docker.sock
--name myjenkins
jenkins/jenkins
修改镜像
vi $data/jenkins/hudson.model.UpdateCenter.xml #修改配置文件
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json #清华大学镜像
docker restart myjenkins #重启
查看密码
cat $data/jenkins/secrets/initialAdminPassword
进入容器
docker exec -it myjenkins bash
访问
http://192.168.1.10:8060
查看日志
docker logs --tail 300 -f myjenkins
删除
docker rm -f myjenkins
minio
docker pull minio/minio
docker run -p 9010:9000 -p 9020:9020
--name minio
-d --restart=always
-e "MINIO_ACCESS_KEY=admin"
-e "MINIO_SECRET_KEY=admin123456"
-v $data/minio/data:/data
-v $data/minio/config:/root/.minio
minio/minio server
/data --console-address ":9020" -address ":9000"
rm -rf $data/minio
docker rm -f minio #删除容器
登录
http://192.168.1.10:9020 #管理页面
http://192.168.1.10:9010 #代码里面配置
用户名密码
用户名:admin
密码:admin123456
设置
添加规则
docker本地仓库
docker run -d -p 5000:5000 --privileged=true --restart=always --name registry -v $data/registry:/var/lib/registry registry:2
gbase8a南大通用
创建目录
mkdir -p $data/gbase/data && chmod 777 $data/gbase/data
rm -rf $data/gbase/data
启动容器
docker run -d -p 5258:5258 -p 8099:8099 --privileged=true --restart=always --name gbase8a shihd/gbase8a:1.0
删除容器
docker rm -f gbase8a
用户名
DB: gbase
User: root
Password: root
Port: 5258
#链接
jdbc:gbase://192.168.1.10:5258/gbase?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
测试
#新建数据库
create database test;
#使用数据库
use test;
CREATE TABLE demo (
id BIGINT auto_increment primary key,
name VARCHAR(255),
age SMALLINT,
create_by VARCHAR(100),
update_by VARCHAR(100),
create_time DATETIME,
update_time DATETIME
);
#插入
INSERT INTO demo
( name, age, create_by, update_by, create_time, update_time)
VALUES('张三', 100, 'system', 'system', now(), now()),('李四', 50, 'system', 'system', now(), now());
#分页查询
select * from demo limit 2,2;
#修改语句
UPDATE demo SET name='王五',age=42 WHERE id=2;
#删除语句
DELETE FROM demo WHERE id=4;
DM
下载地址
https://www.dameng.com/list_103.html
安装地址
https://eco.dameng.com/document/dm/zh-cn/start/dm-install-docker.html
导入镜像
docker load --input dm8_20220822_rev166351_x86_rh6_64_ctm.tar
创建文件并授权
mkdir -p $data/dm8_01/data && chmod 777 $data/dm8_01/data
启动容器
docker run -d -p 5236:5236 --restart=always --name dm8_01 --privileged=true -e PAGE_SIZE=16 -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e INSTANCE_NAME=dm8_01 -v $data/dm8_01/data:/opt/dmdbms/data dm8_single:v8.1.2.128_ent_x86_64_ctm_pack4
查看日志
docker logs --tail 300 -f dm8_01
常用命令
#进入容器
docker exec -it dm8_01 bash
cd /opt/dmdbms/bin
./disql SYSDBA/SYSDBA001
-- 创建一个具有DBA权限的用户,最大会话次数1000 (默认0),失败登录次数10(默认3) 口令锁定期1分钟(默认1),密码宽限期10天(默认10)
create user "ROOT" identified by "123456789"
limit SESSION_PER_USER 10000 FAILED_LOGIN_ATTEMPS 10 PASSWORD_LOCK_TIME 1 PASSWORD_GRACE_TIME 10;
-- 创建一个具有DBA权限的用户,最大会话次数1000
create user "ROOT" identified by "123456789" limit SESSION_PER_USER 10000;
-- 授权DBA加转授
grant "DBA" to "ROOT" with admin option;
GRANT RESOURCE,VTI,SOI TO ROOT;
--创建用户表空间 初始化128M 打开自动扩充 扩充2M 最大1024M
create tablespace "TEST_TABLESPACE" datafile 'TEST_TABLESPACE.DBF' size 128 autoextend on next 2 maxsize 10240 CACHE = NORMAL;
--创建用户
CREATE USER TEST IDENTIFIED BY 123456789;
--设置用户默认表空间
ALTER USER TEST DEFAULT TABLESPACE TEST_TABLESPACE DEFAULT INDEX TABLESPACE TEST_TABLESPACE;
--给用户给予必要权限 RESOURCE 角色中,是对应用户自己用户下的全部权限
GRANT RESOURCE,VTI,SOI TO TEST;
-- 在自己的用户下为所欲为,可以查询全库的数据,但是对于其他用户下的数据,不能做增删改
grant resource any table to TEST;
grant select any table to TEST;
CREATE TABLE "TEST"."DEMO"
(
"id" BIGINT IDENTITY(1,1) PRIMARY KEY,
"name" VARCHAR(100),
"age" INTEGER,
"create_by" VARCHAR(100),
"create_time" TIMESTAMP(6),
"update_time" TIMESTAMP(6),
"update_by" VARCHAR(100)
) ;
INSERT INTO "TEST"."DEMO" ("name","age","create_by", "create_time", "update_time","update_by")
VALUES ( '张三', 19, 'system', now(),now(), 'system'),
( '李四', 20, 'system', now(),now(), 'system')
select * from DEMO limit 3,2;
文档
https://eco.dameng.com/document/dm/zh-cn/start/
注意点
1、达梦数据库设置成大小写敏感时,小写的标识符需要用双引号括起,否则会被转换为大写;当大小写不敏感时,系统不自动转换标识符的大小写,在标识符比较时也不区分大小写。
2、建议数据库表、列名等使用大写字母
3、资源设置注意合理性,避免发生超过最大连接限制的情况
oracle
oracle12
启动容器
docker pull truevoly/oracle-12c
mkdir -p $data/oracle/data_temp && chmod 777 $data/oracle/data_temp
docker run --privileged=true --restart always -d -p 8080:8080 -p 1521:1521 -v $data/oracle/data_temp:/home/oracle/data_temp -v /etc/localtime:/etc/localtime:ro --name oracle_one truevoly/oracle-12c
查看日志
docker logs --tail 300 -f oracle_one
进入Oracle
docker exec -it oracle_one /bin/bash
#两种进入方式
#进入Oracle
sqlplus system/oracle@//localhost:1521/xe
#进入Oracle
sqlplus /nolog
#密码:oracle
connect sys as sysdba;
#修改用户 system 的密码为 oracle
alter user system identified by 123456;
#查看oracle现在的状态 ,状态为 OPEN 则正常
select status from v$instance;
用户名密码
62-oracle12-1521 #链接名
Basic #连接类型
192.168.1.62 #主机
1521 #端口
XE #服务名
system #用户名
123456 #密码
删除容器
docker rm -f oracle_one
Oracle19
启动容器
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
# 创建文件
mkdir -p $data/oracle19/oradata && chmod 777 $data/oracle19/oradata
#ORACLE_PWD 此处是oracle密码
docker run --privileged=true --restart always -d
-p 1524:1521 -p 5502:5500
-e ORACLE_SID=ORCLCDB
-e ORACLE_PDB=ORCLPDB1
-e ORACLE_PWD=123456
-e ORACLE_EDITION=standard
-e ORACLE_CHARACTERSET=AL32UTF8
-v $data/oracle19/oradata:/opt/oracle/oradata
--name oracle19
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
查看日志
docker logs --tail 300 -f oracle19
出现下图说明成功
进入容器并创建用户
docker exec -it oracle19 /bin/bash
#登录到数据库
sqlplus / as sysdba
#查看当前session连接的是CDB还是PDB
show con_name;
查看所有pdb
show pdbs;
ORCLPDB1的打开方式是 【READ WRITE】(读写),如果不是请修改
alter pluggable database orclpdb1 open;
创建一个PDB层面用户
#切换会话
alter session set container=ORCLPDB1;
#再次查看并确认会话
show con_name;
-- create user 账户 identified by 密码;
create user test identified by 123456;
-- 授权
GRANT CONNECT, RESOURCE, DBA TO test;
-- 给用户授予权限
grant create session to test;
grant connect,resource to test;
用户名和密码
#链接名 62-oracle19-1524
#端口: 1524
#服务名: ORCLCDB/ORCLPDB1
#用户名: SYSTEM/TEST
#密码: 123456
浏览器登录
https://192.168.1.10:5502/em/login
username:sys
password:123456
Container Name:ORCLPDB1
容器管理
docker restart oracle19
docker rm -f oracle19
创建用户
在数据库中建立的用户对应以上两个层级:
COMMOM USERS , 普通用户, 一般建立在CDB层, 用户名需要以 C#或C##开头;
LOCAL USERS , 本地用户, 仅建立在PBD层,建立的时候需要指定容器
用户名和服务是挂钩的
查询当前会话
select sys_context ('USERENV', 'CON_NAME') from dual;
#结果如下 CDB$ROOT
select con_id,dbid,NAME,OPEN_MODE from v$pdbs;
alter pluggable database PDB$SEED open force;
#切换会话
alter session set container=ORCLPDB1;
#查询当前会话
select sys_context ('USERENV', 'CON_NAME') from dual;
用户管理
-- create user 账户 identified by 密码;
create user test identified by 123456;
-- 授权
GRANT CONNECT, RESOURCE, DBA TO test;
-- 给用户授予权限
grant create session to test;
grant connect,resource to test;
-- 删除用户
DROP USER 用户名 CASCADE;
alter session set container=ORCLPDB1;
-- 多权限授权
GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO test01;
grant select any table to test01;
-- 解除锁定
alter user test01 account unlock;
查看服务
select value from v$parameter where name='service_names'; #查看服务
#修改服务名
ALTER SYSTEM SET service_names = 'OCTL';
#查询已注册的服务集合
SELECT DISTINCT name FROM v$active_services;
pdb名称
SELECT pdb_name FROM dba_pdbs;
查看所有账户
SELECT * FROM ALL_USERS;
常用sql
select * from v$version; #查询版本
select username ,profile from dba_users; #查询一下用户的profile的类型
#查看制定概要文件(默认为DEFAULT)的密码有效期
select * from dba_profiles where profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME';
#然后将密码的有效期有180天设置为“无限制”;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 修改密码
alter user test01 identified by 123456;
-- 查询所有表空间
SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;
-- 创建表空间
create tablespace abcd
datafile '/u01/app/oracle/oradata/abcd.dbf'
size 100m
autoextend on
next 10m maxsize unlimited
extent management local
-- 新建用户`TEST`并选择刚创建的表空间 `BKJ`
CREATE USER TEST
IDENTIFIED BY 123456
ACCOUNT UNLOCK
DEFAULT TABLESPACE abcd;
-- connect,resource,dba权限赋予 test用户
GRANT CONNECT,RESOURCE,DBA TO TEST;
-- 多权限授权
GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO TEST;
mongo
下载镜像
docker pull mongo
创建文件夹
mkdir -p $data/mongodb/data && cd $data/mongodb
创建启动脚本
cat <<EOF> start.sh
#!/bin/bash
MONGODB_DIR=`pwd`
docker stop mongodb
docker rm mongodb
docker run -d \
--name mongodb \
--restart always \
--privileged \
-p 27017:27017 \
-v ${MONGODB_DIR}/data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=123456 \
mongo mongod --auth
EOF
启动
sh start.sh
yapi
下载镜像
docker pull jayfong/yapi
启动容器
docker run
-d
--name yapi
--restart=always
--privileged=true
-p 6005:3000
-e YAPI_ADMIN_ACCOUNT=1115758907@qq.com
-e YAPI_ADMIN_PASSWORD=123456
-e YAPI_CLOSE_REGISTER=true
-e YAPI_DB_SERVERNAME=10.0.4.7
-e YAPI_DB_PORT=27017
-e YAPI_DB_DATABASE=yapi
-e YAPI_DB_USER=admin
-e YAPI_DB_PASS=123456
-e YAPI_DB_AUTH_SOURCE=admin
-e YAPI_MAIL_ENABLE=false
-e YAPI_PLUGINS=[]
jayfong/yapi
docker rm -f yapi #删除容器
yapi会自己新建一个库
登录
192.168.1.10:6005 #登录地址
1115758907@qq.com #用户名
123456 #密码
oceanbase
mkdir -p $data/oceanbase && chmod 777 $data/oceanbase
#搜索镜像
docker search oceanbase
#下载镜像
docker pull oceanbase/oceanbase-ce:latest
#启动容器
docker run -d -p 2883:2881 --privileged=true --restart always -v $data/oceanbase/ob:/root/ob -v $data/oceanbase/obd:/root/.obd --name oceanbase oceanbase/oceanbase-ce
#查日志
docker logs --tail 300 -f oceanbase
使用
docker exec -it oceanbase bash #进入容器
[root@398adab602d4 ~]# obd cluster list #查看集群状态
+------------------------------------------------------------+
| Cluster List |
+-----------+------------------------------+-----------------+
| Name | Configuration Path | Status (Cached) |
+-----------+------------------------------+-----------------+
| obcluster | /root/.obd/cluster/obcluster | running |
+-----------+------------------------------+-----------------+
[root@398adab602d4 ~]# obd cluster start obcluster #启动集群
Get local repositories ok
Search plugins ok
Open ssh connection ok
Load cluster param plugin ok
Cluster status check ok
Deploy "obcluster" is running
修改密码:
obclient -h127.0.0.1 -u root -P 2881 #使用obclient客户端连接实例
#修改用户密码,下面语句二选一即可
ALTER USER root IDENTIFIED BY 'fei891025';
SET PASSWORD for root = PASSWORD('fei891025');
#使用密码验证登录
obclient -h127.0.0.1 -uroot@sys -P2881 -pfei891025 -c -A oceanbase
登录
192.168.1.62 #ip
2881 #端口
root #用户名
fei891025 #密码
删除
docker rm -f oceanbase && rm -rf $data/oceanbase
常用sql
show databases; #显示所有数据库
use oceanbase; #使用数据库
CREATE DATABASE demo DEFAULT CHARACTER SET UTF8MB4;
use demo;
trilium个人笔记
docker run -d --name trilium -p 8010:8080 -e TRILIUM_DATA_DIR='/home/node/trilium-data' -v $data/trilium-data:/home/node/trilium-data --privileged=true --restart=always nriver/trilium-cn
删除笔记
docker rm -f trilium && rm -rf $data/trilium-data
安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #下载
chmod +x /usr/local/bin/docker-compose #授权
验证docker-compose
docker-compose --version
安装mysql主从
mkdir -p $data/mysqlMS
cd $data/mysqlMS
创建docker-compose.yml
cat >docker-compose.yml <<-'EOF'
version: '3.8'
services:
mysql-master:
container_name: mysql-master
image: mysql:5.7.37
restart: always
ports:
- 3360:3306
privileged: true
volumes:
- $PWD/msql-master/volumes/log:/var/log/mysql
- $PWD/msql-master/volumes/conf/my.cnf:/etc/mysql/my.cnf
- $PWD/msql-master/volumes/data:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: Asia/Shanghai
command: [
'--character-set-server=utf8mb4', #设置数据库表的数据集
'--collation-server=utf8mb4_unicode_ci', #设置数据库表的排序规则
'--explicit_defaults_for_timestamp=true', #未明确声明为NOT NULL的TIMESTAMP列允许NULL值,将此列设置为NULL将其设置为NULL,而不是当前时间戳。
'--lower_case_table_names=1', #设置表名大小写不敏感
'--max_allowed_packet=128M', #设置单条sql数据大小,批量更新和插入使用
'--default-authentication-plugin=mysql_native_password', #保持之前的密码认证方式
'--max_connections=1000', #最大允许连接的数量
]
networks:
- myweb
mysql-slave:
container_name: mysql-slave
image: mysql:5.7.37
restart: always
ports:
- 3370:3306
privileged: true
volumes:
- $PWD/msql-slave/volumes/log:/var/log/mysql
- $PWD/msql-slave/volumes/conf/my.cnf:/etc/mysql/my.cnf
- $PWD/msql-slave/volumes/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
TZ: Asia/Shanghai
command: [
'--character-set-server=utf8mb4', #设置数据库表的数据集
'--collation-server=utf8mb4_unicode_ci', #设置数据库表的排序规则
'--explicit_defaults_for_timestamp=true', #未明确声明为NOT NULL的TIMESTAMP列允许NULL值,将此列设置为NULL将其设置为NULL,而不是当前时间戳。
'--lower_case_table_names=1', #设置表名大小写不敏感
'--max_allowed_packet=128M', #设置单条sql数据大小,批量更新和插入使用
'--default-authentication-plugin=mysql_native_password', #保持之前的密码认证方式
'--max_connections=1000', #最大允许连接的数量
]
networks:
- myweb
networks:
myweb:
driver: bridge
EOF
创建配置文件夹
mkdir -p msql-master/volumes/conf msql-slave/volumes/conf
tree #找不到命令 yum -y install tree
.
├── docker-compose.yml
├── msql-master
│ └── volumes
│ └── conf
└── msql-slave
└── volumes
└── conf
6 directories, 1 file
主master配置文件my.cnf
vi msql-master/volumes/conf/my.cnf
内容如下:
[mysqld]
# [必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=1
# [必须]启用二进制日志
log-bin=mysql-bin
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
# 设置需要同步的数据库 binlog_do_db = 数据库名;
# 如果是多个同步库,就以此格式另写几行即可。
# 如果不指明对某个具体库同步,表示同步所有库。除了binlog-ignore-db设置的忽略的库
# binlog_do_db = test #需要同步test数据库。
# 确保binlog日志写入后与硬盘同步
sync_binlog = 1
# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all
从slave配置文件my.cnf
vi msql-slave/volumes/conf/my.cnf
内容如下:
[mysqld]
# [必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=2
# 如果想实现 主-从(主)-从 这样的链条式结构,需要设置:
# log-slave-updates 只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器。
# 设置需要同步的数据库,主服务器上不限定数据库,在从服务器上限定replicate-do-db = 数据库名;
# 如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。
# replicate-do-db = test;
# 不同步test数据库 可以写多个例如 binlog-ignore-db = mysql,information_schema
replicate-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-bin
log-bin-index=mysql-bin.index
## relay_log配置中继日志
#relay_log=edu-mysql-relay-bin
## 还可以设置一个log保存周期:
#expire_logs_days=14
# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all
启动服务
docker-compose up -d
进入主mysql服务
docker exec -it mysql-master bash #进入mysql-master容器
mysql -uroot -p123456 #登录
#查看server_id是否生效
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| server_id | 1 |
| server_id_bits | 32 |
+----------------+-------+
#开权限
mysql> grant replication slave,replication client on *.* to 'slave'@'%' identified by "123456";
mysql> flush privileges;
#看master信息 File 和 Position 从服务上要用
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 154 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
进入从slave服务
docker exec -it mysql-slave bash
mysql -uroot -p123456
#查看server_id是否生效
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| server_id | 2 |
| server_id_bits | 32 |
+----------------+-------+
#在执行下面这个命令之前,进入主数据库 重新查看最新master信息 File 和 Position 从服务上要用
#修改master_host,master_port
# 连接主mysql服务 master_log_file 和 master_log_pos的值要填写主master里查出来的值
change master to master_host='192.168.17.143',master_user='slave',master_password='123456',master_port=3360,master_log_file='mysql-bin.000003', master_log_pos=610,master_connect_retry=30;
#启动slave
mysql> start slave;
#查看状态
mysql> show slave status G
#删除记录
mysql> reset slave;
#停止
mysql> stop slave;
mysql> change master to master_host='192.168.17.128',master_user='slave',master_password='123456',master_port=3360,master_log_file='mysql-bin.000004', master_log_pos=610,master_connect_retry=30;
#启动slave
mysql> start slave;
连接主mysql参数说明:
**master_port**:Master的端口号,指的是容器的端口号
**master_user**:用于数据同步的用户
**master_password**:用于同步的用户的密码
**master_log_file**:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
**master_log_pos**:从哪个 Position 开始读,即上文中提到的 Position 字段的值
**master_connect_retry**:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
确认是否成功
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
品质保证
多年的生产力软件专家
专业实力
资深技术支持项目实施团队
安全无忧
多位认证安全工程师
多元服务
软件提供方案整合,项目咨询实施
购软平台-找企业级软件,上购软平台。平台提供更齐全的软件产品、更专业的技术服务,同时提供行业资讯、软件使用教程和技巧。购软平台打造企业级数字产品综合应用服务平台。用户体验和数字类产品的专业化服务是我们不断追求的目标。购软平台您身边的企业级数字产品优秀服务商。