docker 部署教学版本
文章目录
- 一、docker使用场景及常用命令
- 1)docker使用场景
- 2)rocky8+(centos8+)安装 docker
- 3)docker 常用命令
- 补充常用命令
- 二、 单独部署每个镜像,部署spring 应用
- 镜像推荐(2023-12-18)
- 1、 安装使用 mysql
- 1.1 创建挂在需要的目录和文件
- 1)创建目录并授权
- 2)新建mysql配置文件-注意启动小写允许:
- 1.2 启动mysql镜像
- 1)启动镜像
- 2)查看日志
- 1.3 防火墙开启允许访问
- 1.4 测试远程连接
- 1.5 导入数据
- 补充:若需要修改镜像配置(非操作步骤,略)
- 1、进入镜像
- 2、修改密码
- 2、 安装使用 redis
- 2.1 创建目录
- 2.2 创建文件
- 2.3 启动redis 容器
- 2.4 测试redis 容器
- 3、 安装rabbitmq
- 3.1 创建rabbitmq相关挂载目录
- 3.2 授权
- 3.3 启动rabbitmq
- 3.4 防火墙开启允许访问
- 3.5 测试是否启动
- 4、 安装nginx
- 4.1 首先:参考教程创建临时nginx 容器,并将容器内的配置文件拷贝出来
- 4.2 修改nginx的配置
- 4.3 启动nginx镜像
- 5、 jar打包docker 镜像
- 5.1 新建配置文件:将所有127.0.0.1换成机器的ip
- 5.2 在linux 新建打包路径,将打包jar上传此路径:
- 5.3 在目录下新建DockerFile,内容如下:
- 5.4 打包镜像
- 5.5 启动镜像
- 5.6 查看日志
- 三、使用Docker虚拟网络,解决部署时,springboot 配置文件不一致
- 1、容器的网络
- 2、改造网路:使用自定义网路
- 2.1 创建虚拟网络
- 2.2 启动的 mysql 添加虚拟网络
- 2.3 启动的 redis 添加虚拟网络
- 2.4 启动的 reabbit 添加虚拟网络
- 2.5 修改 nginx 配置文件,重启,并添加虚拟网络
- 2.6 修改应用链接中间件为:中间件虚拟网络别名,重新打包jar
- 四、docker-compose 快速单机部署
- 1、 新建docker-compose.yaml 文件
- 2、将 docker-compose.yaml 上传至之前上传的jar包的文件路径
- 3、启动并排查启动情况
- 3.1 创建 docker-compose.yaml 文件中的容器
- 3.2 查看整体启动情况
- 3.3 查看异常容器状态的日志(上面 ps 命令中status 显示异常的)
- 3.4 移除 docker-compose.yaml 文件的容器
- 五、docker 镜像合并(测试失败)
- 测试结果
- 六、docker镜像与容器的导入导出
- 1 镜像导出
- 2 镜像导入
- 3 容器导出
- 4 容器导入
- 5 实例化并启动容器
- 七、docker 跨机器网络通信
- 方案
- 1、简单测试
- 八、docker 共享存储
- 九、docker 未列明知识
一、docker使用场景及常用命令
1)docker使用场景
注:
1)docker 好在容器编排和部署于机器无关,并不是性能;因其虚拟网络和容器化环境,其性能能砍到1/4~1/2;
例如:不建议在 Docker 中跑 MySQL(其中关于性能损耗部分是有参考性,其他部署描述有错误)
https://www.zhihu.com/question/627105598/answer/32611515602)目前(2023-12-22)redis+消息队列+jar可能5000/qps,放在docker 闭眼盲猜1000/qps3)docker企业版本是支持大型机;以前在大型机操作系统上虚拟操作系统,现在在其上虚拟容器;
,所有真实并发在专业机器上性能有待考证(专业资料不好找):
https://developer.aliyun.com/article/1939734)所以docker适用于中大型企业负载均衡管理应用(或者一定的降低部署难度),不适合小企业;且应用负载均衡节点数大于5;
2)rocky8+(centos8+)安装 docker
教程: https://doracoin.cc/504
注:dnf替代yum是早晚的事,所以就不找低版本教程了
3)docker 常用命令
注:镜像:存放在本地或远程仓库的docker打包文件叫镜像,仓库:集中存放和管理镜像的地方;
容器:镜像启动后生成的虚拟容器(含成功和失败的)
列出本地镜像:docker image ls
查找mysql镜像:docker search mysql
拉取镜像 mysql镜像:docker pull mysql:8.2.0
删除镜像:docker rmi -f mysql:8.2.0查找镜像版本:1、命令查找:命令特别长,2、官网查找(推荐):hub.docker.com;3)或者百度镜像版本号查看本机存在的容器:docker ps (运行的)或docker ps -a (全部的,含停止运行的)
查看镜像日志(正在运行的,含状态异常) docker logs -f 镜像名启动容器:docker run --name 容器别名 -d 镜像:版本号重启容器:docker restart 容器别名
停止容器:docker stop 容器别名
删除容器:docker rm -f 容器别名进入镜像内
docker exec -it 容器别名 /bin/bash
退出:exit;
补充常用命令
$ docker stop $(docker ps -a -q) : 停止所有容器
$ docker start $(docker ps -a -q) : 启动所有容器
$ docker rm -f $(docker ps -a -q) : 删除所有容器$ docker ps :列出当前所有正在运行的container
$ docker ps -a :列出所有的container(包含历史,即运行过的container)
$ docker kill id : 杀死容器
$ docker stop id : 停止容器$ docker start id : 启动容器
$ docker restart id : 重启容器$ docker rmi -f <image ID>: 删除一个或多个镜像 image
$ docker rm -f id : 删除指定 镜像 image
$ docker rm -f <container...> : 删除一个或多个container
$ docker rm -f `docker ps -a -q` : 删除所有的container
$ docker rm `docker ps -f "status=exited" -q` : 删除停止的容器
$ docker kill`docker ps -a -q` :停止所有container
$ docker exec -it ng /bin/bash :进入容器
$ docker cp ng:/etc/nginx/nginx.conf /data/nginx.conf :拷贝容器内文件到外部
$ docker logs -f 容器名称 :查看容器日志
全命令补充,菜鸟:https://www.runoob.com/docker/docker-command-manual.html
(2019年后未更新,学的快):http://www.zhaowenyu.com/docker/dockerbackground/docker-history.html
二、 单独部署每个镜像,部署spring 应用
镜像推荐(2023-12-18)
# 1、mysql(最新镜像 2023-12-15):8.2.0 ,下载镜像:
docker pull mysql:8.2.0
# 2、redis(最新镜像 2023-12-15):7.2.3 ,下载镜像:
docker pull redis:7.2.3
# 3、rabbitmq(最新镜像 2023-12-15:3.13.0-rc),下载镜像:
# 不带控制台的镜像
docker pull rabbitmq:3.12.10
# management带控制台的镜像
docker pull rabbitmq:3.12.10-management# 4、jdk(最新镜像 2023-12-15:openjdk:21),下载镜像(项目使用):
docker pull openjdk:17# 5、nginx(最新镜像 2023-12-15:1.25.3),下载镜像:
docker pull nginx:1.25.3
注:1)若镜像拉去速度慢,可注册阿里云账号,用自己的阿里云镜像仓库拉去镜像(目前:2023-12-22 阿里镜像仓库免费-镜像空间)
2)mysql、redis、消息队列等高io应用,对应实体机一般要配置优化(例如:打开文件句柄数);高并发下,其实不建议容器部署(非专业硬件,例如:专门虚拟化机器,也有适配容器的 jvm: 9j);且mysql、redis、消息队列等高io应用,这些也属于分布式应用中的有主服务;
3)目前(2023-12-22) jvm: 9j 配置麻烦(ibm掺和了),且未做并发压测(jmeter压测),所以本教程采用常规方案-openjdk;
4)若拉取镜像报禁止,设置DNS为8.8.8.8(谷歌免费提供的DNS服务);拉取超时,则设置国内镜像源:https://developer.aliyun.com/article/1044251
1、 安装使用 mysql
1.1 创建挂在需要的目录和文件
1)创建目录并授权
mkdir -p /data/mysql8
chmod 777 /data/mysql8
2)新建mysql配置文件-注意启动小写允许:
touch /data/mysql8/my.conf
my.conf文件内容
注:该配置未优化,优化见(含:内存:32g linux和64 g windows mysql的配置):
https://blog.csdn.net/qq_26408545/article/details/124114793
[mysql]
#设置mysql客户端默认字符集
default-character-set=UTF8MB4
[mysqld]
#linux 需配置,忽略表名大小写
lower_case_table_names=1
#设置3306端口
port=3306
#允许最大连接数
max_connections=200
#允许连接失败的次数
max_connect_errors=10
#使用“caching_sha2_password”插件认证
default_authentication_plugin=caching_sha2_password
#服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=UTF8MB4
#开启查询缓存
explicit_defaults_for_timestamp=true
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#等待超时时间秒
wait_timeout=60
#交互式连接超时时间秒
interactive-timeout=600
#binlog日志保留10天的
binlog_expire_logs_seconds=864000
1.2 启动mysql镜像
1)启动镜像
注:mysql镜像日志未挂在出来:日志默认输出到docker镜像的控制台,查看日志用 docker logs -f mysql8
踩坑:运行镜像:可添加参数运行远程访问
# 研究镜像日志默认输出为终端log_error = stderr
# 即 -v /data/mysql8/mysqld.log:/var/log/mysqld.log 无意义,所以就未独立日志docker run --name mysql8\-p 3308:3306 \-v /data/mysql8/my.cnf:/etc/my.cnf \-v /data/mysql8/data:/var/lib/mysql \-e TZ=Asia/Shanghai \-e MYSQL_DATABASE=hy_cost_grain \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_ROOT_HOST='%' \--restart=always \--privileged=true \-d mysql:8.2.0
补充启动参数:-e 参数=值
# 数据库时区
TZ: Asia/Shanghai# 开启远程访问
MYSQL_ROOT_HOST: '%'# 等同于 -e MYSQL_ROOT_PASSWORD指定root的登录密码
MYSQL_ROOT_PASSWORD: 123456
#- MYSQL_ROOT_PASSWORD=123456a?
#- MYSQL_ALLOW_EMPTY_PASSWORD='no'# 这里这个指令compose启动成功后会自动创建名为docker的数据库
MYSQL_DATABASE: hy_cost_grain
#- MYSQL_DATABASE='ecdb02'# 此处就是相当于 mysql create user,创建了数据库的登录用户
#- MYSQL_USER='ecuser'
#- MYSQL_PASSWORD='123456a?'
2)查看日志
docker logs -f mysql8
注:若有问题:
#查看容器运行情况
docker ps
# 停止
docker stop mysql8
# 删除
docker rm -f mysql8
# 重启
docker restart mysql8# 产看端口占用
nestat -ntlp | grep 占用端口号
1.3 防火墙开启允许访问
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload# 注:如果用的是阿里云的话,也需要配置 阿里云控制台防火墙
1.4 测试远程连接
工具链接数据库,操作:略
1.5 导入数据
操作:略
dbeaver导入数据:数据库右击->选择恢复数据->弹窗中 额外的命令参数添加:–default-character-set=utf8
补充:若需要修改镜像配置(非操作步骤,略)
例如:假设需要开启mysql远程访问
注:启动mysql镜像时,已开启允许远程访问,本操作仅是知识补充
1、进入镜像
docker exec -it mysql8 /bin/bash
2、修改密码
进入镜像:像正常linux操作即可
注:很多镜像只含基础命令,例如vim,ll等不存在,可自己安装:一般采用rpm源码包安装(保证容器体积不至于太大)
# 本机访问mysql:mysql -u账户 -p密码
mysql -uroot -p123456
#切换数据库
use mysql;
#开启远程访问
alter user 'root'@'%' identified with caching_sha2_password by '123456';
#刷新权限
flush privileges;
#退出mysql命令窗口
quit; 或者 exit;
#退出容器
exit;
2、 安装使用 redis
注:
1)redis号称单机20w/qps,固一般保证并发,实体机器+本机和机器配置优化+(条件可以:再建个哨兵保证高可用)
2)性能评估按照10w/qps用;redis6 有多线程参数-启用相关参数是真的能到
3)硬件:多核4~16核 8~16g内存 或者 低配3台 4核8g内存的哨兵(低配:rdb文件-不建议超过4g,高配rdb建议超过:7g,高配更好-事少(16核16g也是其顶配了);
4)应用链接池lettuce,其他的连接池各种崩溃,例如:jedis-操作接口简单、redission-分布式限流等解决方案;
2.1 创建目录
mkdir -p /data/redis/data
mkdir -p /data/redis/logs
2.2 创建文件
touch /data/redis/redis.conf
redis.conf 文件内容如下
注:redis 具体的优化看此篇文章中的优化部分:https://blog.csdn.net/qq_26408545/article/details/132696788
#暂不设置密码,启动容器也可设置密码
#requirepass 123
maxclients 10000#如果要外网访问,请注释掉下面,或者修改为0.0.0.0,保险起见,也可以把protected-mode设置为no
bind 0.0.0.0
protected-mode no#注意修改这里端口,根据你实际暴露端口情况配置
port 6379tcp-backlog 511
timeout 0
tcp-keepalive 300#注意这里要把后台运行设置为no,避免docker后台运行冲突
daemonize nosupervised no
pidfile /docker/redis/redis.pid
loglevel noticedatabases 16always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb#注意修改这里的目录为容器内目录,默认reids进来是在/data/目录
dir /data/redis/data#日志输入指定路径
#logfile ""replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no#注意修改这里的配置,yes开启持久化,no关闭持久化
appendonly yesappendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
2.3 启动redis 容器
注:redis 和数据库一样吃内存,他多的时候甚至占12G,redisDb文件在
配置了日志未映射出来,所以放弃了
# 日志配置放弃: -v /data/redis/logs:/data/redis/logs \
docker run \
--restart=always \
--log-opt max-size=100m \
--log-opt max-file=2 \
-p 6379:6379 \
--name redis7 \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data/redis/data \
-d redis:7.2.3 redis-server /etc/redis/redis.conf \
--appendonly yes \
--requirepass ''
2.4 测试redis 容器
略 Another-Redis-Desktop-Manager 链接看一下
3、 安装rabbitmq
注:1)rabbitmq-金融领域消息队列:(2023-12-22)单机优化配置的 性能 1w/qps;其它号称10w/qps的消息队列,一般给数据中心传递数据用,不用做应用领域;当时集群怕问题,就1个应用对应1个队列;(并发大)
2)消息队列堆积100w后各种问题,磁盘占用100G,所以部署应用+队列:50G+200G挂载盘+独立文件服务:8核+16G;有台单独处理任务的windows server(部署含队列中间件) 16核+32G(定时处理各种数据的 + 一些手工处理数据的 + 一些处理特殊任务的)
3)应用的rabbitmq链接池配置,要压测通过,加参数保证高并发,连接池不崩溃;
4)没系统研究过,配置优化不知道。网传(opp、vivo、小米:其中的2家)-迁移它的环境很麻烦,只能停机等消费完,且迁移步骤麻烦;
3.1 创建rabbitmq相关挂载目录
mkdir -p /data/rabbitmq/{data,conf,log}
3.2 授权
chmod -R 777 /data/rabbitmq
3.3 启动rabbitmq
注:启动命令,未挂在配置目录 -v /data/rabbitmq/conf:/etc/rabbitmq
网上未找到专业的关于rabbitmq配置优化(且配置空,无法启动控制台)
docker run -d --privileged=true --name rabbitmq3.12.10 \
--hostname localhost \
-e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=12345678 \
-v /rabbitmq/data:/var/lib/rabbitmq \
-v /data/rabbitmq/log:/var/log/rabbitmq \
-v /docker-work/rabbitmq/conf:/etc/rabbitmq \
-p 5672:5672 -p 15672:15672 \
-d rabbitmq:3.12.10-management参数说明:
–restart=always :表示随着Docker容器重启(~~可加可不加~~ )
--hostname :主机名 (~~可加可不加~~ ) rabbitmq节点名称
-e :指定环境变量 RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
-e :RABBITMQ_DEFAULT_USER:默认的用户名;
-e :RABBITMQ_DEFAULT_PASS:默认用户名的密码,rabbitmq默认账号和密码是guest
-p :端口映射
-v :文件挂载
-d :表示后台运行
–name rabbitmq :表示启动后的容器实例名称为rabbitmq
3.4 防火墙开启允许访问
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload# 注:如果用的是阿里云的话,顺便开放下这两个端口,不然没法访问
3.5 测试是否启动
netstat -ntlp|grep 5672
浏览器访问:http://IP:15672/
4、 安装nginx
注:(2023-12-22)我们当时压测1w/qps就各种问题,理论2w/qps;号称10w/qps这货;尴尬的是(jdk15+,16核32g,优化参数的tomcat)单个jar可达到5000~7000/qps;不过nginx是占用内存小,但cpu耗用高,优化其多线程参数;因没能力优化-就外采的一个负载均衡中间件(基于nginx的);
4.1 首先:参考教程创建临时nginx 容器,并将容器内的配置文件拷贝出来
仅参考教程前半部分生成配置文件,文档也付相关配置和目录
教程:https://blog.csdn.net/longzaizai_/article/details/130675135
#nginx配置文件2个,日志目录2个文件,html容器路径映射出来
docker cp nginx01:/etc/nginx/nginx.conf /data/nginx/
docker cp nginx01:/etc/nginx/conf.d /data/nginx/conf/
docker cp nginx01:/usr/share/nginx/html /data/nginx/html
docker cp nginx01:/var/log/nginx/ /data/nginx/logs/
4.2 修改nginx的配置
注:html的路径实在容器下:所以开头:/usr/share/nginx/html/
** 网络要用主机ip,因为localhost 是指向容器 **
# 省去不必要的配置代码
server {listen 80; # 本服务监听的端口号server_name localhost; # 主机名称client_max_body_size 600m;client_body_buffer_size 128k;proxy_connect_timeout 600;proxy_read_timeout 600;proxy_send_timeout 600;proxy_buffer_size 64k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;location / {# root 规定了通过监听的端口号访问的文件目录root /usr/share/nginx/html/grain/dist;# 配置资源重新跳转,防止刷新后页面丢失try_files $uri $uri/ /index.html;# index 规定了该目录下指定哪个文件index index.html index.htm;}# 配置后端接口的跨域代理# 对于路径为 "prod-api 的接口,帮助他跳转到指定的地址location /prod-api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 本机上运行的后端接口proxy_pass http://localhost:8080/; }location /status{stub_status on;}
}
4.3 启动nginx镜像
docker run --name nginx \
-p 80:80 -p 443:443 \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/logs:/var/log/nginx \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/conf:/etc/nginx/conf.d \
--privileged=true \
-e TZ=Asia/Shanghai \
-d nginx:1.25.3
5、 jar打包docker 镜像
注:jar包尽量无主服务方便扩容(token+redis 认证变无主,独立文件、数据库让其于应用无关),负载均衡不行买现成的;消息队列目前这玩意高并发坑多;rocketmq 并发高,吃资源太厉害了;
分布式部署jar,得将jar打成镜像,方便一键部署;
5.1 新建配置文件:将所有127.0.0.1换成机器的ip
注:因为容器部署问题
5.2 在linux 新建打包路径,将打包jar上传此路径:
5.3 在目录下新建DockerFile,内容如下:
或者将DockerFile也上传linux相应路径
#基础镜像使用jdk17
FROM openjdk:17
#作者
MAINTAINER kly# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp# 将jar包添加到容器中并更名
ADD hy-admin.jar /app.jar# 运行jar包
RUN bash -c 'touch /app.jar'# 为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]#ENTRYPOINT ["nohup","java","-jar","/data/app/hy-admin.jar","&"]#暴露9000端口
EXPOSE 9000
5.4 打包镜像
注:命令最后面有 空格 和 点符号
# 命令后面有个 空格 .
docker build -f DockerFile -t app:1.0 .
5.5 启动镜像
docker run -d --name app -p 9000:9000 app:1.0
5.6 查看日志
docker logs -f app:1.0
三、使用Docker虚拟网络,解决部署时,springboot 配置文件不一致
先了解:1)docker网络命令:https://www.phpsdk.cn/plug/news/show.html?id=12824
1、容器的网络
Docker 网络之前,我们有必要先来了解一下这几种网络模式都是什么意思。
Docker中容器间的通信方式
1.通过容器ip访问
容器重启后,ip会发生变化。通过容器ip访问不是一个好的方案。
2.通过宿主机的ip:port访问
通过宿主机的ip:port访问,只能依靠监听在暴露出的端口的进程来进行有限的通信。
3.通过link建立连接(官方不推荐使用)
4.通过 User-defined networks(推荐)
例子:
# 1、创建 docker 虚拟网络
docker network create my-network# 查看网络情况:
docker network ls# 2、所有容器通信添加2个参数(建议启动时添加):--network 虚拟网络网卡 --network-alias 容器在虚拟网路别名
# 之后 springboot应用 可通过 容器的虚拟网路别名, 直接访问mysqldocker run -itd --name mysql --network my-network --network-alias mysql \
-e MYSQL_ROOT_PASSWORD=root mysql:5.7.24# 3、对于已经创建好的容器:
如果容器已创建好但是之前没有指定自己的网络,则使用下面命令修改:docker network connect --alias mysql my-network mysql
# 第一个mysql是网络别名 第二个mysql是容器名# 4、通过网络别名测试访问
# 进入web容器,使用ping命令测试
docker exec -it mysql /bin/bash
容器> ping mysql
2、改造网路:使用自定义网路
参考教程:https://blog.csdn.net/cjbfzxz/article/details/106652867
2.1 创建虚拟网络
创建 docker 虚拟网络
docker network create my-network
#查看网络情况:
docker network ls
2.2 启动的 mysql 添加虚拟网络
docker network connect --alias mysql8 my-network mysql8
2.3 启动的 redis 添加虚拟网络
docker network connect --alias redis7 my-network redis7
2.4 启动的 reabbit 添加虚拟网络
docker network connect --alias rabbitmq3.12.10 my-network rabbitmq3.12.10
2.5 修改 nginx 配置文件,重启,并添加虚拟网络
注:修改nginx配置为后台应用地址:假设springboot 应用的虚拟网路别名为:jar-grain-9000 – 类型-项目-端口号
# 重启
docker restart nginx
# 俩接网络
docker network connect --alias nginx my-network nginx
2.6 修改应用链接中间件为:中间件虚拟网络别名,重新打包jar
例如mysql的链接
url: jdbc:mysql://${DB_HOST:mysql8}😒{DB_PORT:3306}/${DB_NAME:hy_cost_grain}?..
仅了解:外置配置文件:https://blog.51cto.com/u_16213321/7860225
# 1、停止容器
docker stop app
# 2、删除容器
docker rm -f app
# 3、删除镜像(正常可保留镜像叠加版本号:也删掉没用的,太多了会乱)
docker rmi -f app:1.0
# 4、新建配置文件:将:mysql、redis、rabbit改用虚拟网络的配置,并重新打包jar
注:此时使用是容器的内部端口,例如mysql 映射外部3308,内部使用的是3306
# 5、上传并重新打包镜像:命令后面有个 空格 .
docker build -f DockerFile -t app:1.0 .# 6、使用虚拟网络运行镜像docker run -d --name app --network my-network --network-alias jar-grain-9000 \
-e "JAVA_OPTS=--DB_HOST=mysql8" \
-p 9000:9000 app:1.0# 查看日志
docker logs -f app
# 测试也可以访问
打包 DockerFile 添加镜像启动参数
教程(测试传参失败):https://www.cnblogs.com/HMingR/p/13588123.html
#基础镜像使用jdk1.8
FROM openjdk:17
#作者
MAINTAINER kly# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp# 将jar包添加到容器中并更名
ADD hy-admin.jar /app.jar# 启动内运行下列命令:文件不存在,则创建/app.jar文件
RUN bash -c 'touch /app.jar'# 为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]#ENTRYPOINT ["nohup","java","-jar","/app.jar","$JAVA_OPTS","&"]#暴露9000端口
EXPOSE 9000
#暴露6000端口
EXPOSE 6000
【1】Dockerfile详解 https://www.jianshu.com/p/4508784f6ddc
【2】Docker数据卷(Volume)作用 https://blog.csdn.net/zhousenshan/article/details/129229378
四、docker-compose 快速单机部署
参考:https://blog.csdn.net/u010361276/article/details/130877191
1、 新建docker-compose.yaml 文件
注:若使用的镜像不存在,docker会先拉取镜像
version: "3.0"networks: ruoyi-net: driver: bridgeservices:mysql8:image: mysql:8.2.0container_name: mysql8hostname: mysql8volumes:- /data/docker-worker/mysql8/data:/var/lib/mysql- /data/docker-worker/mysql8/my.cnf:/etc/my.cnfenvironment:TZ: Asia/ShanghaiMYSQL_DATABASE: hy_cost_grainMYSQL_ROOT_PASSWORD: 123456MYSQL_ROOT_HOST: '%'# 等同于 -e MYSQL_ROOT_PASSWORD指定root的登录密码#- MYSQL_ROOT_PASSWORD=123456a?#- MYSQL_ALLOW_EMPTY_PASSWORD='no'# 这里这个指令compose启动成功后会自动创建名为docker的数据库#- MYSQL_DATABASE='ecdb02'# 此处就是相当于 mysql create user,创建了数据库的登录用户#- MYSQL_USER='ecuser'#- MYSQL_PASSWORD='123456a?'privileged: trueports:- "3308:3306"restart: alwayscommand: ['--character-set-server=utf8mb4','--collation-server=utf8mb4_unicode_ci']networks:- ruoyi-net# 配置redis服务redis7:# 设置容器对应的镜像image: redis:7.2.3# 设置容器名container_name: redis7# 配置环境environment:- TZ=Asia/Shanghai# 同上,作为端口映射ports:- "6379:6379"# 同上,挂载文件夹volumes:# 配置文件(需要在宿主机路径上传redis.conf文件)- /data/docker-worker/redis/redis.conf:/etc/redis/redis.conf# 数据- /data/docker-worker/redis/data:/data/redis# 日志- /data/docker-worker/redis/logs:/var/log/redis# 设置命令command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass ''# 自动重启restart: alwaysnetworks:- ruoyi-net# 配置nignx服务nginx:# nginx最新镜像image: nginx:1.25.3# 定义容器名称container_name: nginx# 配置nginx环境environment:- TZ=Asia/Shanghai# 配置端口ports:- "80:80"- "443:443"# 配置挂载的文件夹volumes:# nginx 主配置文件- /data/docker-worker/nginx/nginx.conf:/etc/nginx/nginx.conf# nginx 配置文件夹- /data/docker-worker/nginx/conf:/etc/nginx/conf.d# nginx静态文件- /data/docker-worker/nginx/html:/usr/share/nginx/html# nginx日志- /data/docker-worker/nginx/logs:/var/log/nginx# 自动重启restart: alwaysnetworks:- ruoyi-netjar-grain-9000:image: openjdk:17container_name: jar-grain-9000restart: alwayscap_add:- SYS_PTRACEdepends_on:- mysql8- redis7ports:- "9000:9000"links: - mysql8environment:- spring.profiles.active=test- server.port=9000- REDIS_HOST=redis7- DB_HOST=mysql8- DB_PORT=3306- DB_NAME=hy_cost_grain- DB_USERNAME=root- DB_PASSWORD=123456- FILE_BASE_PATH=/data/grain/uploadPathvolumes:- /data/grain:/data/grainworking_dir: /data/graincommand: java -Xmx1024m -jar hy-admin.jarnetworks:- ruoyi-net
注:详解docker compose的version(是指compose版本。默认2,这里用3.0)
https://www.cnblogs.com/daizichuan/p/17732059.html
https://cloud.tencent.com/developer/article/2291042?areaSource=102001.17&traceId=l78txME4HLUl-hqPvwGUV
2、将 docker-compose.yaml 上传至之前上传的jar包的文件路径
3、启动并排查启动情况
3.1 创建 docker-compose.yaml 文件中的容器
docker compose -f /data/grain/docker-compose.yaml up -d
# docker-compose.yaml 文件路径一致时,可以简写为
docker compose up -d
3.2 查看整体启动情况
docker compose -f /data/grain/docker-compose.yaml ps
# docker-compose.yaml 文件路径一致时,可以简写为
docker compose ps
3.3 查看异常容器状态的日志(上面 ps 命令中status 显示异常的)
# docker compose -f 路径/docker-compose.yaml logs -f 容器名
docker compose -f /data/grain/docker-compose.yaml logs -f mysql8
# docker-compose.yaml 文件路径一致时,可以简写为
docker compose logs -f mysql8
3.4 移除 docker-compose.yaml 文件的容器
docker compose -f /data/grain/docker-compose.yaml down
# docker-compose.yaml 文件路径一致时,可以简写为
docker compose down
五、docker 镜像合并(测试失败)
注:docker17.05版本开始 才支持多阶段构,理论上能将所有操作合并成一个镜像
【1】Dockerfile多个from的使用及多个build-arg的使用示例
https://blog.csdn.net/quyingzhe0217/article/details/129319294?utm_source=miniapp_weixin
【2】docker 合并所有镜像 docker from多个镜像
https://blog.51cto.com/u_14112/6687045
【3】 Docker 多阶段构建打包Java应用
https://blog.csdn.net/LK_Lawliet/article/details/131950674
测试结果
测试失败,理论上是可以;但是需要解决各种问题
例如:以centos docker基础镜像,在上面安装mysql、redis、nginx、程序
将这些步骤封住哪个成一个 dockerFile,一键就可完成所有;
其操作跟打包linux带环境镜像的工作量一样大,这里就不试验了
六、docker镜像与容器的导入导出
【1】Docker及Docker-compose常用命令总结
https://blog.csdn.net/weixin_42521409/article/details/130638142
【2】docker镜像的导入和导出
https://www.cnblogs.com/kanie-life/p/17532411.html
docker镜像的导入和导出
1 镜像导出
docker save > 生成路径/[镜像名].tar 镜像ID
docker save 镜像ID > [镜像名].tar
docker save -o [镜像名].tar 镜像ID 镜像ID 镜像ID(可多个images打包成一个)#测试 7.2.3单独,其他合并,跨机器测试)
docker pull redis:7.2.3
docker pull redis:7.2
docker pull redis:7.0.14
docker pull redis:6.2.14# 导出单个镜像
docker save > /data/docker-export/redis:7.2.3.tar redis:7.2.3
# 导出多个,不能指定路径;只能切换路径导入当前文件夹
cd /data/docker-export
docker save -o redisMore.tar redis:7.2 redis:7.0.14 redis:6.2.14
2 镜像导入
# docker load < [镜像名].tar
docker load < redis:7.2.3.tar
docker load < redisMore.tar
# 测试
镜像都可用启动,可用#删除镜像前,需检查镜像是否存在引用
docker ps
#若存在引用,删不掉,只会把镜像的标签名和版本号删掉
docker image ls
#删掉一半的 docker rmi -f 镜像ID
docker rmi -f redis:7.2.3
3 容器导出
docker export (生成路径,无则生成当前文件夹) 容器的ID > [容器名].tar
4 容器导入
docker import [容器名].tar 自定义容器名
5 实例化并启动容器
docker run -d 自定义容器名
注:如实例化失败,提示docker: Error response from daemon: No command specified
解决:运行指令docker ps -a,查看容器的COMMAND,并将COMMAND的值加入到启动命令最后面。
将容器打包成镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]、
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
eg:docker commit -a “abc” -m “123” 容器ID 自定义镜像名:版本
容器导入导出与镜像导入导出的选择
如果需要把 A 机器上的容器1迁移到 B 机器上, 且容器1中有重要的数据需要随之一起迁移的, 就可以选择容器导入导出。
七、docker 跨机器网络通信
【1】Docker跨主机通信解决方案探讨(仅是解决方案优缺点介绍)
https://blog.csdn.net/adparking/article/details/119140506
【2】Docker网络体系结构:设计可扩展、可移植的Docker容器网络(含解决方)
https://blog.csdn.net/docerce/article/details/79278568
【3】Docker跨主机网络通信(简单、精炼)
https://blog.csdn.net/qq_36733838/article/details/130533447
方案
###方案一
少量直接使用主机ip 简单
###方案二
(推荐-机器较多)docker swarm 集群服务编排部署指南(docker stack)
https://blog.csdn.net/footless_bird/article/details/129121931
量多:
1)先用:docker swarm 搭建集群环境(极限是在 1000 个节点上运行 50000 个部署容器)
2)创建用于swarm服务的自定义的overlay网络
3)改造docker-compose.yml 文件, 并 用Docker Stack 编排集群环境下的多服务
# swarm 集群网络(每台机器都要执行)
# 1、开放以下TCP协议端口,2377 :集群管理端口; 7946 :节点之间通讯端口(不开放则会负载均衡失效)
# 4789 :overlay网络通讯端口
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent# 更新firewalld防火墙规则(并不中断用户连接,即不丢失状态信息)
firewall-cmd --reload# 2、创建docker swarm集群
**注:swarn 对主节点磁盘占用较大,真实可以主节点用个1T~8T的磁盘,我这边测试用了120g,docker虚拟网络占了80G的磁盘(含其占用但未使用的)**
# 2.1 master主机上初始化swarm
docker swarm init
# 注:如果主机有多个网卡,拥有多个IP,必须使用 --advertise-addr 指定 IP。
# 示例:
docker swarm init --advertise-addr 192.168.99.100
# 2.2 在非主节点上执行初始化的节点名
docker swarm join --token SWMTKN-1-6ckn864g7ve7dd32x6il0os9oj1vanzptor5tgho07r07jn9a0-2w2n30m22aihpq8dlr8g7ite5 192.168.0.8:2377# 2.3 在master 节点查看信息
# 查看 swarm 集群状态
docker info
# 查看集群节点信息
docker node ls
# 3 创建用于swarm服务的自定义的overlay网络
docker network create -d overlay --attachable swarm-overlay
# 注:overlay 网络创建可以在 Swarm 集群下的任意节点执行,并同步更新到所有节点。
# 4 测试创建3个nginx(只能在主节点执行创建,且集群机器够用,不够则执行卡那):docker service
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.25.3# 4.1 查看服务状态:
docker service ls# 4.2 删除服务
docker service rm nginx
**注:实际情可能网络较为复杂,例如:****1)xx局项目,有个队列是实体机器,容器应用得访问此台机器生成要处理的任务;因为应用session(shiro)存储在redis,
所以外部机器也得访问 容器环境的redis;固:中间件需要指定节点启动,不能瞎搞,且需要挂在磁盘目录;****2)当时这个环境并发量不大,用NFS做磁盘共享,无文件服务器;若量大了需要独立文件服务,若依解决方案是minio,简单的就自己写个文件上传下载+NFS共享磁盘**
1)实际情况,一般实际(mysql,redis,指定节点创建)
2)程序和前端能无主注册到负载均衡器上
3)随便启动一定副本的前端和后端
注:1)一个程序流量崩溃最大的头的前端(集群不能满足流量就得加DNS),文件(独立服务,甚至必要时只提供少量服务)
2)我们当时前后一体,负载均衡器自动识别有效的服务,对外提供服务;
3)云厂商提供oos 服务,可支持前端全球负载和DNS;
4)阿里云springboot后台自动扩容及负载,根据实时负载自动扩缩容ECI实例:https://help.aliyun.com/zh/eci/user-guide/automatically-scale-elastic-container-instances-based-on-real-time-workloads
其他有用教程
【1】docker swarm 部署minio集群并配合nginx实现负载均衡
https://www.cnblogs.com/JentZhang/p/17120500.html
【2】linux环境docker部署ruoyi-vue(若依)总结
https://zhuanlan.zhihu.com/p/438076591
【3】docker swarm 指定节点部署应用
https://zhangqingya.cn/2022/07/06/docker%20swarm%E9%9B%86%E7%BE%A4%E4%B8%AD%E5%A6%82%E4%BD%95%E6%8C%87%E5%AE%9A%E5%AE%B9%E5%99%A8%E9%83%A8%E7%BD%B2%E8%8A%82%E7%82%B9
1、简单测试
这里简单部署一台应用,在指定节点上创建服务
# 参考教程 使用Docker Stack部署应用:https://zhuanlan.zhihu.com/p/182198031
docker stack deploy -c services.yml learn-docker-test
docker stack ls
docker service ls
docker service logs -f learn-docker-test_jar-grain-9000
注:
1)services.yml 详见附件,其中含包含2个: docker service和 docker stack命令,这里详细用法就不多做介绍
2)services.yml 中的网络类型 overlay,再包含 deploy 发布属性;
八、docker 共享存储
Docker Swarm NFS 数据持久化存储:https://blog.csdn.net/IT_ZRS/article/details/128648548
九、docker 未列明知识
【1】docker操作命令查漏
菜鸟:https://www.runoob.com/docker/docker-command-manual.html
(2019年后未更新,学的快):http://www.zhaowenyu.com/docker/dockerbackground/docker-history.html
【2】docker 容器监控、日志监控、资源监控
见/docker课件-汇总
–3.1 容器监控-N.pptx
–3.2 日志监控-N.pptx
–3.3-资源管理-N.pptx
【3】docker 仓库及扩容
扩容见/docker课件-汇总
–3.4-快速扩容-N.pptx
私有仓库 可用 1)docker nexus3 仓库
参考:https://blog.csdn.net/lishuoboy/article/details/130612821
2)harbor
https://blog.csdn.net/qq_47800859/article/details/129303922
相关文章:
docker 部署教学版本
文章目录 一、docker使用场景及常用命令1)docker使用场景2)rocky8(centos8)安装 docker3)docker 常用命令补充常用命令 二、 单独部署每个镜像,部署spring 应用镜像推荐(2023-12-18)1、 安装使用 mysql1.1 …...
2023春季李宏毅机器学习笔记 05 :机器如何生成图像
资料 课程主页:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub:https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程:https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、图像生成常见模型…...
C#和C++存储 和 解析 bin 文件
C 解析 bin 文件 // C 解析 bin 文件 #include <stdio.h>int main() {FILE *file; // 定义文件指针file fopen("example.bin", "rb"); // 打开二进制文件(只读模式)if (file NULL) {printf("无法打开文件\n");re…...
【React系列】Redux(二)中间件
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 中间件的使用 1.1. 组件中异步请求 在之前简单的案例中,redux中保存的counter是一个本地定义的数据…...
YOLOv8改进 | 2023Neck篇 | 利用Gold-YOLO改进YOLOv8对小目标检测
一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…...
ubuntu环境安装配置nginx流程
今天分享ubuntu环境安装配置nginx流程 一、下载安装 1、检查是否已经安装 nginx -v 结果 2、安装 apt install nginx-core 过程 查看版本:nginx -v 安装路径:whereis nginx nginx文件安装完成之后的文件位置: /usr/sbin/nginx…...
【LMM 010】MiniGPT-v2:使用独特的标识符实现视觉语言多任务学习的统一的多模态大模型
论文标题:MiniGPT-v2: Large Language Model As a Unified Interface for Vision-Language Multi-task Learning 论文作者:Jun Chen, Deyao Zhu, Xiaoqian Shen, Xiang Li, Zechun Liu, Pengchuan Zhang, Raghuraman Krishnamoorthi, Vikas Chandra, Yun…...
人工智能如何重塑金融服务业
在体验优先的世界中识别金融服务业中的AI使用场景 人工智能(AI)作为主要行业的大型组织的重要业务驱动力,持续受到关注。众所周知,传统金融服务业在采用新技术方面相对滞后,一些组织使用的还是上世纪50年代和60年代发…...
Iterable 对象转换为 Stream 对象
在 Java 8 中,可以使用 Stream API 来对集合进行操作。要将 Iterable 对象转换为 Stream 对象,可以使用 StreamSupport 类的 stream() 方法。具体来说,可以按照以下步骤进行转换: 调用 Spliterators.spliteratorUnknownSize(iter…...
基于Java+SpringBoot+vue+elementUI私人健身教练预约管理系统设计实现
基于JavaSpringBootvueelementUI私人健身教练预约管理系统设计实现 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于JavaSpringBootvueelementUI私人健身教练预约管理系统设计实现一、前言介绍:二、系统设计:2.1 性能需求分析2.2 B/S架构&…...
2024,启动(回顾我的2023)
零.前言 打开博客想写个年度总结,发现已经半年没有更新文章了,排名从几千掉到了几万,不过数据量还是不错的。 时间过得可真快,2023年是充满动荡的一年,上半年gpt横空出世,下半年各种翻车暴雷吃瓜吃到嘴软…...
Web网页开发-盒模型-笔记
1.CSS的三种显示方式 (1)块级元素:标签所占区域默认为一行 特点:一行一个 可设宽高 (2)行内元素:标签所占区域由内容顶开,行内元素无法使用text-align 特点:一行多个 不可设宽高,margin上下和padding上下都不能改变位…...
Java打成压缩包的方法汇总
文章目录 1.将指定目录下的文件打包成 .zip2.将指定目录下的文件打包成 .tar.gz3.将指定目录下的文件打包成 .tar4.将指定目录下的文件打包成 .rar5.生成若干个txt并打包到zip中 1.将指定目录下的文件打包成 .zip 代码示例: import java.io.*; import java.util.z…...
2023年第2季社区Task挑战赛贡献者榜单
基于FISCO BCOS及Weldentity,实现SSO单点登录服务;提供食品溯源、电商运费险7天退保、电子病历等智能合约库业务场景案例;基于FISCO BCOS更新游戏体验;体验并分析解读最新发布的分布式数据协作管理解决方案DDCMS,提供相…...
Clickhouse 为什么快
ClickHouse是一个用于联机分析处理(OLAP)的开源列式数据库管理系统(DBMS)。它之所以能提供出色的查询性能和处理速度,主要归功于以下几个方面的设计和优化: 列式存储 ClickHouse存储数据按列而不是按行组织…...
【React系列】react-router
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识react-router 1.2. 前端路由原理 前端路由是如何做到URL和内容进行映射呢?监听URL的改变。 UR…...
[数据集][目标检测]车辆检测数据集VOC+YOLO格式1.6w张3类别
一共分为3个压缩包: 【车辆检测数据集AVOCYOLO格式5423张3类别】 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5423 标注数…...
FindMy技术用于鼠标
鼠标是计算机的标准配置之一,其设计初衷是为了使计算机的操作更加简便快捷,减少用户在操作中的负担。用户可以通过移动鼠标,实现光标的精确移动,进而选择、拖拽、复制、粘贴等操作。这种操作方式,使得计算机的操作变得…...
已解决‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。”的问题
已解决‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。”的问题 文章目录 问题介绍 问题分析 解决思路 解决方法 检查并修复环境变量 进入c:\windows\system32再ping 使用系统工具修复系统文件 Q1 - 问题介绍 当您尝试在Windows命令提示符下…...
基于PGPGPOOL-II部署PostgreSQL高可用环境
PGPOOL-II是一个位于PostgreSQL服务器和 PostgreSQL 数据库客户端之间的中间件,具有以下功能: 1. 连接池:PGPOOL-II可以保持已经连接到 PostgreSQL 服务器的连接,并在使用相同参数(例如:用户名、数据库、协议版本)连接进来时重用它们。这可以减少连接开销,并增加系统的…...
【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建
【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行模式-CSDN博客 1、模板虚拟机环境准备 1.1、 hadoop100 虚拟机配置要求如下 &…...
Python 操作 JMeter 探索:pymeter 实操指南
概要 JMeter 是一个流行的性能测试工具,用于测试 Web 应用程序的性能和负载。它通常与 GUI 一起使用,但如果您想在自动化测试中集成 JMeter,或者以编程方式创建和运行测试计划,那么 pymeter 库将是一个强大的工具。本文将介绍如何…...
微软 Power Platform 使用Power Automate发送邮件以Dataverse作为数据源的附件File Column
微软Power Platform使用Power Automate发送邮件添加Power Apps以Dataverse作为数据源的附件File Column方式 目录 微软Power Platform使用Power Automate发送邮件添加Power Apps以Dataverse作为数据源的附件File Column方式1、需求背景介绍2、附件列File Column介绍3、如何在Po…...
雾天条件下 SLS 融合网络的三维目标检测
论文地址:3D Object Detection with SLS-Fusion Network in Foggy Weather Conditions 论文代码:https://github.com/maiminh1996/SLS-Fusion 论文摘要 摄像头或激光雷达(光检测和测距)等传感器的作用对于自动驾驶汽车的环境意识…...
在pycharm中执行 os.makedirs 提示用户名或密码不正确
问题:在pycharm中运行脚本,在 \10.0.21.249\share 共享目录下创建目录提示错误 发现:手动在该目录下创建目录没有问题。 解决方法: 切换到cmd 命令行运行该脚本成功创建 猜测:感觉应该是pycharm中使用的用户名和密码存…...
使用Go语言编写高效的HTTP服务器
随着互联网的快速发展,HTTP服务器在Web开发中扮演着越来越重要的角色。而Go语言作为一种高效、并发性强的编程语言,为编写高性能的HTTP服务器提供了强大的支持。本文将探讨如何使用Go语言编写高效的HTTP服务器。 首先,我们需要了解Go语言的H…...
代码随想录day20 开始二叉搜索树
654.最大二叉树 题目 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构…...
从0开始python学习-39.requsts库
目录 HTTP协议 1. 请求 2. 响应 Requests库 1. 安装 2. 请求方式 2.1 requests.请求方式(参数) 2.2 requests.request() 2.3 requests.session().request() 2.4 三种方式之间的关联 3. 请求参数 3.1 params:查询字符串参数 3.2 data:Form表单…...
【面试高频算法解析】算法练习3 双指针
前言 本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态 专栏导航 二分查找回溯双指针滑动窗口深度优先搜索…...
React16源码: Why16, 研究源码的意义, 源码目录核心结构分析
为什么要选择React16 现在React18都早已实践很多,为何回过头来看16版本的代码理由如下 从实际出发,企业内老旧项目多为16版本,理解16的核心能够帮助我们快速解决问题16版本React是完全重写了核心代码, 是一次重大的更新 引入了 fiber 这个概…...
wordpress需要哪些插件/无锡网络推广平台
实用过创维酷开智能电视“电视派”功能的用户,大部分都可能会觉得很好用。不过,也有部分网友表示,在实际使用中碰到过,电视派控制设备连接wifi总是失败的现象。那么,出现这样的情况,我们用户又该如何处理呢…...
东莞网站建设方案/seo 资料包怎么获得
(1)你一般怎么建索引的?去my.cnf里配置三个配置打开慢查询日志slow_query_log1慢查询日志存储路径slow_query_log_file/var/log/mysql/log-slow-queries.logSQL执行时间大于3秒,则记录日志long_query_time3首先进行SQL优化然后遵守简历索引规则索引并非越…...
一学一做征文网站/广东seo教程
Lvs Dr模式的模拟测试 1.用ifconfig配置IP,Lvs的ip为200.168.10.1, realserver1的ip为200.168.10.2,realserver2的ip为200.168.10.3,虚拟IP 为200.168.10.10。 2.Lvs server配置: Shell>ifconfig eth0:0 200.168.10.10 netmask…...
嘉兴网站建设技术开发/免费域名注册
package java.util;import java.util.function.Predicate; import java.util.stream.Stream; import java.util.stream.StreamSupport;/***1.Collection接口是集合继承关系中的根接口(root interface),有些集合允许重复元素, * 有些集合有序,JDK不提供…...
企业英文网站建设的重要性/百度账户推广登陆
电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “2…...
南京做网站哪家最好/泽成杭州seo网站推广排名
本学习系列介绍: 本学习系列主要针对对编程略有了解或有其他语言基础并要进一步学习Python的同学,通过简易的代码快速入门掌握Python语言。 系列总目录:用简易代码快速学习Python(一)用简易代码快速学习Python&#…...