Docker核心技术精讲:从入门到企业级实战
第一章=>Docker概述
第二章=>Docker安装与镜像下载加速
第三章=>镜像
第四章=>容器
第五章=>发布镜像到阿里云或私有化仓库
第六章=>容器卷
第七章=>Docker安装常用软件
第八章=>Docker高级版-Mysql主从复制、Redis主从、分布式存储
第九章=>DockerFile
第十章=>DockerNetwork
第十一章=>Compose
第十二章=>Docker图形化工具Portainer
*******************************************************************************************************************************************
第一章=>Docker概述
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
【1】一切在云端,万物皆容器
【2】是什么?能干嘛?去哪下?怎么玩?永远的HelloWorld
Docker为什么出现?之前开发和运维的扯皮,由于环境不同,问题表现则各异,容器平滑迁移技术出现。Docker让搬家升级为搬楼!搬整个开发环境给运维!
【3】centos7.iso 镜像文件保证了迁移的一致,一次镜像处处运行
配置vi /etc/sysconfig/network-scripts/ifcfg-enp0s3(不同机器,网卡名称不同,如京东的塔式服务器)
BOOTPROTO=dhcp # 不是static重要重要重要!!!
ONBOOT=yes
IPADDR=192.168.0.205 # 重要重要重要!根据windows网段做对应修改,用205是为了防止IP冲突!修改box热键是一路点击第一个
GATEWAY= 192.168.0.1 # 重要重要重要!根据windows cmd获取的做修改(不同的计算机,默认网关不同!)
最后service network restart 或者执行systemctl restart network
【4】Docker是基于go语言实现的开源项目。应用打包为镜像,通过镜像运行成容器实例。跨平台、跨服务器。
【5】容器和虚拟机的区别:虚拟机就是带环境安装的一种解决方案。为了节约资源,基础资源复用,最小的内核支撑软件,这就是容器虚拟化解决的问题。
Docker实在操作系统层面实现了虚拟化。
【6】能解决什么问题?开发兼运维工程师!一次构建,随处运行。快速、便捷、简单、高效。新浪、美团都在用。
*******************************************************************************************************************************************
第二章=>Docker安装与镜像下载加速
【1】Docker hub。Docker必须部署在Linux内核的系统上。
cat /etc/redhat-release
uname -r
【2】Docker的三要素:镜像(类)--->容器(对象)--->仓库(存放镜像)
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
【3】图解:Client(docker build/pull/run)---DokcerHost(本地镜像---远程仓库拉取===>运行成容器)
运行主机:后台守护进程(mysql/redis/nginx)。
【4】架构版:Docker是CS架构,后端是一个松耦合架构,众多模块各司其职。Docker也具备网络环境。
【5】安装Docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 配置从阿里云下载
yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
docker images
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker version
docker run hello-world
【6】配置阿里云加速 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vtaihzzp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker run hello-world
*******************************************************************************************************************************************
第三章=>镜像
【1】hello-world分析:本机是否有镜像---去远程仓库查询---拉取、运行
【2】Docker为什么比虚拟机快?有比虚拟机更少的抽象层。Dokcer用宿主机内核,不需要加载操作系统OS内核。
【3】常用命令
docker build --help:构建镜像的帮助信息。
docker push --help:将镜像推送到远程仓库的帮助信息。
docker pull --help:从远程仓库拉取镜像的帮助信息。
docker stop --help:停止容器的帮助信息。
docker start --help:启动容器的帮助信息。
docker restart --help:重启容器的帮助信息。
docker logs --help:查看容器日志的帮助信息。
【4】docker images
docker search hello-world
docker pull hello-world #不写版本号,默认是最新的
docker system df #查看镜像容器占用的空间
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
什么是虚悬镜像?指仓库名和标签都是<none>的镜像。在实际开发中,在构建或者删除镜像时出错会有一定概率出现虚悬镜像。
要删除虚悬镜像,可以使用命令:docker image prune -a
*******************************************************************************************************************************************
第四章=>容器
【1】启动容器,进入容器,管理容器自启动
docker run -itd -p 8003:80 --name {容器的名称} --restart always {镜像ID}
docker update --no-start {容器ID}
docker update --restart always {容器ID}
docker exec -it {容器ID} /bin/bash #退出是exit
docker ps
docker ps -a
【2】docker run -itd ubuntu # 启动后台守护而且可以交互的容器
docker exec -it xxx /bin/bash
docker rm -f $(docker ps -a -q) # 删除所有容器
【3】赵子龙:能进能退,才是真正法器。
编码开发微服务---上线部署容器化---时时刻刻要监控!!!
docker exec -it xxx /bin/bash # 进入
exit #退出
Docker技术是云原生的未来!!!一切在云端,全部跑容器!
【4】从容器拷贝文件到主机: docker cp 容器ID:容器路径 目的主机路径
docker cp 62167badc877:/1.txt /root/1.txt (在宿主机操作命令)
Successfully copied 1.54kB to /root/1.txt
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - wdfgdzx/ubuntu:2.1 这是还原为镜像
docker run -itd wdfgdzx/ubuntu:2.1 即可回复原有的容器(1比1还原)
*******************************************************************************************************************************************
第五章=>发布镜像到阿里云或私有化仓库
【1】镜像:轻量级、可执行的独立软件包。镜像是分层的:UFS联合文件系统。Docker底层:bootfs--->rootfs。加载简单可以复用。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
镜像是只读的,容器是可写的。
【2】乌班图安装vim后重新更改镜像!
apt-get update
apt-get -y install vim
vim 1.txt 就可以正常使用了!容器更强大了!
docker commit -m="change info" -a="xlliu24" 62167badc877 my_ubuntu:1.1 #让更改后的容器成为镜像!(加了个vim功能变成了189MB)
【3】docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
docker run -itd 8379e9aa9c7a
docker exec -it 391e069e0e3a /bin/bash (直接可以使用vim命令,因为是自己改造过的镜像运行产生的容器)
【4】发布自己修改的镜像到阿里云
docker login --username=wdfgdzx@163.com registry.cn-hangzhou.aliyuncs.com # 一步
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。HIT...
docker tag 8379e9aa9c7a registry.cn-hangzhou.aliyuncs.com/wdfgdzx/wdfgdzx_aliyun:20231202 # 二步
docker push registry.cn-hangzhou.aliyuncs.com/wdfgdzx/wdfgdzx_aliyun:20231202 # 三步
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker pull registry.cn-hangzhou.aliyuncs.com/wdfgdzx/wdfgdzx_aliyun:20231202 # 拉取到本地
【5】私有库操作(Docker Registry)
docker pull registry
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -d -p 5000:5000 -v /docker/registry:/tmp/registry --privileged=true registry (说明连本地仓库都是docker搭建的,云原生的未来,卧槽)
docker run -itd ba6acccedd29(跑原生ubuntu镜像)
docker exec -it 容器ID /bin/bash (进入ubuntu容器)
apt-get update
apt-get -y install net-tools
ifconfig(就可以看到网络配置了)
exit
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker commit -m="change info" -a="xlliu24" 容器ID my_ubuntu:1.2(改变容器产生镜像)
my_ubuntu 1.2 0e9d02626e32 5 seconds ago 122MB(产生的镜像)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
curl -XGET http://192.168.0.205:5000/v2/_catalog
{"repositories":[]} (返回的信息)
docker tag my_ubuntu:1.2 192.168.0.205:5000/my_ubuntu:1.2 (规范化命名镜像)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
取消推送限制
vim /etc/docker/daemon.json
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
配置如下:
{
"registry-mirrors": ["https://vtaihzzp.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.0.205:5000"]
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
systemctl restart docker
记得启动私有化仓库的容器,docker start 容器ID
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker push 192.168.0.205:5000/my_ubuntu:1.2
curl -XGET http://192.168.0.205:5000/v2/_catalog
{"repositories":["my_ubuntu"]}(再次查看就有了!!!)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker pull 192.168.0.205:5000/my_ubuntu:1.2 (拉取也是成功的!!!)
*******************************************************************************************************************************************
第六章=>容器卷
【1】一个坑的讲解:--privileged=true 容器卷一定记得开启权限,不然报错(Permission denied)!!!这样容器的root才拥有root权限
docker run -d -p 5000:5000 -v /docker/registry:/tmp/registry --privileged=true registry (还记得这个命令吗?哈哈)
说到底是:重要资料的备份,卧槽,牛批了!容器的数据备份+持久化本地目录。类似Redis的rdb与rof,与解决实际问题不谋而合。
【2】docker run -itd --privileged=true -v /docker/xxx:/容器的目录/xxx 镜像名(使用模版)
【3】docker run -itd --privileged=true -v /docker/test:/docker/test --name=u1 ba6acccedd29(强大呀,还能建立目录,双向同步互通)
docker exec -it 容器ID /bin/bash
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker inspect 容器ID(能看到Mounts节点的挂载目录情况)
【4】默认是rw可读可写。容器内部只能读,不能写(模式是ro read only)
【5】卷的继承:容器2继承容器1的卷规则,(docker run -itd --privileged=true --volumes-from u1 --name=u2 ubuntu。这个实现了3个机器的数据共享,
A-B B-C 所以ABC数据都是一样的,卧槽!B主机数据只要在,容器数据都可以恢复,一主二从)
*******************************************************************************************************************************************
第七章=>Docker安装常用软件
【1】Mysql Redis Rmq(步骤:搜、拉、查、启、停、移)
【2】docker run -itd -p 8080:8080 tomcat
docker exec -it a16cd0888dad /bin/bash
rm -rf webapps
mv webapps.dist webapps
访问: http://192.168.0.205:8080/ 看到tomcat 10.0.14
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
配置有点不友好,麻烦,版本太新
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
docker run -itd -p 8080:8080 --name=my_tomcat billygoo/tomcat8-jdk8
http://192.168.0.205:8080/ (直接访问好不好,一步到位!!!!)
【3】以Mysql5.7为例
docker run -p 3306:3306 --name=mysql -v /docker/mysql/log:/var/log/mysql -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=s19911009 -d mysql:5.7
再加个定时cp,cp一份到/backup就万无一失了,牛批!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vim /docker/mysql/conf/my.cnf # 配置mysql,不配置字符集,插入中文就报错了
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker ps
docker restart mysql
show variables like 'character%'; (再进入查看编码就变了,插入中文就可以了)
docker update --no-start {容器ID}
docker update --restart always {容器ID}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it 容器ID /bin/bash
mysql -uroot -p
输入密码
select user,host from mysql.user; #查看用户情况(同样可以用)
【4】Redis
docker rm -f $(docker ps -a -q)
docker run -p 6379:6379 --name redis -v /docker/redis/data:/data -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf
docker cp 产生容器ID:/etc/redis/redis.conf /docker/redis/conf/redis.conf
会失败,因为reids.conf找不到,发现没有默认的redis.conf自己新建放置下!!!放置后再执行一次即可。!!!
docker run -p 6379:6379 --name redis -v /docker/redis/data:/data -v /docker/redis/conf:/etc/redis -d redis redis-server /etc/redis/redis.conf
我尼玛,我折腾了2小时。(这才是问题的根源,带.的路径,宿主机必须提前具备,不然就无法挂载,可以愉快的使用Docker了)
.sh执行报错,大部分是因为编码
vim 对应文件(必须有vim安装)
esc :set ff=unix 保存退出
set ff可以查看
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
配置持久化
vim redis.conf
appendonly yes
docker restart redis
【5】Nginx
docker rm -f $(docker ps -a -q)
docker run --name nginx --privileged -p 8001:80 -v /docker/nginx/html:/usr/share/nginx/html -d nginx
docker run --name nginx_tmp -itd nginx
docker cp 产生容器ID:/etc/nginx/conf.d/default.conf /docker/nginx/conf.d/default.conf(这才是问题的根源,带.的路径,宿主机必须提前具备,不然就无法挂载,可以愉快的使用Docker了)
docker run --name nginx --privileged -p 8001:80 -v /docker/nginx/conf.d:/etc/nginx/conf.d -v /docker/nginx/html:/usr/share/nginx/html -d nginx
我尼玛,我折腾了2小时。
*******************************************************************************************************************************************
第八章=>Docker高级版-Mysql主从复制、Redis主从(分布式存储)
【1】mysql主从复制
docker rm -f $(docker ps -a -q)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -p 3307:3306 --name=mysql_master -v /docker/mysql_master/log:/var/log/mysql -v /docker/mysql_master/data:/var/lib/mysql -v /docker/mysql_master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=s19911009 -d mysql:5.7
然后vim /docker/mysql_master/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
docker restart mysql_master
然后进入到容器的mysql中
create user 'slave'@'%' identified by 's19911009';
grant replication slave,replication client on *.* to 'slave'@'%';
flush privileges;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -p 3308:3306 --name=mysql_slave -v /docker/mysql_slave/log:/var/log/mysql -v /docker/mysql_slave/data:/var/lib/mysql -v /docker/mysql_slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=s19911009 -d mysql:5.7
然后vim /docker/mysql_slave/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
docker restart mysql_slave
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
进入到主容器mysql:show master status;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
进入到从容器mysql操作:
docker exec -it mysql_slave /bin/bash
进入到mysql
change master to master_host='192.168.0.205', master_user='slave', master_password='s19911009', master_port=3307, master_log_file='mall-mysql-bin.000003', master_log_pos=154, master_connect_retry=30;
show slave status \G;(NO NO)
start slave; (开启接收)
show slave status \G;(YES YES)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
用Navicat分别连接3307 3308,在3307操作,3308自动同步!!!牛批了(生产中也会用到!!!)
【2】分布式存储(1-2亿数据需要缓存,如何设计存储案例?---3主3从Redis集群扩缩容配置)
哈希取余分区(缺点:是如果宕机或者扩缩容,数据就不可控了)
一致性哈希算法分区(一致性哈希环,人类的智慧是伟大的,卧槽。解决了容错性与扩张性。缺点:数据倾斜问题)
哈希槽分区(节点不超过1000个,槽位不超过16384个。)
【3】Redis主从配置
docker rm -f $(docker ps -a -q)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -d --name redis-node-1 --net host --privileged=true -v /docker/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /docker/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /docker/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /docker/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /docker/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /docker/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.0.205:6381 192.168.0.205:6382 192.168.0.205:6383 192.168.0.205:6384 192.168.0.205:6385 192.168.0.205:6386 --cluster-replicas 1
(--cluster-replicas 1 表示为每个master创建一个slave节点 )
yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.0.205:6381)
M: 02e8815bd77c908e07ef90ed3b224b0eda12bfbd 192.168.0.205:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b78b2a7272044da9be8fb7f65a5451b599f2dddb 192.168.0.205:6383
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 434e381048b8951be2895d5fc81563d6506dfe28 192.168.0.205:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: de4c954594676fe97891664a59b29424514aa47b 192.168.0.205:6384
slots: (0 slots) slave
replicates b78b2a7272044da9be8fb7f65a5451b599f2dddb
S: d2f6acc92dcab7238e52e9899afd898b880e8eb2 192.168.0.205:6386
slots: (0 slots) slave
replicates 434e381048b8951be2895d5fc81563d6506dfe28
S: 788c716cfd36e15244f64f9050cf8e9118dfe312 192.168.0.205:6385
slots: (0 slots) slave
replicates 02e8815bd77c908e07ef90ed3b224b0eda12bfbd
[OK] All 16384 slots covered.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
链接进入6381作为切入点,查看节点状态
redis-cli -p 6381
cluster info
cluster nodes
1-4 2-5 3-6
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
数据读写存储
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381
27.0.0.1:6381> set k1 v1
(error) MOVED 12706 192.168.0.205:6383
127.0.0.1:6381> set k2 v2
OK
127.0.0.1:6381> set k3 v3
OK
127.0.0.1:6381> set k4 v4
(error) MOVED 8455 192.168.0.205:6382
为什么?因为是集群了,所以要变换连接方式了
redis-cli -p 6381 -c(所以集群的方式很重要了,非常重要了!!!)
127.0.0.1:6381> set k1 v1
-> Redirected to slot [12706] located at 192.168.0.205:6383
OK
192.168.0.205:6383> set k2 v2
-> Redirected to slot [449] located at 192.168.0.205:6381
OK
192.168.0.205:6381> set k4 v4
-> Redirected to slot [8455] located at 192.168.0.205:6382
OK
redis-cli --cluster check 192.168.0.205:6381(容器里执行,不是redis里执行,集群检查)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
容错切换迁移
主6381和从机切换,先停止主机6381
docker stop redis-node-1
docker exec -it redis-node-2 /bin/bash
redis-cli -p 6382 -c
cluster nodes
还原之前的3主3从
docker start redis-node-1
docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381 -c
cluster nodes(当初的大佬,回来后成为小弟,人走茶凉了)
docker stop redis-node-4
docker start redis-node-4
docker stop redis-node-5
docker start redis-node-5(老师经历一次整顿回来,我这个两次才回来123主 456从)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
主从扩容案例(阿里云的弹性扩容也是这个思想)(从3主3从 到 4主4从)
新建6387、6388两个节点+新建后启动+查看是否8节点
docker run -d --name redis-node-7 --net host --privileged=true -v /docker/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /docker/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node 192.168.0.205:6387 192.168.0.205:6381 (6387 去 拜拜 6381的码头)
[OK] New node added correctly.
redis-cli --cluster check 192.168.0.205:6381(检查集群情况第1次)
redis-cli --cluster reshard 192.168.0.205:6381(重新分派槽号)
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4(6387的ID)
Source node #1: all
redis-cli --cluster check 192.168.0.205:6381(检查集群情况第2次)
说明每家给了点,凑够了4096
为主节点6387分配从节点6388!!!
redis-cli --cluster add-node 192.168.0.205:6388 192.168.0.205:6387 --cluster-slave --cluster-master-id 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4
(-------这个是6387的编号,按照自己实际情况)
>>> Configure node as replica of 192.168.0.205:6387.
[OK] New node added correctly.
redis-cli --cluster check 192.168.0.205:6381(检查集群情况第3次)
至此扩容完成!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
主从缩容案例(从4主4从,恢复到3主3从)
将6388删除,从集群中将4号从节点6388删除
redis-cli --cluster del-node 192.168.0.205:6388 1e85f38da3370a7f4fa2c0b4dff529cffe19155f(这个是6388的ID)
>>> Sending CLUSTER RESET SOFT to the deleted node.
redis-cli --cluster check 192.168.0.205:6382(第1次检查集群情况)
redis-cli --cluster reshard 192.168.0.205:6381(将6387的槽号清空,重新分配,本例将清出来的槽号都给6381)
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 02e8815bd77c908e07ef90ed3b224b0eda12bfbd(这个是6381的ID)
Source node #1: 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4(这个是6387的ID)
Source node #2: done
redis-cli --cluster check 192.168.0.205:6381(第2次检查集群情况)
redis-cli --cluster del-node 192.168.0.205:6387 0aa800f79d3bb02abbbef2b3815a51eb97e4bfe4(将6387删除 )
Sending CLUSTER RESET SOFT to the deleted node.
redis-cli --cluster check 192.168.0.205:6381(第3次检查集群情况)
至此成功缩容!!!
【4】总结:证明了CSDN+模块化学习的高效和实用性。不浪费时间在细节上。唯亮观其大略。zzyybs@126.com
*******************************************************************************************************************************************
第九章=>DockerFile
【1】用来构建Docker镜像的文本文件。多次变化提交镜像太麻烦了,所以把所有变化列个清单,一次提交。(由一条条的构建指令组成)
三步走:编写DockerFile---docker bulid命令构建镜像---docker run镜像成容器。
【2】构建过程:每一条指令都会构建一个新的镜像并对镜像进行提交。不断的修改镜像---运行容器---修改容器---成为新镜像---运行容器...
DockerFile---镜像---容器!!!(这个就高明了,镜像毕竟太大,而药方很小)
【3】关键保留字(就是Java关键字吗)。
docker rm -f $(docker ps -a -q)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
FROM 基础镜像、MAINTAINER 作者、RUN 容器运行命令、EXPOSE 暴露端口、WORKDIR 一个落脚点、ENV 设置变量、
ADD 宿主机目录下的文件拷贝到镜像、COPY 。VOLUME 容器卷、CMD 指定容器启动后需要干的事情。ENTRYPOINT 类似CMD 但是不会被覆盖。
【4】用DockerFile改造基础centos7。vim+ifconfig+jdk8
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
(文件名字必须是Dockerfile 错误了找不到,卧槽!!!)
FROM centos:7
MAINTAINER xha<2533694604@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "Success--------------ok"
CMD /bin/bash
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker build -t my_docker_image .
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker images(你想要的JDK8也来了!!!)
REPOSITORY TAG IMAGE ID CREATED SIZE
my_docker_image latest 22e2644e4375 35 seconds ago 1.3GB
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker run -it my_docker_image /bin/bash
然后验证vim+ifconfig+jdk8都完成了!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
【5】虚悬镜像一定要删除清理掉。
【6】Docker微服务实战!(通过IDEA新建一个微服务模块,通过dockerfile发布微服务到docker容器)
先获取可运行的springboot.jar包
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#基础镜像使用java !!!这就保证了有JDK
FROM java:8
# 作者
MAINTAINER wdfgdzx
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD black-0.0.1-SNAPSHOT.jar dockertest.jar
# 运行jar包
RUN bash -c 'touch /dockertest.jar'
ENTRYPOINT ["java","-jar","/dockertest.jar"]
#暴露8000端口作为微服务
EXPOSE 8000
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker build -t my_java_image .
docker images
docker run -d -p 8000:8000 my_java_image
大功告成!!!
*******************************************************************************************************************************************
第十章=>DockerNetwork
【1】Docker网络(Docker启动的时候会多个网络信息docker0虚拟网桥)
docker rm -f $(docker ps -a -q)
ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:6d:39:7e:90 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
【2】network命令
docker network ls
NETWORK ID NAME DRIVER SCOPE
6742edfcbdb2 bridge bridge local
476e155a2e9b host host local
389f0d211d1a none null local
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
【3】跨Docker宿主机通信。可以通过服务名相互通信。
【4】网络模式(bridge 默认的模式,为每个容器分配设置IP 虚拟网桥、host、none、container)
【5】查看容器内部情况。
docker run -itd --name u1 ubuntu bash
docker run -itd --name u2 ubuntu bash
docker inspect u1
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6742edfcbdb28519dbcf2c0d2b7c3d168ed2a38bf1f593064d1a6c8348197a51",
"EndpointID": "9df7410166e5833b3d4dcf7293b543a1f93f44e0be4790fb1ca4f4db267aebeb",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker inspect u2
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6742edfcbdb28519dbcf2c0d2b7c3d168ed2a38bf1f593064d1a6c8348197a51",
"EndpointID": "d4fcf43046c6f3a784f62d3d284d305fd9fe3eaf21c2d44ea5e38d308e0952e6",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
u2容器去除,u3起来,u3的IP地址变成了"IPAddress": "172.17.0.3"。说明容器内部IP是有可能发生变化的。所以需要网络规划!!!
【6】bridge模式(veth---eth0)
docker rm -f $(docker ps -a -q)
docker network inspect bridge
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ip addr
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:6d:39:7e:90 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:6dff:fe39:7e90/64 scope link
valid_lft forever preferred_lft forever
13: vethadb6e1d@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether de:5b:85:56:d3:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::dc5b:85ff:fe56:d3d8/64 scope link
valid_lft forever preferred_lft forever
15: vetha49dab5@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4a:d9:87:69:7c:79 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::48d9:87ff:fe69:7c79/64 scope link
valid_lft forever preferred_lft forever
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it tomcat82 bash
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
说明:15: vetha49dab5@if14:----------14: eth0@if15:
【7】host模式(容器不会获得独立的network namespace)
docker rm -f $(docker ps -a -q)
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8(错误写法)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e03666064522 billygoo/tomcat8-jdk8 "catalina.sh run" 3 seconds ago Up 3 seconds tomcat83
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8(正确写法)
docker inspect tomcat83
"Networks": {
"host": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "476e155a2e9bdd220dc22757bdada2fb6b17ce3503e573569ab9680e3fdb4b13",
"EndpointID": "0a35032484d6831ed1909a627c6173bc8f2ecd98551d51843dc0619f6ba0a046",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker exec -it tomcat83 bash(和外网一样,没有自己的网络配置!而IP就是宿主机一样了!!!)
root@192-168-0-205:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:2b:c0:7a brd ff:ff:ff:ff:ff:ff
inet 192.168.0.205/24 brd 192.168.0.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::2828:7091:3a5:4816/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:6d:39:7e:90 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:6dff:fe39:7e90/64 scope link
valid_lft forever preferred_lft forever
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
http://192.168.0.205:8080 所以访问宿主机8080就可以访问,卧槽 还能这么方便吗?
【8】none禁用网络功能
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
docker inspect tomcat84
"Networks": {
"none": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "389f0d211d1a643935619a9e7a48b7431294c64b3ce58c350d5ec72bf5e42266",
"EndpointID": "89e05918528c4d2e9d8257d487874aa3a25f4d1694fdf138af03ece45d6fa586",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
【9】container网络模式(两张嘴公用同一个吸管)
docker rm -f $(docker ps -a -q)
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
会报错:docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
用另一种方法(两台机器的IP地址一样):
docker run -it --name alpine_1 alpine /bin/sh
docker run -it --network container:alpine_1 --name alpine_2 alpine /bin/sh
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
【10】自定义网络模式(感觉这个常用!解决docker容器的IP可能发生变化的问题。)
docker rm -f $(docker ps -a -q)
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
docker exec -it tomcat81 bash (ping 172.17.0.3)
docker exec -it tomcat82 bash (ping 172.17.0.2)
说明(用之前:IP地址可以ping通,但是容器名ping不通)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker network ls
docker network create my_network
docker network ls
NETWORK ID NAME DRIVER SCOPE
d04fde4026be bridge bridge local
476e155a2e9b host host local
9fe53f7c6524 my_network bridge local
389f0d211d1a none null local
docker run -d -p 8081:8080 --network my_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network my_network --name tomcat82 billygoo/tomcat8-jdk8
docker exec -it tomcat81 bash (ping tomcat82)
docker exec -it tomcat82 bash (ping tomcat81)
说明:自定义网络本身就维护好了主机名和IP的对应关系(IP和域名都能通,重要的是域名能通!!!--network my_network)
*******************************************************************************************************************************************
第十一章=>Compose容器编排
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
【1】比如20个容器怎么管理?compose是Docker官方开源的项目,负责实现对Docker容器集群的快速编排。
只需要一个docker-compose.yml,写好多个容器之间的调用关系,然后只要一个命令,就能启动或关闭这些容器。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
同比applicationContext.xml对Bean的管理。docker compose.yml 管理docker容器。
【2】compose下载安装步骤
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(下载慢可以用百度网盘。)
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
【3】核心概念(一个文件docker-compose.yml、两大要素service(比如mysql 订单微服务 reids等) project完整业务单元)
Dockerfile---docker-compose.yml---docker-compose up命令完成一键部署上线。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
常用命令:
docker-compose up
docker-compose down
docker-compose restart
docker-compose start
docker-compose stop
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
jar包打包成镜像运行微服务,先获取可运行的springboot.jar包放置到指定目录,然后vim Docekrfile!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#基础镜像使用java !!!这就保证了有JDK
FROM java:8
# 作者
MAINTAINER wdfgdzx
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD black-0.0.1-SNAPSHOT.jar dockertest.jar
# 运行jar包
RUN bash -c 'touch /dockertest.jar'
ENTRYPOINT ["java","-jar","/dockertest.jar"]
#暴露8000端口作为微服务
EXPOSE 8000
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker build -t xxx_image .
docker images
docker run -d -p 8000:8000 xxx_image
【4】不用compose就是多个容器分而治之,管理起来会比较麻烦。全部用容器(配置docker-compose是前提。),在/docker/docker_compose建立目录。
vim docker-compose.yml
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
version: "3"
networks:
my_network:
services:
my_service:
image: my_java_image
ports:
- 8100:8000 #左边 5000 是主机访问端口,可按需修改
volumes:
- "/docker/docker_compose/data:/data"
networks:
- my_network
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- 6379:6379 #左边 5000 是主机访问端口,可按需修改
volumes:
- "/docker/docker_compose/redis/redis.conf:/etc/redis/redis.conf"
- "/docker/docker_compose/redis/data:/data"
networks:
- my_network
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 's19911009'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'music'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 's19911009'
ports:
- "3306:3306"
volumes:
- /docker/docker_compose/mysql/db:/var/lib/mysql
- /docker/docker_compose/mysql/conf/my.cnf:/etc/my.cnf
- /docker/docker_compose/mysql/init:/docker-entrypoint-initdb.d
networks:
- my_network
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
【5】docker-compose常用命令
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行!!!
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
*******************************************************************************************************************************************
第十二章=>Docker图形化工具Portainer
【1】Portainer轻量级可视化管理docker工具
docker rm -f $(docker ps -a -q) #删除历史docker容器,不管是否在运行中!
docker rmi -f $(docker images -qa) # 批量删除镜像,慎用!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
多端口映射 --restart=always保证和docker同步启动
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
访问:http://192.168.0.205:9000/#/auth
admin s19911009
就可以看到可视化界面了!!!
【2】Portainer常规操作
Container发布一个nginx定义端口80(直接操作成功,牛批,比命令简单点!!!)
【3】CIG(在目录/docker/compose_cig下操作!!!)
docker stats原生界面+简单的可以用,更复杂的就需要CIG
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
version: '3.1'
# 挂载grafana_data数据卷
volumes:
grafana_data: {}
services:
# 创建数据库cadvisor
influxdb:
image: tutum/influxdb:0.9
restart: always
environment:
- PRE_CREATE_DB=cadvisor
# 对外暴露的端口
ports:
- "8083:8083"
- "8086:8086"
# influxdb数据卷挂载
volumes:
- ./data/influxdb:/data
cadvisor:
image: google/cadvisor
# cadvisor数据库连接容器influxsrv
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
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
docker-compose up -d
访问:
收集 192.168.0.205:8080 cAdvisor
存储 192.168.0.205:8083 influxdb SHOW DATABASES回车能开看到数据库
展现 192.168.0.205:3000 grafana admin admin 设置里配置InfluxDB(http://InfluxDB:8086 root root)
相关文章:
Docker核心技术精讲:从入门到企业级实战
第一章>Docker概述 第二章>Docker安装与镜像下载加速 第三章>镜像 第四章>容器 第五章>发布镜像到阿里云或私有化仓库 第六章>容器卷 第七章>Docker安装常用软件 第八章>Docker高级版-Mysql主从复制、Redis主从、分布式存储 第九章>Doc…...
【KWDB 创作者计划】_深度学习篇---向量指令集
文章目录 前言一、加速原理数据级并行(DLP)计算密度提升减少指令开销内存带宽优化隐藏内存延迟 二、关键实现技术1. 手动向量化(Intrinsics)优势挑战 2. 编译器自动向量化限制 3. BLAS/LAPACK库优化4. 框架级优化 三、典型应用场景…...
音视频小白系统入门课-4
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2音视频小白系统入门笔记-3 将mp4文件转换为yuv文件 ffmpeg -i demo.mp4 # 输入文件-an …...
CS144 Lab3 实战记录:TCP 发送器实现
文章目录 1 实验背景与目标2 TCP发送器的实现2.1 整体流程2.2 核心组件2.3 窗口管理2.4 关键函数实现2.4.1 push函数2.4.2 receive函数2.4.3 tick函数 3 仓库地址 1 实验背景与目标 在 TCP 协议中,发送器(TCP Sender)是实现可靠传输的核心组…...
Transformer:引领深度学习新时代的架构
引言 在深度学习的快速发展历程中,Transformer 架构如同璀璨的新星,照亮了自然语言处理(NLP)以及计算机视觉(CV)等众多领域的前行道路。自 2017 年在论文《Attention Is All You Need》中被提出以来&#…...
基于RabbitMQ实现订单超时自动处理
基于RabbitMQ实现订单超时自动处理 引言 在现代电商系统中,订单超时自动取消是一个常见的业务需求。传统的定时任务扫描数据库的方式存在性能瓶颈和实时性差的问题。本文将介绍如何使用RabbitMQ的消息队列和死信队列特性,构建一个高效可靠的订单超时自…...
nginx实现同一个端口监听多个服务
nginx实现同一个端口监听多个服务 前言原理配置不同域名基于路径(URL 路由)补充 总之完结撒花,如有需要收藏的看官,顺便也用发财的小手点点赞哈,如有错漏,也欢迎各位在评论区评论! 前言 受同…...
用 Firebase 和 WebRTC 快速搭建一款浏览器视频聊天应用
在现代 Web 应用中,实时音视频通信变得越来越普遍。本文将通过一个简洁实用的示例,带你一步步搭建一个基于 Firebase WebRTC 的浏览器视频聊天应用,帮助你理解 WebRTC 的核心通信机制以及如何借助 Firebase 进行信令传输。 🔧 技…...
记录一次OGG进程abended,报错OGG-01431、OGG-01003、OGG-01151、OGG-01296问题的处理
1. ogg进程abended的几种常见原因: 1. undo表空间不足导致abended。 2. 数据不一致,违反唯一约束导致abended。 3. 源端和目标端表结构不一致导致abended。 4. 源端表名过长,同步到目标端报错导致abended。 5. OGG-03517字符集转换问题导…...
机器学习分类算法详解:原理、应用场景与测试用例
机器学习分类算法详解:原理、应用场景与测试用例 一、基础分类算法 1. 决策树 原理: 通过递归划分数据集,选择信息增益(ID3)或基尼系数(CART)最大的特征作为分裂节点,构建树结构。叶节点代表分类结果。应用场景: 医疗诊断(需解释性,如判断疾病风险)。客户分群(如根…...
机器人仿真:相机信息仿真及显示
1)概要 除了激光雷达以外,机器人常用的视觉传感器还包括相机,相机图像能够获取真实世界的真实颜色和纹理信息,能够被用于进行目标检测、分割和追踪。 2)结果展示...
车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】
目录 1 摘要2 位置灯手动控制简述2.1 位置灯手动控制需求简述2.2 位置灯手动控制逻辑交互图 3 用例导出方法以及优先级原则3.1 用例导出方法3.1.1 用例导出方法介绍3.1.2 用例导出方法关键差异分析 3.2 优先级规则3.2.1 优先级划分的核心原则3.2.2 具体等级定义与判定标准 3.3 …...
gem5-gpu教程05 内存建模
memory-modeling|Details on how memory is modeled in gem5-gpu ====== gem5-gpu’s Memory Simulation ====== gem5-gpu, for the most part, eschews GPGPU-Sim’s separate functional simulation and instead uses gem5’s execute-in-execute model. Therefore, memory …...
如何提升个人解决问题的能力?
提升个人解决问题的能力是一个系统性工程,涉及思维、知识、经验和心态的多方面提升。以下是一些具体且可操作的方法,帮助你逐步增强解决问题的能力: 1. 培养「结构化思维」 明确问题本质: 遇到问题时,先问自己&…...
CSS清楚默认样式
* {margin: 0;padding: 0;box-sizing: border-box;} 这段 CSS 代码是一个常见的全局样式重置代码块,它会对网页中的所有元素(通过通配符 * 选择器)应用相同的样式规则,下面分别解释每一条规则的作用。 margin: 0; 在 HTML 中&a…...
问题:raw.githubusercontent无法访问
问题:raw.githubusercontent无法访问 文章目录 一、问题二、hosts文件2.1、hosts文件简介2.2、hosts文件位置2.3、hosts文件修改 3、解决方法3.1、查询出raw.githubusercontent.com的ip地址3.2、在/etc/hosts里填写IP地址3.3、再次执行命令 4、一些常用IP地址 一、问…...
【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite
一、介绍 二、简要概括 三、函数的使用 1、fgetc和fputc int fgetc ( FILE * stream ); 从文件中读取信息,每次读取一个字符 从流中获取字符返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符 int main() {//打开文件FI…...
(19)VTK C++开发示例 --- 分隔文本读取器
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 本例采用坐标和法线(x y z nx ny nz)的纯文本文件,并将它们读入vtkPolyData并显示…...
C++ 中 std::thread 的高级应用
C 中 std::thread 的高级应用、常见坑,以及如何封装为类,适合做线程池、异步任务、后台 worker、并发调度等场景。内容结构如下: 一、std::thread 高级用法清单 1. 线程成员函数调用(this 捕获) class Worker { publ…...
Linux之彻底掌握防火墙-----安全管理详解
—— 小 峰 编 程 目录: 一、防火墙作用 二、防火墙分类 1、逻辑上划分:大体分为 主机防火墙 和 网络防火墙 2、物理上划分: 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...
Linux安装ffmpeg7.1操作说明
安装yasm Index of /projects/yasm/releases/ 下载最新版 wget https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz 解压 tar -zxvf yasm-1.3.0.tar.gz 编译及安装 ./configure make && make install 安装ffmpeg https://download.csdn.net/down…...
Java 加密与解密:从算法到应用的全面解析
Java 加密与解密:从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代,数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段,被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文,使得…...
海思SDK的sensor驱动框架
对于海思的SDK之前一直对驱动的框架不清楚,只知道mpp的目录下的一些简单的业务demo,归根结底对这个SDK的框架还是不够了解,研究了一段时间才对该框架有一点认识。SDK是通过Makefile来管理和编译的所以对于Makefile文件需要有一定的理解&#…...
MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?
MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一,它允许我们在开发时以面向对象的方式构建 SQL 的 WHERE 条件、ORDER BY、SELECT 字段列表等部分。与传统的 MyBatis 在 XML 文件中…...
【PGCCC】Postgres 故障排除:修复重复的主键行
如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后,我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时,这可能会导致无效索引。 唯…...
Java多线程的暗号密码:5分钟掌握wait/notify
wait和join的区别 wait和join在使用上都是等待。 但是join是等待其他线程结束,而wait是等待其他线程的notify通知再运行。 当拿到锁的线程,发现要执行的任务时机不成熟的时候,使用wait进行阻塞等待,然后等时机成熟了再notify通…...
【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题
问题背景 由于直接下载的最新版本Android Studio,然后直接创建的新项目,因此默认的工程配置相比以前的老版本有了不少的变化,Gradle的新版本使用,导致一些配置项也发生了变化,加上谷歌针对gradle.properties文件的一些…...
8. kubernetes的service原理
Kubernetes 的 Service 是集群内部和外部访问 Pod 的核心抽象层,解决了 Pod 动态 IP 变化及负载均衡问题。以下是其核心概念、原理及使用方法: 一、Service 的核心概念 概念说明服务发现通过标签选择器(selector)动态关联一组 Po…...
杭电oj(1087、1203、1003)题解
DP 即动态规划(Dynamic Programming),是一种通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题的算法策略。以下从几个方面简述动态规划: 基本思想 动态规划的核心在…...
解锁安防新境界:XS9933四通道多合一同轴高清解码芯片方案
在安防监控领域,高清、高效、便捷一直是行业追求的目标。今天,我们要为大家介绍一款具有突破性的产品——XS9933四通道多合一同轴高清解码芯片方案,它将为安防监控带来全新的体验。 一、强大性能,高清呈现 XS9933是一款4通道模拟复…...
Mysql之存储过程
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。 目录 1.存储过程概述 2.存储过程的基本语法 2.1创建存储过程 2.2调用存储过…...
2.第二章:政策法规与标准体系
文章目录 2.1 全球数据治理政策概览2.1.1 欧盟GDPR2.1.2 美国数据法规2.1.3 亚太地区数据法规 2.2 国际标准体系2.2.1 ISO/IEC 270012.2.2 NIST框架2.2.3 DAMA DMBOK2.2.4 其他国际标准 2.3 中国数据治理法规体系2.3.1 《网络安全法》2.3.2 《数据安全法》2.3.3 《个人信息保护…...
Kubernetes (k8s) 日常运维命令总结
一、资源查看 查看所有命名空间的 Pod kubectl get pod --all-namespaces查看指定命名空间的 Pod kubectl get pod --namespace <命名空间>查看所有部署(Deployments) kubectl get deployments.apps --all-namespaces查看所有守护进程集࿰…...
NLP高频面试题(五十三)——LLM中激活函数详解
引言 在现代大型语言模型架构中,激活函数是贯穿神经网络各层的关键组件。它们通过为线性变换结果引入非线性,从而赋予模型表达复杂语言模式的能力。选择合适的激活函数,不仅影响训练的稳定性与收敛速度,还在推理阶段决定了计算效率与模型性能。本文将系统梳理常见激活函数…...
跨平台软件开发探讨
一、跨平台开发核心思路 1. 代码复用最大化 通过抽象平台差异实现核心逻辑复用,理想情况下70%代码可复用,仅30%处理平台特性。 2. 分层架构设计 业务逻辑层:完全平台无关(C/Rust) 平台适配层:封装系统AP…...
网络原理————HTTP
1,HTTP简介 我们上一期谈到了网络编程尤其是TCP和UDP,使用网络套接字来实现网络编程,上一期忘记说了,我们使用TCP的时候,我们用了线程池,这样就可以处理很多客户端而不会阻塞,那么如果客户端一…...
安装Jupyter Notebook 之不断报错 差点放弃版
error: subprocess-exited-with-error Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [6 lines of output] Cargo, the Rust package manager, is not installed or is not on PATH. This package requires Rust and Cargo to com…...
w~大模型~合集13
我自己的原文哦~ https://blog.51cto.com/whaosoft/13864163 #TextRCNN、TextCNN、RNN 小小搬运工周末也要学习一下~~虽然和世界没关 但还是地铁上看书吧, 大老勿怪 今天来说一下 文本分类必备经典模型 模型 SOTA!模型资源站收录情况 模型来源论文 RAE …...
【华为】防火墙双击热备-之-主备模式-单外网线路
FW1和FW2的业务接口都工作在三层,上行连接二层交换机。上行交换机连接运营商的接入点,运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下,流量通过FW1转发;当FW1出现故障时,流…...
学习记录:DAY16
Maven 进阶与前端实战 前言 二轮考核的内容下来了,由整体项目构建转为实现特定模块的功能。对细节的要求更高了,而且有手搓线程池、手搓依赖注入等进阶要求,又有得学力。嘻嘻,太简单了,只要我手搓 Spring Boot 框架……...
基于 Spring Boot 瑞吉外卖系统开发(六)
基于 Spring Boot 瑞吉外卖系统开发(六) 菜品列表 在系统管理端首页,单击左侧菜单栏中的“菜品管理”,会在右侧打开菜品管理页面。 请求URL/dish/page,请求方法GET,请求参数page,pageSize。 该菜品列表…...
香港服务器租用需要哪些性能要求
在如今数字化的时代,租用香港服务器成为了许多企业和个人的选择。但你知道租用香港服务器需要哪些性能要求吗?香港服务器租用需满足硬件性能、网络质量、安全合规、扩展能力四大核心要求,旨在支撑业务高并发、低延迟、稳定安全的运行环境。其…...
LLama Factory从入门到放弃
目录 简介 安装 LLama Factory界面介绍 数据格式要求 微调训练 今天在这里介绍一种常用的大模型微调框架——LLama Factory。 简介 LLama Factory 是一个高效的界面化大语言模型微调工具库,支持多种参数高效微调技术,提供简洁接口和丰富示例&#…...
钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)
大禹智库 第 9期〔总第463期〕2025-4-23 钧瓷产业许昌共识:技术破壁产业再造生态重构(一) ——基于钧瓷产业一体化与数字化原始创新的双轮驱动实践 在当今快速发展的科技领域,创新已成为推动进步的核心动力,企业生存和…...
思科路由器密码绕过+重置
思科路由器密码忘记,重新设置密码不重置配置 1、路由器在初始化过程中会询问是否进行初始化配置,输入no,将直接进入路由器,不会出现用户设置、密码设置等操作。 Would you like to enter the initial configuration dialog? [ye…...
OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…...
为什么圆形在GeoJSON中被表示为多边形(Polygon)而不是圆形类型
GeoJSON规范中没有"圆形"类型 GeoJSON是一种用于表示地理空间数据的标准格式,它的规范中只定义了以下几种基本几何类型: Point (点) LineString (线) Polygon (多边形) MultiPoint (多点) MultiLineString (多线) MultiPolygon (多多边形) Ge…...
【解读】Chrome 浏览器实验性功能全景
Chrome 浏览器提供了大量可配置的实验性或功能性设置,主要涉及安全、性能、多媒体、Web API、隐私等多个方面,这些设置可在 Chrome 浏览器的 flags 页面进行调整。 安全相关设置 不安全源设置:可通过#unsafely-treat-insecure-origin-as-sec…...
LInux平均负载
Linux平均负载是**指在一定时间内,系统中处于可运行状态或正在等待资源的进程数的平均值。**它是衡量系统整体工作负载的重要指标,反映了系统的繁忙程度。平均负载通常分为过去1分钟、5分钟和15分钟的平均值。 理解平均负载的关键点 与CPU核心数的关系 *…...
【人工智能】Ollama 负载均衡革命:多用户大模型服务的高效调度与优化
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在 多用户大模型推理 场景下,负载均衡 是确保高并发、低延迟的关键挑战。本文以 Ollama(一个流行的本地大模型运行框架)为例,深入探讨 …...