Docker安装Mysql、Redis、nginx、nacos等环境

相关系列文章:
1、Docker+Harbor私有仓库快速搭建
2、Docker+Jenkins+Harbor

1、服务器

Ip部署内容说明
192.168.88.7Docker、Mysql、redis、nacosnode1
192.168.88.8Docker、Mysql、redis、nacosnode2
192.168.88.9Docker、redis、nacos、nginxnode3

2、安装PXC8.0 Mysql集群

2-1 开发需要的端口

各个服务器都需要执行,配置完重启docker:service docker restart

2377:用于集群管理通信的TCP端口
4789:用于容器覆盖网络
7946:用于容器网络发现

firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --reload
# 查看防火墙状态
systemctl status firewalld
# 启动
systemctl start firewalld
# 停止
systemctl stop firewalld
# 开机自启
systemctl enable firewalld

2-2 创建docker swarm集群

# node1主节点执行命令,将运行的结果用于node2服务器执行
docker swarm init

其他:

# 查询swarm集群节点,主节点才可运行
docker node ls
# 解散swarm集群
docker swarm leave -f

如果要删除一个节点,执行命令为 :docker node rm -f [节点的ID]
如果要解散 swarm 集群 先再 【manager节点】上删除 所有 【worker 节点】 再强制删除自己,执行:docker swarm leave -f
最后,还需要在各个【worker 节点】主机上执行:docker swarm leave

在这里插入图片描述

2-3 创建docker虚拟网络

# swarm_mysql为自定义名称
docker network create -d overlay --attachable swarm_mysql

其他:

# 查看虚拟网络: 
docker network inspect swarm_mysql
# 所有虚拟网络: 
docker network ls
# 删除虚拟网络: 
docker network rm swarm_mysql

在这里插入图片描述

2-4 搭建pxc8.0

配置证书
官网
pxc8.0默认开启同步加密方式,需要每台服务器都配置一样证书才能通过认证。每台服务器都需要执行

# 创建目录
mkdir -p ~/pxc-docker/config
cd ~/pxc-docker/config
vim custom.cnf

custom.cnf文件:

[mysqld]
ssl-ca = /cert/ca.pem
ssl-cert = /cert/server-cert.pem
ssl-key = /cert/server-key.pem

[client]
ssl-ca = /cert/ca.pem
ssl-cert = /cert/client-cert.pem
ssl-key = /cert/client-key.pem

[sst]
encrypt = 4
ssl-ca = /cert/ca.pem
ssl-cert = /cert/server-cert.pem
ssl-key = /cert/server-key.pem

# 此目录用于生成自签名SSL证书
mkdir -m 777 -p ~/pxc-docker/cert
# 使用官方镜像生成证书到~/pxc-docker/cert目录
docker run --name pxc-cert --rm -v ~/pxc-docker/cert:/cert percona/percona-xtradb-cluster:8.0 mysql_ssl_rsa_setup -d /cert

在这里插入图片描述
下载镜像
仓库

# 镜像不存在则下载镜像,每台服务器都要执行
docker pull percona/percona-xtradb-cluster:8.0
# 重命名
docker tag percona/percona-xtradb-cluster:8.0 pxc
# 删除镜像
docker rmi percona/percona-xtradb-cluster:8.0

在这里插入图片描述
创建数据卷

#node1执行
docker volume create pxc_node1

#node2执行
docker volume create pxc_node2

创建容器
node1服务器执行:

docker run -d \
  --net=swarm_mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e CLUSTER_NAME=pxc-cluster \
  --name=pxc_node1 \
  -v pxc_node1:/var/lib/mysql \
  -v ~/pxc-docker/cert:/cert \
  -v ~/pxc-docker/config:/etc/percona-xtradb-cluster.conf.d \
  -p 3306:3306 \
  --privileged \
  pxc

CLUSTER_NAME: pxc集群名称,每个节点的名称要一样
name: 容器名称
net:加入到虚拟网络
MYSQL_ROOT_PASSWORD: mysql的root密码

在这里插入图片描述
node2服务器执行:

docker run -d \
  --net=swarm_mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e CLUSTER_NAME=pxc-cluster \
  -e CLUSTER_JOIN=pxc_node1 \
  --name=pxc_node2 \
  -v pxc_node2:/var/lib/mysql \
  -v ~/pxc-docker/cert:/cert \
  -v ~/pxc-docker/config:/etc/percona-xtradb-cluster.conf.d \
  -p 3306:3306\
  --privileged \
  pxc

-e CLUSTER_NAME=pxc-cluster 表示加入上面的集群
-e CLUSTER_JOIN=pxc_node1 表示加入node1节点

在这里插入图片描述

ps:
1、如果pxc_node2节点启动失败,可以尝试把node1服务器上面命令生成的证书重新拷贝到node2服务器上,然后重启docker,重启容器:docker restart pxc_node2
2、可以使用命令查询日志:docker logs pxc_node2
3、如果模拟节点宕机后重启失败,可以检查一下防火墙相关端口是否开放,节点是否加入swarm集群
4、因为我这里集群只有两台机子,当node1节点模拟宕机后再重新启动后,两个服务器的mysql数据库数据是不同步,只有我重新删除node1、node2的pxc_node1、pxc_node2容器后,重新运行启动容器才同步数据,网上其他文章说node1以节点方式加入node2集群即可正常同步数据,这一点未验证,需要的自行验证,需要明确更多集群的数据同步情况的自行测试。一般建议集群数量>=3,操作步骤类似。
5、实践测试可以参考:https://www.yuque.com/liweiming/linux/fcw6w8#9a96ee84
6、非正常关闭,node1不是最后一个离开节点可以修改挂载卷下面的grastate.dat文件中的safe_to_bootstrap修改为1后保存,然后重启

3、安装redis6.0.8集群

参考:
https://blog.csdn.net/gy_cjz/article/details/125790214
https://blog.csdn.net/weixin_45821811/article/details/119421774

Ip端口说明
192.168.88.76381、6382node1
192.168.88.86383、6384node2
192.168.88.96385、6386node3

3-1 编写redis-cluster.tmpl配置文件

node1服务器redis-cluster.tmpl

#端口号
port ${PORT}
#设置客户端连接后进行任何其他指定前需要使用的密码
requirepass 123456
# 当master服务设置了密码保护时(用requirepass制定的密码)
# slave服务连接master的密码
masterauth 123456
#daemonize no 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
daemonize no
# 任何主机都可以连接到redis
bind 0.0.0.0
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
# 默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。
# 所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。
# 开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重新整理。
# 你可以同时开启asynchronous dumps 和 AOF
appendonly yes
#集群开关,默认是不开启集群模式。
cluster-enabled yes
#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
cluster-config-file nodes.conf
#节点互连超时的阀值。集群节点超时毫秒数
cluster-node-timeout 15000
#在某些部署中,Redis群集节点地址发现失败,因为地址是NAT ted的,或者因为端口是转发的(典型情况是Docker和其他容器
#为了使Redis集群在这样的环境中工作,静态每个节点都知道需要其公共地址的配置。这个
cluster-announce-ip 192.168.88.7
#客户端端口
cluster-announce-port ${PORT}
#总线端口 为 port+10000
cluster-announce-bus-port 1${PORT}

node2服务器redis-cluster.tmpl

#端口号
port ${PORT}
#设置客户端连接后进行任何其他指定前需要使用的密码
requirepass 123456
# 当master服务设置了密码保护时(用requirepass制定的密码)
# slav服务连接master的密码
masterauth 123456
#daemonize no 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
daemonize no
# 任何主机都可以连接到redis
bind 0.0.0.0
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
# 默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。
# 所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。
# 开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重新整理。
# 你可以同时开启asynchronous dumps 和 AOF
appendonly yes
#集群开关,默认是不开启集群模式。
cluster-enabled yes
#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
cluster-config-file nodes.conf
#节点互连超时的阀值。集群节点超时毫秒数
cluster-node-timeout 15000
#在某些部署中,Redis群集节点地址发现失败,因为地址是NAT ted的,或者因为端口是转发的(典型情况是Docker和其他容器
#为了使Redis集群在这样的环境中工作,静态每个节点都知道需要其公共地址的配置。这个
cluster-announce-ip 192.168.88.8
#客户端端口
cluster-announce-port ${PORT}
#总线端口 为 port+10000
cluster-announce-bus-port 1${PORT}

node3服务器redis-cluster.tmpl

#端口号
port ${PORT}
#设置客户端连接后进行任何其他指定前需要使用的密码
requirepass 123456
# 当master服务设置了密码保护时(用requirepass制定的密码)
# slav服务连接master的密码
#
masterauth 123456
#daemonize no 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
daemonize no
# 任何主机都可以连接到redis
bind 0.0.0.0
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
protected-mode no
# 默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。
# 所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。
# 开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
# 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重新整理。
# 你可以同时开启asynchronous dumps 和 AOF
appendonly yes
#集群开关,默认是不开启集群模式。
cluster-enabled yes
#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
cluster-config-file nodes.conf
#节点互连超时的阀值。集群节点超时毫秒数
cluster-node-timeout 15000
#在某些部署中,Redis群集节点地址发现失败,因为地址是NAT ted的,或者因为端口是转发的(典型情况是Docker和其他容器
#为了使Redis集群在这样的环境中工作,静态每个节点都知道需要其公共地址的配置。这个
cluster-announce-ip 192.168.88.9
#客户端端口
cluster-announce-port ${PORT}
#总线端口 为 port+10000
cluster-announce-bus-port 1${PORT}

3-2 创建redis.conf配置文件和data文件

node1服务器mkdir.sh

for port in `seq 6381 6382`; do \

  mkdir -p ${port}/conf \

  PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \

  mkdir -p ${port}/data;\

done

node2服务器mkdir.sh

for port in `seq 6383 6384`; do \

  mkdir -p ${port}/conf \

  PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \

  mkdir -p ${port}/data;\

done

node3服务器mkdir.sh

for port in `seq 6385 6386`; do \

  mkdir -p ${port}/conf \

  PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \

  mkdir -p ${port}/data;\

done

执行mkdir.sh文件
在这里插入图片描述

3-3 创建redis容器

node1服务器

docker run -d --name redis-6381 --net host --privileged=true \
-v /opt/redis-cluster/6381/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis-cluster/6381/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf
docker run -d --name redis-6382 --net host --privileged=true \
-v /opt/redis-cluster/6382/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis-cluster/6382/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf

node2服务器

docker run -d --name redis-6383 --net host --privileged=true \
-v /opt/redis-cluster/6383/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis-cluster/6383/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf
docker run -d --name redis-6384 --net host --privileged=true \
-v /opt/redis-cluster/6384/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis-cluster/6384/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf

node3服务器

docker run -d --name redis-6385 --net host --privileged=true \
-v /opt/redis-cluster/6385/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis-cluster/6385/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf
docker run -d --name redis-6386 --net host --privileged=true \
-v /opt/redis-cluster/6386/conf/redis.conf:/etc/redis/redis.conf \
-v /opt/redis-cluster/6386/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf

3-4 创建 Redis Cluster 集群

随便进入一个容器并为6台机器构建集群关系,–cluster-replicas 1 表示为每个master创建一个slave节点

docker exec -it redis-6381 bash
redis-cli -a 123456 --cluster create 192.168.88.7:6381 192.168.88.7:6382 192.168.88.8:6383 192.168.88.8:6384 192.168.88.9:6385 192.168.88.9:6386 --cluster-replicas 1

如果连接不上其他服务器的redis或者长时间处于连接状态,可以检查一下以下端口是否开放

# node1
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --zone=public --add-port=16381/tcp --permanent
firewall-cmd --zone=public --add-port=16382/tcp --permanent
firewall-cmd --reload

# node2
firewall-cmd --zone=public --add-port=6383/tcp --permanent
firewall-cmd --zone=public --add-port=6384/tcp --permanent
firewall-cmd --zone=public --add-port=16383/tcp --permanent
firewall-cmd --zone=public --add-port=16384/tcp --permanent
firewall-cmd --reload

# node3
firewall-cmd --zone=public --add-port=6385/tcp --permanent
firewall-cmd --zone=public --add-port=6386/tcp --permanent
firewall-cmd --zone=public --add-port=16385/tcp --permanent
firewall-cmd --zone=public --add-port=16386/tcp --permanent
firewall-cmd --reload
# 查看防火墙开放端口信息
firewall-cmd --list-all 
# 查看防火墙端口是否开放
firewall-cmd --query-port=8080/tcp

其他错误:[ERR] Node 192.168.88.7:6381 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决:删除每个服务器每个节点下面data文件下的nodes.conf、appendonly.aof文件,重启节点
在这里插入图片描述

3-4 其他

# 连接redis查看集群信息 -c表示使用集群模式
redis-cli -c -h 192.168.88.7 -p 6381

auth 123456

cluster info
# 查询集群节点信息
cluster nodes

在这里插入图片描述

4、加入portainer

1. 编辑docker.service
vim /usr/lib/systemd/system/docker.service
找到 ExecStart字段修改如下
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

2. 重启docker重新读取配置文件,重新启动docker服务
systemctl daemon-reload
systemctl restart docker

3.开放2375端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload

在这里插入图片描述
在这里插入图片描述

5、安装nginx

5-1 创建映射目录

mkdir -p /home/nginx/www /home/nginx/logs /home/nginx/conf

5-2 编辑nginx.conf配置文件

vim /home/nginx/conf/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    
    server{
       listen 80;
       server_name localhost;
       charset utf-8;

       location / {
          root   /usr/share/nginx/html/;
          try_files $uri $uri/ =404;
          index  index.html index.htm;
       }
       
       #error_page  404              /404.html;

       # redirect server error pages to the static page /50x.html
       #
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   html;
       }
    }
}

5-3 编写docker-compose.yml文件

#部署的服务器需要安装docker compose
安装可参考:Docker+Harbor私有仓库快速搭建

vim /home/nginx/docker-compose.yml
version: '3.3'
services:
      nginx:
        image: nginx
        restart: always
        hostname: nginx
        container_name: nginx
        privileged: true
        ports:
          - 80:80
        volumes:
          - ./conf/nginx.conf:/etc/nginx/nginx.conf
          - ./www/:/usr/share/nginx/html/
          - ./logs/:/var/log/nginx/

5-4 启动

docker compose up -d

5-5 测试

vim /home/nginx/www/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>nginx</title>
</head>
<body>
    <h1>首页</h1>
</body>
</html>

在这里插入图片描述

6、安装nacos2.1.1集群

官网:https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html

6-1 mysql创建nacos_config数据库

sql文件链接
在这里插入图片描述

6-2 开放端口

# node1、node2、node3
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --reload

6-3 创建容器

node1服务器执行

# --配置主机ip和端口
# --配置数据库主机、用户名、密码、数据库名
# --net=host 主机模式
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="192.168.88.7:8848 192.168.88.8:8848 192.168.88.9:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.88.7 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.88.7 \
-p 8848:8848 \
--restart=always \
--net=host \
--name nacos1 \
nacos/nacos-server:v2.1.1

node2服务器执行

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="192.168.88.7:8848 192.168.88.8:8848 192.168.88.9:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.88.7 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.88.8 \
-p 8848:8848 \
--restart=always \
--net=host \
--name nacos2 \
nacos/nacos-server:v2.1.1

node3服务器执行

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="192.168.88.7:8848 192.168.88.8:8848 192.168.88.9:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.88.7 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.88.9 \
-p 8848:8848 \
--restart=always \
--net=host \
--name nacos3 \
nacos/nacos-server:v2.1.1

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/62764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由的hash和history模式的区别

目录 ✅ 路由模式概述 一. 路由的hash和history模式的区别 1. hash模式 2. history模式 3. 两种模式对比 二. 如何获取页面的hash变化 ✅ 路由模式概述 单页应用是在移动互联时代诞生的&#xff0c;它的目标是不刷新整体页面&#xff0c;通过地址栏中的变化来决定内容区…

WSL 2 installation is incomplete的解决方案

问题描述 解决方案 在Windows功能中开启Hyper-v 如果没有Hyper-v选项&#xff0c;新建文本粘贴以下内容后以.cmd为后缀保存后执行即可 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.t…

matlab智能算法程序包89套最新高清录制!matlab专题系列!

关于我为什么要做代码分享这件事&#xff1f; 助力科研旅程&#xff01; 面对茫茫多的文献&#xff0c;想复现却不知从何做起&#xff0c;我们通过打包成品代码&#xff0c;将过程完善&#xff0c;让您可以拿到一手的复现过程以及资料&#xff0c;从而在此基础上&#xff0c;照…

运动耳机哪个最好、顶级运动耳机推荐

拥有一款出色的运动耳机&#xff0c;是每个运动爱好者追求完美体验的必备选择。今天&#xff0c;我为大家推荐五款顶级运动耳机&#xff0c;它们不仅将音乐和运动完美结合&#xff0c;还具备出色的防水性能、舒适的佩戴感和激动人心的音质表现&#xff0c;让你在运动中尽情释放…

【2.2】Java微服务:nacos的使用

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 深度学习 ✨特色专栏&#xff1a; 知识分享 &…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

el-table合并单元格

el-tabel数据结构 此处为this.rolePermitItemList 合并后的样式&#xff1a; el-table-column 需要添加property字段&#xff0c;属性值同props&#xff0c;用来判断需要合并的字段 <el-table :data"rolePermitItemList" style"width: calc(100% );margi…

import有什么用,python中怎么使用import

目录 引言 import的概念 import的作用 import的应用 Python中如何使用import import报错处理 代码示例 注意事项 总结 引言 在Python编程语言中&#xff0c;import是一个关键字&#xff0c;用于将其他模块或库的功能引入当前代码中。import的概念和功能使得Python成为…

Unity制作护盾——1、闪电护盾

Unity引擎制作闪电护盾效果 大家好&#xff0c;我是阿赵。   这期做一个闪电护盾的效果。 一、效果说明 可以改变闪电的颜色 可以改变范围 改变贴图的平铺次数&#xff0c;也可以做出各种不同感觉的护盾。 二、原理 这个效果看着很复杂&#xff0c;其实只是用了一张N…

用 docker 创建 jmeter 容器,能做性能测试?

我们都知道&#xff0c;jmeter 可以做接口测试&#xff0c;也可以用于性能测试&#xff0c;现在企业中性能测试也大多使用 jmeter。docker 是最近这些年流行起来的容器部署工具&#xff0c;可以创建一个容器&#xff0c;然后把项目放到容器中&#xff0c;就可以构建出一个独立的…

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 &#xff08;可选&#xff09;配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 &#xff08;可选&#xff09;修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目&#xff0c;于是找到gitla…

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本&#xff1a;otp_win64_23.2 rabbitmq-server-3.8.16 版本说明&#xff1a;https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…

mybatis-plus 用法

目录 1 快速开始 1.1 依赖准备 1.2 配置准备 1.3 启动服务 2 使用 2.1 实体类注解 2.2 CRUD 2.3 分页 2.4 逻辑删除配置 2.5 通用枚举配置 2.6 自动填充 2.7 多数据源 3 测试 本文主要介绍 mybatis-plus 这款插件&#xff0c;针对 springboot 用户。包括引入&…

【测试】软件测试工具JMeter简单用法

简明扼要&#xff0c;点到为止。 1. JMeter介绍 JMeter的全称是Apache JMeter&#xff0c;是一款用于软件测试的工具软件&#xff0c;其是开源免费的&#xff0c;由Apache基金会运营。 官网&#xff1a;Apache JMeter - Apache JMeter™ 2. 下载安装及运行 2.1 安装 Java8…

喀麦隆ECTN(BESC)申请流程

据CAMEROON喀麦隆法令&#xff0c;所有发货至喀麦隆的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请&#xff0c;将被视为触犯喀麦隆的条例&#xff0c;并在目的港受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称&#xff1b;BESC是法语BORDEREAU ELEC…

Red Hat 安装MySQL 8.0与 Navicat

目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…

Qt项目---简单的计算器

在这篇技术博客中&#xff0c;我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C编程语言和Qt的图形用户界面库来开发这个应用&#xff0c;并展示如何实现基本的算术操作。 项目设置 首先&#xff0c;我们需要在Qt Creator中创建一个新的Qt Widgets应用程序项目…

全志F1C200S嵌入式驱动开发(soc系统集成)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 任何一个嵌入式设备都是由很多的子系统组成的。这里面有硬件、有软件,还可能有机械,并不一定就是大家看到的消费电子那样,即一个soc构成了所有的系统。现实情况是,要构建一个系…

网络:从socket编程的角度说明UDP和TCP的关系,http和tcp的区别

尝试从编程的角度解释各种网络协议。 UDP和TCP的关系 从Python的socket编程角度出发&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff09;是两种不同的传输协议。 TCP是一种面向连接的协议&#xff0c…

SpringBoot3---核心特性---2、Web开发III(模板引擎、国际化、错误处理)

星光下的赶路人star的个人主页 夏天就是吹拂着不可预期的风 文章目录 1、模板引擎1.1 Thymeleaf1.2 基础语法1.3 属性设置1.4 遍历1.5 判断1.6 属性优先级1.7 行内写法1.8 变量选择1.9 模板布局1.10 devtools 2、国家化3、错误处理3.1 默认机制3.2 自定义错误响应3.3 最佳实战 …