首页> 搜索结果页
"使用docker卡" 检索
共 1516 条结果
分布式1024节点!1天玩转PolarDB-X超大规模集群
作者:七锋、不俗架构简介PolarDB-X 采用 Shared-nothing 与存储分离计算架构进行设计,系统由4个核心组件组成。计算节点(CN, Compute Node) 计算节点是系统的入口,采用无状态设计,包括 SQL 解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度,负责分布式事务 2PC 协调、全局二级索引维护等,同时提供 SQL 限流、三权分立等企业级特性。存储节点(DN, Data Node) 存储节点负责数据的持久化,基于多数派 Paxos 协议提供数据高可靠、强一致保障,同时通过 MVCC 维护分布式事务可见性。元数据服务(GMS, Global Meta Service) 元数据服务负责维护全局强一致的 Table/Schema, Statistics 等系统 Meta 信息,维护账号、权限等安全信息,同时提供全局授时服务(即 TSO)。日志节点(CDC, Change Data Capture) 日志节点提供完全兼容 MySQL Binlog 格式和协议的增量订阅能力,提供兼容 MySQL Replication 协议的主从复制能力。开源地址:[https://github.com/polardb/polardbx-sql]实验说明PolarDB-X在22年11月份,发布开源v2.2新版本,这是一个重要的里程碑版本,重点推出符合分布式数据库金融标准下的企业级和国产化适配,共包括八大核心特性,全面提升 PolarDB-X 分布式数据库在金融、通讯、政务等行业的普适性。 版本发布文档:PolarDB-X v2.2: 企业级和国产ARM适配 开源重磅升级分布式数据库最重要的特性就是线性扩展,目前PolarDB-X现有用户生产部署有64~256节点的规模,考虑未来5~10年的发展诉求,期望分布式能至少支撑4~5倍的容量扩展,因此我们需要验证下分布式下更大规模的扩展性。本实验主要通过polardbx-operator,借助阿里云ACK容器服务,快速部署和体验PolarDB-X的大规模分布式(1024节点),通过常见的sysbench/tpc-c等benchmark工具来初步验证大规模节点下的稳定性。部署架构说明:PolarDB-X采用存储计算分离的架构,CN和DN是可以独立部署,本实验设计部署1024个DN节点,比如公有云PolarDB-X单个DN节点可支持3TB,那超大规模节点下可支持 1024 * 3TB = 3PB本实验设计为了可低成本的复现,节点规格上采用了压缩部署的模式,比如DN节点选择了最小的1C8GB (1024节点下也需要8TB的内存),通过k8s的多租户cgroup技术,采用24台高配ECS进行部署,单个ECS平均需要承载40+的PolarDB-X CN/DN节点。本实验所需要的测试资源的成本,24台ECS按量付费 288元/小时,测试时间1天左右,预计花费7000元。1. 部署k8s集群 (阿里云ACK)创建ACK托管(k8s集群)创建集群节点池 (24个高配ECS节点)k8s集群配置通过kubectl get nodes,返回了ECS集群列表,说明k8s环境已安装完毕主机参数配置修改sysctl.conf和limits.conf的内容。建议通过ansible工具对每个主机进行修改。sysctl.conf配置内容:net.ipv4.neigh.default.gc_stale_time=120 # see details in https://help.aliyun.com/knowledge_detail/39428.html net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 # see details in https://help.aliyun.com/knowledge_detail/41334.html net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_synack_retries = 2 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 kernel.sysrq=1 net.core.somaxconn = 256 net.core.wmem_max = 262144 net.ipv4.tcp_keepalive_time = 20 net.ipv4.tcp_keepalive_probes = 60 net.ipv4.tcp_keepalive_intvl = 3 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_fin_timeout = 15 #perf kernel.perf_event_paranoid = 1 fs.aio-max-nr = 1048576将文件保存为/etc/sysctl.conf,然后执行sysctl -p /etc/sysctl.conf limits.conf配置内容:#* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #@student - maxlogins 4 # End of file root soft nofile 655350 root hard nofile 655350 * soft nofile 655350 * hard nofile 655350 * soft nproc 655350 * hard nproc 655350 admin soft nofile 655350 admin hard nofile 655350 admin soft nproc 655350 admin hard nproc 655350 alidb soft nofile 655350 alidb hard nofile 655350 alidb soft nproc 655350 alidb hard nproc 655350将文件保存到/etc/security/limits.conf2. 安装 polardbx-operatorhelm repo add polardbx https://polardbx-charts.oss-cn-beijing.aliyuncs.com helm install --namespace polardbx-operator-system --set imageRepo=docker.mirrors.sjtug.sjtu.edu.cn/polardbx polardbx-operator polardbx/polardbx-operator3. 创建 polardb-x 实例将以下内容保存为polardbx.yaml文件kind: PolarDBXCluster metadata: name: p1024 spec: config: cn: static: EnableCoroutine: true RPCProtocolVersion: 2 ServerProperties: galaxyXProtocol: 0 dynamic: TRANSACTION_POLICY: TSO CONN_POOL_XPROTO_STORAGE_DB_PORT: 0 CONN_POOL_XPROTO_MAX_CLIENT_PER_INST: 8 CONN_POOL_XPROTO_MAX_SESSION_PER_CLIENT: 256 CONN_POOL_XPROTO_MIN_POOLED_SESSION_PER_INST: 32 CONN_POOL_XPROTO_MAX_POOLED_SESSION_PER_INST: 128 XPROTO_MAX_DN_WAIT_CONNECTION: 1000 XPROTO_MAX_DN_CONCURRENT: 2000 RECORD_SQL: "false" SHARD_DB_COUNT_EACH_STORAGE_INST: 1 MPP_METRIC_LEVEL: 0 topology: rules: components: dn: rolling: replicas: 1 nodes: gms: template: image: docker.mirrors.sjtug.sjtu.edu.cn/polardbx/polardbx-engine:80-8.0.18-20221208170957 hostNetwork: false resources: limits: cpu: 16 memory: 32Gi imagePullPolicy: IfNotPresent cn: replicas: 16 template: image: docker.mirrors.sjtug.sjtu.edu.cn/polardbx/polardbx-sql:5.4.15-20221129135549 hostNetwork: false resources: limits: cpu: 16 memory: 16Gi imagePullPolicy: IfNotPresent dn: replicas: 1024 template: image: docker.mirrors.sjtug.sjtu.edu.cn/polardbx/polardbx-engine:80-8.0.18-20221208170957 hostNetwork: false resources: limits: cpu: 1 memory: 8Gi imagePullPolicy: IfNotPresent cdc: replicas: 2 template: image: docker.mirrors.sjtug.sjtu.edu.cn/polardbx/polardbx-cdc:5.4.15-2022110310 hostNetwork: false resources: limits: cpu: 16 memory: 16Gi imagePullPolicy: IfNotPresent执行创建命令:kubectl apply -f polardbx.yaml可通过如下命令查看创建进度:kubectl get pxc -w创建完成后,可参考 连接PolarDB-X数据库 连接数据库 说明:如果遇到个别节点POD长时间创建不出来,可以尝试kubectl delete pod xx触发重新创建4. 数据库体验和压测PolarDB-X提供了benchmark一键压测工具,可参考文档:使用Benchmark Boot进行压测一键安装命令:在前端机器的浏览器上,访问 http://{前端机器IP}:4121/,出现 Benchmark-Boot 首页,证明部署成功。 参考benchmark boot工具的操作指南,通过页面完成: 配置数据库连接 -> TPCC数据导入 -> TPCC压测正常的TPC-C运行日志show stats查询运行指标,平均RT在0.67ms,表现比较平稳数据库验证体验项:说明:本实验采用了24台ECS部署,并非关注性能摸高,重点模拟1024节点下的数据库稳定性,比如30~50万 tps下的平均rt、以及12小时的高压长稳测试,仅供用户参考和复现实验操作。图4.1图4.2图4.3图4.4图4.5总结分布式数据库主打线性扩展的能力,可以在满足OLTP高并发下提供海量PB级别的存储能力,在超大规模的集群架构下会带来蛮多技术挑战,比如:元数据膨胀。管理大规模的1024个物理节点,需要关注节点高可用、以及元数据的存储,比如分布式的DAL、DDL,在任务执行上下文以及分布式聚合时会带来更大的内存开销。比如,batch insert场景下的分布式事务,会涉及1024个节点的分支事务管理,分布式事务的上下文和并发提交都会带来一定的挑战。TCP连接风暴。 分布式share-nothing架构,不可避免会发生数据分片路由和转发,这里就会涉及节点之间的互相访问,比如PolarDB-X每个CN节点都要和DN节点建立RPC请求,在高压并发下节点之间需要RPC的连接池来提升性能(比如8~16个TCP连接),通过1024个DN节点的放大,每个CN节点可能会出现几万的TCP连接,需要对RPC连接进行有效管理。本实验中,PolarDB-X CN配置16GB的内存来支撑1024节点的RPC连接。分布式并发死锁。 分布式下不带分片条件的查询,因为无法命中分区裁剪,会带来全分片的查询(简称为:跨分片查询)。比如10个并发的跨分片查询,通过1024个DN节点的放大,会产生瞬时几万的分片并发查询,复杂的并发请求会产生互相等待的并发死锁的情况,造成更大的爆炸半径。比如,DDL操作的MDL锁获取,会因为个别长事务未提交而一直卡主,进一步阻塞后续其他的SQL,因为跨分片查询下的个别查询被锁住,在大规模节点下容易放大影响。CDC多流日志合并。分布式数据库会通过CDC组件,向下游提供类似mysql binlog的机制,技术实现上都需要采集集群中的所有节点日志,进行采集和归并处理。通过1024个DN节点的放大,原本1024分之的归并排序无法满足性能和稳定性要求,需要引申出多流归并、以及内存swap机制。实践是检验真知的唯一标准,通过本实验的设计,结合阿里云的云服务,可以快速且低成本的验证PolarDB-X在超大规模1024节点,在百万级别的TPS下满足业务使用的稳定性。本文来源:PolarDB-X知乎号
文章
存储  ·  SQL  ·  弹性计算  ·  Kubernetes  ·  网络协议  ·  关系型数据库  ·  测试技术  ·  分布式数据库  ·  数据库  ·  容器
2023-03-03
人工智能,丹青圣手,全平台(原生/Docker)构建Stable-Diffusion-Webui的AI绘画库教程(Python3.10/Pytorch1.13.0)
世间无限丹青手,遇上AI画不成。最近一段时间,可能所有人类画师都得发出一句“既生瑜,何生亮”的感叹,因为AI 绘画通用算法Stable Diffusion已然超神,无需美术基础,也不用经年累月的刻苦练习,只需要一台电脑,人人都可以是丹青圣手。本次我们全平台构建基于Stable-Diffusion算法的Webui可视化图形界面服务,基于本地模型来进行AI绘画操作。本地安装Stable-Diffusion-Webui如果系统之前安装过Python3.10或者使用过Pytorch深度学习框架,那么推荐直接本地安装Stable-Diffusion-Webui,因为Stable-Diffusion的核心依赖库也是Pytorch。 首先拉取官方的项目:git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git随后进入项目的目录:cd stable-diffusion-webui官方文档建议直接在目录中运行shell脚本:./webui.sh但事实上,shell脚本很容易在过程中报错,该项目的核心代码其实是launch.py,所以理论上,我们只需要正常运行launch.py文件即可。 首先确保本机的Python版本号大于等于3.10.9 关于Python3.10的安装,请移玉步至:一网成擒全端涵盖,在不同架构(Intel x86/Apple m1 silicon)不同开发平台(Win10/Win11/Mac/Ubuntu)上安装配置Python3.10开发环境 ,这里不再赘述。另外确保Pytorch的版本号大于等于13.1.0,关于Pytorch,请移步:闻其声而知雅意,M1 Mac基于PyTorch(mps/cpu/cuda)的人工智能AI本地语音识别库Whisper(Python3.10) 随后安装相关的依赖库:pip3 install -r requirements.txt pip3 install -r requirements_versions.txt依赖文件中,有一个库可能会出问题,就是GFPGAN,它是腾讯开源的人脸识别模块,这里推荐使用GFPGAN官方网站(https://github.com/TencentARC/GFPGAN)的安装方式:# Install basicsr - https://github.com/xinntao/BasicSR # We use BasicSR for both training and inference pip install basicsr # Install facexlib - https://github.com/xinntao/facexlib # We use face detection and face restoration helper in the facexlib package pip install facexlib pip install -r requirements.txt python setup.py develop # If you want to enhance the background (non-face) regions with Real-ESRGAN, # you also need to install the realesrgan package pip install realesrgan安装成功后,最好验证一下:➜ ~ python3 Python 3.10.9 (main, Dec 15 2022, 17:11:09) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import gfpgan >>>所有依赖安装成功后,就可以直接运行launch.py文件即可:python3 launch.py程序返回:Python 3.10.9 (main, Dec 15 2022, 17:11:09) [Clang 14.0.0 (clang-1400.0.29.202)] Commit hash: 0cc0ee1bcb4c24a8c9715f66cede06601bfc00c8 Installing requirements for Web UI Launching Web UI with arguments: --upcast-sampling --use-cpu interrogate Warning: caught exception 'Torch not compiled with CUDA enabled', memory monitor disabled No module 'xformers'. Proceeding without it. ============================================================================== You are running torch 1.13.0. The program is tested to work with torch 1.13.1. To reinstall the desired version, run with commandline flag --reinstall-torch. Beware that this will cause a lot of large files to be downloaded, as well as there are reports of issues with training tab on the latest version. Use --skip-version-check commandline argument to disable this check. ============================================================================== Loading weights [6ce0161689] from /Users/liuyue/wodfan/work/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors Creating model from config: /Users/liuyue/wodfan/work/stable-diffusion-webui/configs/v1-inference.yaml LatentDiffusion: Running in eps-prediction mode DiffusionWrapper has 859.52 M params. Applying cross attention optimization (InvokeAI). Textual inversion embeddings loaded(0): Model loaded in 8.2s (create model: 0.6s, apply weights to model: 5.0s, apply half(): 1.9s, move model to device: 0.5s). Running on local URL: http://127.0.0.1:7860Stable-Diffusion-Webui服务会运行在系统的7860端口上。 需要注意的是,如果本地系统不支持cuda模式,需要修改运行命令:python3 launch.py --skip-torch-cuda-test --upcast-sampling --use-cpu interrogate这里使用CPU来进行模型训练。 另外如果是M系列的Mac,其实是支持MPS模式的,但Stable Diffusion目前的最新版并不支持MPS,所以需要单独设置环境变量,关闭MPS模式:export PYTORCH_ENABLE_MPS_FALLBACK=1最后访问http://127.0.0.1:7860即可,本地构建Stable-Diffusion-Webui服务就完成了。Docker构建Stable-Diffusion-Webui如果不想太折腾,也可以使用Docker容器来构建Stable-Diffusion-Webui,同样地,需要拉取线上的Docker配置文件项目:git clone https://github.com/AbdBarho/stable-diffusion-webui-docker.git随后进入项目的目录:stable-diffusion-webui-docker接着运行命令下载相关的依赖镜像:docker compose --profile download up --build下载完成后,运行命令构建容器:docker compose --profile auto up --build这里需要注意的是,模型数据和输出文件夹会以/data和/output的形式挂载到容器中,如果想在宿主机往容器内传入模型或者其他图片,需要写入项目中的data目录。 过程中,可能会报错:Found no NVIDIA driver on your system这是因为容器内找不到NVIDIA的显卡驱动。这里需要单独再启动一个容器服务:docker run -ti --runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all allennlp/allennlp总的来说,安装过程简单,但是调试比较费劲,一旦启动出问题,就得进入容器内部修改代码,或者反复修改Dockerfile文件,所以Docker比较适合封装业务改动频繁的容器,而不是依赖环境繁多并且版本需要反复调整的场景。Stable-Diffusion-Webui图像绘制配置好Stable-Diffusion-Webui环境之后,访问http://127.0.0.1:7860: 在Prompt文本框中填入引导词:Tall buildings, people bustling, heavy traffic, staggered light and shadow, the beauty of the city is conspicuous before.随后点击右侧Generate生成按钮即可,这里引导词的意思是:高楼林立,人群熙熙攘攘,车水马龙,光影交错,城市之美尽显眼前。 注意引导词需要使用逗号分隔。 后端开始进行训练:To create a public link, set `share=True` in `launch()`. 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:24<00:00, 1.25s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00, 1.00it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:34<00:00, 1.72s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00, 1.11s/it] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00, 1.10s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00, 1.00s/it] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00, 1.10s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00, 1.13s/it] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00, 1.12s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00, 1.07s/it] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00, 1.09s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00, 1.03it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00, 1.01s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00, 1.03it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00, 1.01s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:19<00:00, 1.02it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:22<00:00, 1.15s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00, 1.07s/it] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [00:21<00:00, 1.06s/it] Total progress: 100%|██████████████████████████████████████████████████████████████████████████████| 20/20 [00:20<00:00, 1.00s/it]片刻之间,挥毫落纸如云烟。 遗憾的是,引导词不支持中文,但可以配置权重,数值从0.1~100,默认状态是1,低于1就是减弱,大于1就是加强: (Tall buildings:1.1), people bustling(1.61),(heavy traffic:0.3),(staggered light and shadow:1.3) Stable-Diffusion-Webui也支持Negative prompt(反向引导词)。就是用文字描述你不想在图像中出现的东西:对图片进行去噪处理,使其看起来更像你的提示词;同样使其看起来更像你的反向提示词。同时观察正方向两者之间的差异,并利用它来产生一组对噪声图片的改变,将最终结果移向前者而远离后者。默认通用反向引导词:lowres,bad anatomy,bad hands,text,error,missing fingers, extra digit,fewer digits,cropped,worst quality, low quality,normal quality,jpeg artifacts,signature, watermark,username,blurry,missing arms,long neck, Humpbacked,missing limb,too many fingers, mutated,poorly drawn,out of frame,bad hands, owres,unclear eyes,poorly drawn,cloned face,bad face除了引导词,还可以调整采样迭代步数 (Sampling Steps)。 系统先随机生成一个基础的图片,然后一步步的调整图片,向引导词 Prompt 靠拢Sampling Steps参数就是告诉人工智能,这样的步骤应该进行多少次。次数越多,每一步训练也就越小越精确。当然了,成本也会越高,同时每一次训练的时间也会成同比增长。除了迭代步数,也可以自由地选择采样方法(Sampling method)也就是让Stable-Diffusion-Webui具体使用用什么算法来训练图片模型。默认算法是Euler a :富有创造力,不同步数可以生产出不同的图片。 但是超过30步左右基本就没有实质化的增益效果。Euler算法:最简单的算法,训练速度也是最快的。LMS算法:Euler的延伸算法,相对更稳定一点,30步就比较稳定了PLMS:优化过的LMS算法 其他的一些参数: 生成批次Batch count/n\_iter:同样的配置,循环跑几次每批数量 Batch size:同时生成多少个图像,增加这个值可以并行运行,但也需要更多的显卡显存。提示词相关性 CFG Scale:图像与引导词匹配程度。增加这个值将导致图像更接近引导词,但过高会让图像色彩过于饱和。一般在5~15之间为好,7,9,12是3个常见的设置值。宽度 X 高度 Width X Height:单位是像素,适当增加尺寸,后台会试图填充更多的细节进来。Stable-Diffusion-Webui定制化模型Stable-Diffusion-Webui默认下载的基础模型在项目目录的models/Stable-diffusion文件夹中:/stable-diffusion-webui/models/Stable-diffusion模型名称是v1-5-pruned-emaonly.safetensors,体积是4.27GB。 如果需要一些比较有个性定制化模型,可以在civitai.com平台进行挑选和下载,需要注意的是,该平台上的模型鱼龙混杂,良莠不齐,不能说是蔚为大观,但多多少少有点泥沙俱下的意思,所以最好不要在比较正式的公共(工作)环境打开该平台,否则结果可能会令人非常尴尬。 这里我们选择相对比较潮流的赛博朋克风格模型:synthwavepunk 将下载的模型放入models/Stable-diffusion目录。 随后重启Stable-Diffusion-Webui服务:python3 launch.py --skip-torch-cuda-test --upcast-sampling --use-cpu interrogate在页面表单中的Stable Diffusion checkpoint选项里选择对应的模型: 引导词:concept art, 4k, intricate, pinup, a woman, beautiful face, embroidery, lace, hyper-realistic, highly detailed, octane render, concept art, smooth, 8k, dancing princess, snthwve style, nvinkpunk, by jeremy mann, by sandra chevrier, by dave mckean and richard avedon and maciej kuciara训练结果:好了,现在,你已经知晓那些网络上的漂亮小姐姐是怎么生成的了。结语也许我们只是偶尔被网络上那些酷炫而猎奇的AI生成图所吸引,但如果你真的动手去搭建、调试、甚至开始训练属于自己的绘画模型,相信我,你马上就会深陷其中,不能自拔,AI仿若可以满足你所有的幻想,欲望满溢,又欲言又止,分寸把握之精确,妙入毫颠。什么?你还在玩那些无聊的电子游戏?相信我,Stable-Diffusion-Webui才是最高级的精神享受,没有之一,也不可替代。
文章
人工智能  ·  并行计算  ·  算法  ·  Ubuntu  ·  PyTorch  ·  Shell  ·  算法框架/工具  ·  Docker  ·  Python  ·  容器
2023-03-03
初识Docker
为什么要使用Docker?比如我们现在拥有了Linux CentOS系统,按理说可以在上面安装各种程序和服务了。但是高手并不会这么做,而是先安装Docker环境,然后在Docker里面部署各种数据库和中间件程序。这么做有两点原因:一个是节省时间,另一个是避免程序间的冲突。比如说我们现在想要在Linux系统上搭建MySQL集群,想要在一个Linux系统上面同时运行多个MySQL,你要做跟多事情,例如定义繁复的配置文件和目录,然后还要写复杂的启动脚本,每个MySQL节点还要单独执行初始化等等,特别麻烦。有了Docker之后,我们只需要运行几条命令,MySQL节点就创建好了,特别节省时间,而且Docker隔离性做的很好,你也不用担心MySQL节点之间的冲突。再比如说,你们公司开发了很多项目。去年开发的Java项目用的是JDK1.8和MariaDB数据库,已经部署在Linux上面了。今年开发的项目用的是JDK15和MySQL数据库,现在要把这个项目也部署在同一个Linux系统之上,那就非常困难。因为MySQL和MariaDB的程序包有冲突,在同一个Linux系统中只能安装其中一个数据库,要么是MySQL要么是MariaDB。还有JDK1.8和JDK15,你怎么给系统设置两个Java环境变量?所以我们就需要引入Docker环境了。Docker特点docker可以避免运行环境不一致的问题docker是一个用来装程序以及环境的容器docker属于Linux容器的一种封装,提供简单易用的容器使用接口Docker的架构Docker原理往简单了说,Docker是个沙箱环境。你可以创建很多个沙箱空间,然后在每个沙箱中部署不同的程序。比如沙箱A里面部署MySQL,沙箱B中部署MariaDB。沙箱之间是物理隔绝的,只有网络可以联通,所以MariaDB和MySQL程序包的冲突,在Docker中完全体现不出来。因为Docker环境给每个沙箱都创建了虚拟网卡,所以每个沙箱都有自己的内网IP地址,沙箱之间可以通过网络相互调用,这就能搭建数据库集群或者部署项目了。沙箱的内网IP在Docker环境之外是无法访问的,所以等我们创建沙箱的时候,需要把沙箱的某个端口映射到Linux系统的某个端口,这样在Docker之外才能用网络访问Docker容器里面的程序。镜像和容器Docker为了最大化的共享资源,减少资源浪费,创造出了镜像技术。镜像是沙箱之间相同的部分,差异化的部分叫做容器。比如说一个Java镜像,里面安装了JDK1.8,然后我为这个镜像创建出2个容器,这两个容器共享使用JDK镜像中的Java环境,并且我可以在每个容器中部署不同的Java程序。如果Docker没有镜像技术,我们只能分别在两个容器中安装JDK环境,这就造成了不必要的重复浪费。创建Docker镜像的方式有多种,比如说你把要安装的程序和脚本写成Dockerfile文件,然后执行特殊的命令,Docker就会按照你的要求创建出镜像。或者说你利用现有的容器,在里面安装程序写好脚本,然后把这个容器逆向创建出镜像也可以。甚至说你不想自己创建镜像,也可以去DockerHub网站上下载别人创建的镜像。比如MySQL镜像、HBase镜像、JDK镜像、Python镜像等等。你把镜像下载下来,导入Docker环境,然后创建容器就可以使用MySQL、HBase这些东西了,特别节省时间。容器一个镜像可以有多个容器镜像类似于Java类,而容器是实例相互隔离程序运行在容器中,性能有没有损失?Docker创建的沙箱是轻量级的,只给容器创建了虚拟网卡,所以对Linux系统开销非常小。在容器中运行程序跟在Linux同直接运行程序没有差别,性能也没有任何损失,所以你可以放心使用Docker环境。现实中,一台硬件服务器同时运行几百个容器也没有问题。即便2GB内存的低端云主机,运行十几个容器也能撑得下来。仓库集中存储hub.docker.com(国外镜像官网)hub.daocloud.io(国内)
文章
关系型数据库  ·  MySQL  ·  Java  ·  Linux  ·  分布式数据库  ·  数据库  ·  Docker  ·  Python  ·  容器  ·  Hbase
2023-03-05
JAVA面试——云计算
30.1.1. SaaSSaaS 是 Software-as-a-Service(软件即服务)30.1.2. PaaSPaaS 是 Platform-as-a-Service 的缩写,意思是平台即服务。 把服务器平台作为一种服务提供的商业模式。通过网络进行程序提供的服务称之为 SaaS(Software as a Service),而云计算时代相应的服务器平台或者开发环境作为服务进行提供就成为了 PaaS(Platform as a Service)。30.1.3. IaaSIaaS(Infrastructure as a Service),即基础设施即服务。提供给消费者的服务是对所有设施的利用,包括处理、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用程序。30.1.4.2. Namespaces命名空间(namespaces)是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。Docker 容器(Container)容器是独立运行的一个或一组应用。Docker 客户端(Client)Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。Docker 主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker 仓库(Registry)Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub 提供了庞大的镜像集合供使用。Docker MachineDocker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker,比如 VirtualBox、 Digital Ocean、Microsoft Azure。13/01/2022 Page 281 of 283Linux 的命名空间机制提供了以下七种不同的命名空间,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS,通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。30.1.4.3. 进程(CLONE_NEWPID 实现的进程隔离)docker 创建新进程时传入 CLONE_NEWPID 实现的进程隔离,也就是使用 Linux 的命名空间实现进程的隔离,Docker 容器内部的任意进程都对宿主机器的进程一无所知。当我们每次运行docker run 或者 docker start 时,都会在创建一个用于设置进程间隔离的 Spec,同时会设置进程相关的命名空间,还会设置与用户、网络、IPC 以及 UTS 相关的命名空间,所有命名空间相关的设置 Spec 最后都会作为 Create 函数的入参在创建新的容器时进行设置。30.1.4.4. Libnetwork 与网络隔离如果 Docker 的容器通过 Linux 的命名空间完成了与宿主机进程的网络隔离,但是却有没有办法通过宿主机的网络与整个互联网相连,就会产生很多限制,所以 Docker 虽然可以通过命名空间创建一个隔离的网络环境,但是 Docker 中的服务仍然需要与外界相连才能发挥作用。Docker 整个网络部分的功能都是通过 Docker 拆分出来的 libnetwork 实现的,它提供了一个连接不同容器的实现,同时也能够为应用给出一个能够提供一致的编程接口和网络层抽象的容器网络模型。libnetwork 中最重要的概念,容器网络模型由以下的几个主要组件组成,分别是 Sandbox、Endpoint 和 Network。在容器网络模型中,每一个容器内部都包含一个 Sandbox,其中存储着当前容器的网络栈配置,包括容器的接口、路由表和 DNS 设置,Linux 使用网络命名空间实现这个Sandbox,每一个 Sandbox 中都可能会有一个或多个 Endpoint,在 Linux 上就是一个虚拟的网卡veth,Sandbox 通过 Endpoint 加入到对应的网络中,这里的网络可能就是我们在上面提到的 Linux 网桥或者 VLAN。每一个使用 docker run 启动的容器其实都具有单独的网络命名空间,Docker 为我们提供了四种不同的网络模式,Host、Container、None 和 Bridge 模式。在这一部分,我们将介绍 Docker 默认的网络设置模式:网桥模式。在这种模式下,除了分配隔离的网络命名空间之外,Docker 还会为所有的容器设置 IP 地址。当 Docker 服务器在主机上启动之后会创建新的虚拟网桥 docker0,随后在该主机上启动的全部服务在默认情况下都与该网桥相连。在默认情况下,13/01/2022 Page 282 of 283每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中30.1.4.5. 资源隔离与 CGroupsControl Groups(简称 CGroups)能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。每一个 CGroup 都是一组被相同的标准和参数限制的进程,不同的 CGroup 之间是有层级关系的,也就是说它们之间可以从父类继承一些用于限制资源使用的标准和参数。30.1.4.6. 镜像与 UnionFSLinux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。Docker 镜像其实本质就是一个压缩包,我们可以使用命令将一个 Docker 镜像中的文件导出,你可以看到这个镜像中的目录结构与 Linux 操作系统的根目录中的内容并没有太多的区别,可以说Docker 镜像就是一个文件。30.1.4.7. 存储驱动Docker 使用了一系列不同的存储驱动管理镜像内的文件系统并运行容器,这些存储驱动与Docker 卷(volume)有些不同,存储引擎管理着能够在多个容器之间共享的存储。当镜像被 docker run 命令创建时就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。13/01/2022 Page 283 of 283容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器UnionFS 其实是一种为 Linux 操作系统设计的用于把多个文件系统『联合』到同一个挂载点的文件系统服务。而 AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。AUFS 只是 Docker 使用的存储驱动的一种,除了 AUFS 之外,Docker 还支持了不同的存储驱动,包括 aufs、devicemapper、overlay2、zfs 和 vfs 等等,在最新的 Docker 中,overlay2 取代了aufs 成为了推荐的存储驱动,但是在没有 overlay2 驱动的机器上仍然会使用 aufs 作为 Docker 的默认驱动。30.1.5. Openstack
文章
存储  ·  网络协议  ·  Java  ·  Linux  ·  API  ·  云计算  ·  数据中心  ·  网络虚拟化  ·  Docker  ·  容器
2023-03-16
【DSW Gallery】基于MAE的自监督学习示例
直接使用请打开基于MAE的自监督学习示例,并点击右上角 “ 在DSW中打开” 。EasyCV自监督训练-MAE  自监督学习(Self-Supervised Learning)能利用大量无标注的数据进行表征学习,然后在特定下游任务上对参数进行微调。通过这样的方式,能够在较少有标注数据上取得优于有监督学习方法的精度。  近年来,自监督学习受到了越来越多的关注,如Yann Lecun也在 AAAI 上讲 Self-Supervised Learning 是未来的大势所趋。在CV领域涌现了如SwAV、MOCO、DINO、MoBY等一系列工作。MAE是kaiming继MOCO之后在自监督学习领域的又一力作。  本文将介绍如何在pai-dsw基于EasyCV快速使用MAE进行度量模型的训练、微调、推理。运行环境要求PAI-Pytorch 1.7/1.8镜像, GPU机型 P100 or V100, 内存 32G安装依赖包注:在PAI-DSW docker中无需安装相关依赖,可跳过此1,2步骤, 在本地notebook环境中执行1,2 步骤安装环境1、获取torch和cuda版本,并根据版本号修改mmcv安装命令,安装对应版本的mmcv和nvidia-daliimport torch import os os.environ['CUDA']='cu' + torch.version.cuda.replace('.', '') os.environ['Torch']='torch'+torch.version.__version__.replace('+PAI', '') !echo $CUDA !echo $Torch[2023-02-02 13:22:04,960.960 dsw-16577-76cf6dbbb4-m7pbn:1125 INFO utils.py:30] NOTICE: PAIDEBUGGER is turned off.cu101 torch1.8.2# install some python deps ! pip install --upgrade tqdm ! pip install mmcv-full==1.4.4 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.8.0/index.html ! pip install http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/third_party/nvidia_dali_cuda100-0.25.0-1535750-py3-none-manylinux2014_x86_64.whl2、安装EasyCV算法包 注:在PAI-DSW docker中预安装了pai-easycv库,可跳过该步骤,若训练测试过程中报错,尝试用下方命令更新easycv版本#pip install pai-easycv ! echo y | pip uninstall pai-easycv easycv !pip install pai-easycv3、简单验证from easycv.apis import *正式工作数据准备  自监督训练只需要提供无标注图片即可进行, 你可以下载ImageNet数据,或者使用你自己的图片数据。需要提供一个包含若干图片的文件夹路径p,以及一个文件列表,文件列表中是每个图片相对图片目录p的路径.  图片文件夹结构示例如下, 文件夹路径为./imagesimages/ ├── 0001.jpg ├── 0002.jpg ├── 0003.jpg |... └── 9999.jpg 文件列表内容示例如下 0001.jpg 0002.jpg 0003.jpg ... 9999.jpg为了快速走通流程,我们也提供了一个小的示例数据集,执行如下命令下载解压! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/imagenet_raw_demo/imagenet_raw_demo.tar.gz && tar -zxf imagenet_raw_demo.tar.gzWill not apply HSTS. The HSTS database must be a regular and non-world-writable file. ERROR: could not open HSTS store at '/root/.wget-hsts'. HSTS will be disabled. --2023-02-02 15:01:45-- http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/imagenet_raw_demo/imagenet_raw_demo.tar.gz Resolving pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)... 39.98.20.13 Connecting to pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)|39.98.20.13|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 33109699 (32M) [application/x-gzip] Saving to: ‘imagenet_raw_demo.tar.gz’ imagenet_raw_demo.t 100%[===================>] 31.58M 15.8MB/s in 2.0s 2023-02-02 15:01:47 (15.8 MB/s) - ‘imagenet_raw_demo.tar.gz’ saved [33109699/33109699]# 重命名文件夹 ! mv imagenet_raw_demo imagenet_raw训练模型这个Demo中我们采用MAE自监督算法训练vit-base主干网络, 下载示例配置文件! rm -rf mae_vit_base_patch16_8xb64_1600e.py ! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/doc/easycv/configs/selfsup/mae/mae_vit_base_patch16_8xb64_1600e.pyWill not apply HSTS. The HSTS database must be a regular and non-world-writable file. ERROR: could not open HSTS store at '/root/.wget-hsts'. HSTS will be disabled. --2023-02-02 15:02:47-- http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/doc/easycv/configs/selfsup/mae/mae_vit_base_patch16_8xb64_1600e.py Resolving pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)... 39.98.20.13 Connecting to pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)|39.98.20.13|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 2348 (2.3K) [text/x-python] Saving to: ‘mae_vit_base_patch16_8xb64_1600e.py’ mae_vit_base_patch1 100%[===================>] 2.29K --.-KB/s in 0s 2023-02-02 15:02:48 (228 MB/s) - ‘mae_vit_base_patch16_8xb64_1600e.py’ saved [2348/2348]为了缩短训练时间,打开配置文件 mae_vit_base_patch16_8xb64_1600e.py,修改total_epoch参数为5, 每隔1次迭代打印一次日志。# runtime settings total_epochs = 5 # log config log_config=dict(interval=1)正式训练时,建议使用多机8卡或单机8卡配合该配置文件使用,修改update_interval参数进行梯度累积,确保有效batch_size一致# 查看easycv安装位置 import easycv print(easycv.__file__)/home/pai/lib/python3.6/site-packages/easycv/__init__.py!python -m torch.distributed.launch --nproc_per_node=1 --master_port=29930 /home/pai/lib/python3.6/site-packages/easycv/tools/train.py ./mae_vit_base_patch16_8xb64_1600e.py --work_dir work_dir/selfsup/jpg/mae --launcher pytorch导出模型模型训练完成,使用export命令导出模型进行推理,导出的模型包含推理时所需的预处理信息、后处理信息# 查看训练产生的pt文件 ! ls work_dir/selfsup/jpg/mae/*work_dir/selfsup/jpg/mae/20230202_150414.log work_dir/selfsup/jpg/mae/20230202_150414.log.json work_dir/selfsup/jpg/mae/epoch_5.pth对模型的字段进行修改,以便用于fintune任务import torch weight_path = 'work_dir/selfsup/jpg/mae/epoch_5.pth' state_dict = torch.load(weight_path)['state_dict'] state_dict_out = {} for key in state_dict: state_dict_out['model.' + key.replace('encoder.','')] = state_dict[key] torch.save(state_dict_out,weight_path)[2023-02-02 15:08:11,405.405 dsw-16577-76cf6dbbb4-m7pbn:1794 INFO utils.py:30] NOTICE: PAIDEBUGGER is turned off.使用自监督模型进行图像分类fintune下载分类任务示例配置文件! rm -rf mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py ! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/doc/easycv/configs/selfsup/mae/mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.pyWill not apply HSTS. The HSTS database must be a regular and non-world-writable file. ERROR: could not open HSTS store at '/root/.wget-hsts'. HSTS will be disabled. --2023-02-02 15:11:23-- http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/doc/easycv/configs/selfsup/mae/mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py Resolving pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)... 39.98.20.13 Connecting to pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)|39.98.20.13|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 4040 (3.9K) [text/x-python] Saving to: ‘mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py’ mae_vit_base_patch1 100%[===================>] 3.95K --.-KB/s in 0s 2023-02-02 15:11:23 (189 MB/s) - ‘mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py’ saved [4040/4040]修改配置文件 mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py,修改model.pretrained参数为work_dir/selfsup/jpg/mae/epoch_5.pth,为了缩短训练时间,修改total_epoch参数为5,每隔1次迭代打印一次日志。# runtime settings total_epochs = 5 # log config log_config=dict(interval=1) # pretrained='work_dir/selfsup/jpg/mae/epoch_5.pth'正式训练时,建议使用多机8卡或单机8卡配合该配置文件使用,修改update_interval参数进行梯度累积,确保有效batch_size一致分类模型训练这里提供了单卡进行训练和验证集评估的命令!python -m torch.distributed.launch --nproc_per_node=1 --master_port=29930 \ /home/pai/lib/python3.6/site-packages/easycv/tools/train.py mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py --work_dir work_dir/selfsup/jpg/mae_fintune --launcher pytorch预测对训练好的模型导出并预测! python -m easycv.tools.export mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py work_dir/selfsup/jpg/mae_fintune/ClsEvaluator_neck_top1_best.pth work_dir/selfsup/jpg/mae_fintune/best_export.pth[2023-02-02 15:20:34,506.506 dsw-16577-76cf6dbbb4-m7pbn:5559 INFO utils.py:30] NOTICE: PAIDEBUGGER is turned off. mae_vit_base_patch16_8xb64_100e_lrdecay065_fintune.py load model from init weights load model from init weights load checkpoint from local path: work_dir/selfsup/jpg/mae_fintune/ClsEvaluator_neck_top1_best.pth下载测试图片和标签文件! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/cifar10/qince_data/predict/aeroplane_s_000004.png ! wget http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/doc/easycv/configs/selfsup/mae/label_map.txtWill not apply HSTS. The HSTS database must be a regular and non-world-writable file. ERROR: could not open HSTS store at '/root/.wget-hsts'. HSTS will be disabled. --2023-02-02 15:21:19-- http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/data/cifar10/qince_data/predict/aeroplane_s_000004.png Resolving pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)... 39.98.20.13 Connecting to pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)|39.98.20.13|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 2391 (2.3K) [image/png] Saving to: ‘aeroplane_s_000004.png’ aeroplane_s_000004. 100%[===================>] 2.33K --.-KB/s in 0s 2023-02-02 15:21:19 (186 MB/s) - ‘aeroplane_s_000004.png’ saved [2391/2391] Will not apply HSTS. The HSTS database must be a regular and non-world-writable file. ERROR: could not open HSTS store at '/root/.wget-hsts'. HSTS will be disabled. --2023-02-02 15:21:20-- http://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/release/doc/easycv/configs/selfsup/mae/label_map.txt Resolving pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)... 39.98.20.13 Connecting to pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com (pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com)|39.98.20.13|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 10473 (10K) [text/plain] Saving to: ‘label_map.txt’ label_map.txt 100%[===================>] 10.23K --.-KB/s in 0s 2023-02-02 15:21:20 (278 MB/s) - ‘label_map.txt’ saved [10473/10473]导入模型权重,并预测测试图片的分类结果import cv2 from easycv.predictors.classifier import TorchClassifier output_ckpt = 'work_dir/selfsup/jpg/mae_fintune/best_export.pth' tcls = TorchClassifier(output_ckpt, topk=1, label_map_path='label_map.txt') img = cv2.imread('aeroplane_s_000004.png') # input image should be RGB order img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) output = tcls.predict([img]) print(output)/home/pai/lib/python3.6/site-packages/ipykernel_launcher.py:5: DeprecationWarning: Call to deprecated class TorchClassifier (Please use ClassificationPredictor.). """load model from init weights load model from init weights load checkpoint from local path: work_dir/selfsup/jpg/mae_fintune/best_export.pth/home/pai/lib/python3.6/site-packages/torchvision/transforms/transforms.py:258: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum. "Argument interpolation should be of type InterpolationMode instead of int. "[{'class': [701], 'class_name': ['prison'], 'class_probs': {'kit_fox': 0.0006673375, 'English_setter': 0.0006035781, 'Siberian_husky': 0.0008663863, 'Australian_terrier': 0.0019608254, 'English_springer': 0.0005221807, 'grey_whale': 0.00063806656, 'lesser_panda': 0.0003269123, 'Egyptian_cat': 0.0010239016, 'ibex': 0.0013876773, 'Persian_cat': 0.00087532273, 'cougar': 0.0005133071, 'gazelle': 0.0006251378, 'porcupine': 0.0011010804, 'sea_lion': 0.0009487947, 'malamute': 0.0008857793, 'badger': 0.00095850596, 'Great_Dane': 0.0005924807, 'Walker_hound': 0.0004092168, 'Welsh_springer_spaniel': 0.0003430144, 'whippet': 0.0012620587, 'Scottish_deerhound': 0.0009736246, 'killer_whale': 0.00077678234, 'mink': 0.0005921396, 'African_elephant': 0.0016753499, 'Weimaraner': 0.0004948448, 'soft-coated_wheaten_terrier': 0.0010146626, 'Dandie_Dinmont': 0.0007387661, 'red_wolf': 0.0007098433, 'Old_English_sheepdog': 0.0005576845, 'jaguar': 0.00085798727, 'otterhound': 0.0005155093, 'bloodhound': 0.000760222, 'Airedale': 0.0008089066, 'hyena': 0.00036170988, 'meerkat': 0.0009608063, 'giant_schnauzer': 0.0014625018, 'titi': 0.0022610286, 'three-toed_sloth': 0.00049388607, 'sorrel': 0.0009254522, 'black-footed_ferret': 0.0011746412, 'dalmatian': 0.0012251538, 'black-and-tan_coonhound': 0.00057177624, 'papillon': 0.0012972491, 'skunk': 0.0011283859, 'Staffordshire_bullterrier': 0.001174961, 'Mexican_hairless': 0.00096787966, 'Bouvier_des_Flandres': 0.0018662175, 'weasel': 0.0010575509, 'miniature_poodle': 0.0012047039, 'Cardigan': 0.00051354064, 'malinois': 0.00043676127, 'bighorn': 0.0011948944, 'fox_squirrel': 0.0005488761, 'colobus': 0.0004639502, 'tiger_cat': 0.00042578278, 'Lhasa': 0.00073431176, 'impala': 0.0008406444, 'coyote': 0.0009409984, 'Yorkshire_terrier': 0.00050984224, 'Newfoundland': 0.0030436, 'brown_bear': 0.0009942558, 'red_fox': 0.00023898148, 'Norwegian_elkhound': 0.0013350636, 'Rottweiler': 0.0010885244, 'hartebeest': 0.0016698914, 'Saluki': 0.0009344835, 'grey_fox': 0.0008787476, 'schipperke': 0.00034686414, 'Pekinese': 0.00076353835, 'Brabancon_griffon': 0.0006259315, 'West_Highland_white_terrier': 0.0007767992, 'Sealyham_terrier': 0.0003513658, 'guenon': 0.0007001311, 'mongoose': 0.0003822867, 'indri': 0.003609633, 'tiger': 0.0007440456, 'Irish_wolfhound': 0.0017718839, 'wild_boar': 0.002473396, 'EntleBucher': 0.0008174394, 'zebra': 0.0012578121, 'ram': 0.00082847854, 'French_bulldog': 0.0008900284, 'orangutan': 0.00032684745, 'basenji': 0.0009302878, 'leopard': 0.00027074857, 'Bernese_mountain_dog': 0.0012590293, 'Maltese_dog': 0.0006665097, 'Norfolk_terrier': 0.0008061021, 'toy_terrier': 0.00036666094, 'vizsla': 0.0014387047, 'cairn': 0.00055520685, 'squirrel_monkey': 0.000687506, 'groenendael': 0.000625328, 'clumber': 0.0029570605, 'Siamese_cat': 0.0005550988, 'chimpanzee': 0.00093030784, 'komondor': 0.0019317855, 'Afghan_hound': 0.00055170926, 'Japanese_spaniel': 0.00085775316, 'proboscis_monkey': 0.0006491716, 'guinea_pig': 0.0031287922, 'white_wolf': 0.00071867363, 'ice_bear': 0.000760691, 'gorilla': 0.00037043117, 'borzoi': 0.0007290872, 'toy_poodle': 0.0019134342, 'Kerry_blue_terrier': 0.00062811025, 'ox': 0.000470462, 'Scotch_terrier': 0.0006669656, 'Tibetan_mastiff': 0.00055876496, 'spider_monkey': 0.0010898418, 'Doberman': 0.0011695517, 'Boston_bull': 0.0012972043, 'Greater_Swiss_Mountain_dog': 0.00068416016, 'Appenzeller': 0.00067680137, 'Shih-Tzu': 0.00074696424, 'Irish_water_spaniel': 0.00037025844, 'Pomeranian': 0.00043323633, 'Bedlington_terrier': 0.000662382, 'warthog': 0.0002796068, 'Arabian_camel': 0.001094503, 'siamang': 0.00062231475, 'miniature_schnauzer': 0.00091091415, 'collie': 0.00041920063, 'golden_retriever': 0.00086782576, 'Irish_terrier': 0.0008741582, 'affenpinscher': 0.0010470334, 'Border_collie': 0.001344511, 'hare': 0.00068683823, 'boxer': 0.00092890306, 'silky_terrier': 0.00037482253, 'beagle': 0.00075919175, 'Leonberg': 0.0028384586, 'German_short-haired_pointer': 0.00039628547, 'patas': 0.0006132576, 'dhole': 0.0004852794, 'baboon': 0.0015588455, 'macaque': 0.00077748805, 'Chesapeake_Bay_retriever': 0.00026608192, 'bull_mastiff': 0.0005500803, 'kuvasz': 0.0004735009, 'capuchin': 0.00045627708, 'pug': 0.0004272182, 'curly-coated_retriever': 0.00088318466, 'Norwich_terrier': 0.00073626626, 'flat-coated_retriever': 0.0012534767, 'hog': 0.00049689575, 'keeshond': 0.0029105514, 'Eskimo_dog': 0.0008534481, 'Brittany_spaniel': 0.0008315074, 'standard_poodle': 0.0007357677, 'Lakeland_terrier': 0.001161858, 'snow_leopard': 0.0007181353, 'Gordon_setter': 0.00063368015, 'dingo': 0.00085809594, 'standard_schnauzer': 0.0010800055, 'hamster': 0.0010458771, 'Tibetan_terrier': 0.0008203154, 'Arctic_fox': 0.0014584167, 'wire-haired_fox_terrier': 0.0010811656, 'basset': 0.0007325018, 'water_buffalo': 0.0022239466, 'American_black_bear': 0.00095368, 'Angora': 0.0005397964, 'bison': 0.0014236068, 'howler_monkey': 0.00083370507, 'hippopotamus': 0.0030128977, 'chow': 0.0010758714, 'giant_panda': 0.00084381434, 'American_Staffordshire_terrier': 0.00056128606, 'Shetland_sheepdog': 0.00031425315, 'Great_Pyrenees': 0.0009117502, 'Chihuahua': 0.00039096142, 'tabby': 0.0012651962, 'marmoset': 0.0011296106, 'Labrador_retriever': 0.000810957, 'Saint_Bernard': 0.0005878524, 'armadillo': 0.0009452825, 'Samoyed': 0.0007942208, 'bluetick': 0.0004587803, 'redbone': 0.00033727402, 'polecat': 0.0005682515, 'marmot': 0.00049401016, 'kelpie': 0.00050273834, 'gibbon': 0.0012528409, 'llama': 0.00028378292, 'miniature_pinscher': 0.00028555433, 'wood_rabbit': 0.00045620077, 'Italian_greyhound': 0.0017857451, 'lion': 0.0017187167, 'cocker_spaniel': 0.0011800345, 'Irish_setter': 0.00037181537, 'dugong': 0.0004985526, 'Indian_elephant': 0.0038731324, 'beaver': 0.00081938715, 'Sussex_spaniel': 0.0010430053, 'Pembroke': 0.00035126496, 'Blenheim_spaniel': 0.001339322, 'Madagascar_cat': 0.0006958304, 'Rhodesian_ridgeback': 0.00044000885, 'lynx': 0.0007535317, 'African_hunting_dog': 0.00041206204, 'langur': 0.0014016775, 'Ibizan_hound': 0.0012293942, 'timber_wolf': 0.0012037078, 'cheetah': 0.0013392578, 'English_foxhound': 0.00049555744, 'briard': 0.0005603474, 'sloth_bear': 0.00067047833, 'Border_terrier': 0.0011209487, 'German_shepherd': 0.0003471842, 'otter': 0.00074742624, 'koala': 0.0012796782, 'tusker': 0.0012231773, 'echidna': 0.0006569209, 'wallaby': 0.0017348453, 'platypus': 0.00084433006, 'wombat': 0.0012885607, 'revolver': 0.00032871883, 'umbrella': 0.000562244, 'schooner': 0.000296088, 'soccer_ball': 0.0003618831, 'accordion': 0.0009141253, 'ant': 0.0011580512, 'starfish': 0.0003766985, 'chambered_nautilus': 0.0011685746, 'grand_piano': 0.0005815985, 'laptop': 0.0010458522, 'strawberry': 0.0011316275, 'airliner': 0.0015322901, 'warplane': 0.0012332336, 'airship': 0.00031386214, 'balloon': 0.00082097185, 'space_shuttle': 0.00053222646, 'fireboat': 0.0007481256, 'gondola': 0.0012073473, 'speedboat': 0.0018494261, 'lifeboat': 0.00048196854, 'canoe': 0.0004692828, 'yawl': 0.0025077173, 'catamaran': 0.0009199604, 'trimaran': 0.00047925056, 'container_ship': 0.0008788729, 'liner': 0.00045518728, 'pirate': 0.0008025049, 'aircraft_carrier': 0.0014064736, 'submarine': 0.00094974844, 'wreck': 0.0009211716, 'half_track': 0.0025719875, 'tank': 0.0010164235, 'missile': 0.00096704747, 'bobsled': 0.0009352393, 'dogsled': 0.00089393975, 'bicycle-built-for-two': 0.0006481305, 'mountain_bike': 0.00044295142, 'freight_car': 0.00072417833, 'passenger_car': 0.0010054957, 'barrow': 0.0011820616, 'shopping_cart': 0.0006315327, 'motor_scooter': 0.0012318507, 'forklift': 0.0008912859, 'electric_locomotive': 0.00043462266, 'steam_locomotive': 0.0014380314, 'amphibian': 0.0013264907, 'ambulance': 0.0008022707, 'beach_wagon': 0.0006814724, 'cab': 0.0011039875, 'convertible': 0.00026016115, 'jeep': 0.00195107, 'limousine': 0.0006085943, 'minivan': 0.001311419, 'Model_T': 0.002430188, 'racer': 0.0003428685, 'sports_car': 0.00050586375, 'go-kart': 0.0015384373, 'golfcart': 0.0004850899, 'moped': 0.0019142939, 'snowplow': 0.0006055381, 'fire_engine': 0.0013242919, 'garbage_truck': 0.0007222062, 'pickup': 0.001595455, 'tow_truck': 0.00079983054, 'trailer_truck': 0.0008890617, 'moving_van': 0.00082359574, 'police_van': 0.00041793904, 'recreational_vehicle': 0.0009667033, 'streetcar': 0.00074825884, 'snowmobile': 0.0039802683, 'tractor': 0.00093732105, 'mobile_home': 0.0007239634, 'tricycle': 0.0012059201, 'unicycle': 0.0009181362, 'horse_cart': 0.00055886596, 'jinrikisha': 0.0016387817, 'oxcart': 0.00031353126, 'bassinet': 0.0007486063, 'cradle': 0.0008687476, 'crib': 0.0018985302, 'four-poster': 0.00026404974, 'bookcase': 0.0013073584, 'china_cabinet': 0.00107492, 'medicine_chest': 0.000447954, 'chiffonier': 0.0007046773, 'table_lamp': 0.000543701, 'file': 0.0006581826, 'park_bench': 0.0013155353, 'barber_chair': 0.00076055666, 'throne': 0.0005820926, 'folding_chair': 0.0035606618, 'rocking_chair': 0.00017051968, 'studio_couch': 0.0009297978, 'toilet_seat': 0.00060623296, 'desk': 0.00061987026, 'pool_table': 0.0008919749, 'dining_table': 0.0009493097, 'entertainment_center': 0.0005797904, 'wardrobe': 0.0020887179, 'Granny_Smith': 0.000841478, 'orange': 0.0001226445, 'lemon': 0.0016463246, 'fig': 0.0005141846, 'pineapple': 0.0013097357, 'banana': 0.00058463984, 'jackfruit': 0.0008032825, 'custard_apple': 0.0008301924, 'pomegranate': 0.0010332471, 'acorn': 0.0007280805, 'hip': 0.0016770704, 'ear': 0.00047219478, 'rapeseed': 0.0020728048, 'corn': 0.0011806451, 'buckeye': 0.00035773474, 'organ': 0.0011563181, 'upright': 0.00040048748, 'chime': 0.0006850233, 'drum': 0.0003219981, 'gong': 0.00056942843, 'maraca': 0.00038401593, 'marimba': 0.0016179933, 'steel_drum': 0.00038199915, 'banjo': 0.0014720429, 'cello': 0.00046661607, 'violin': 0.0008638141, 'harp': 0.00078270026, 'acoustic_guitar': 0.0011032243, 'electric_guitar': 0.0003665835, 'cornet': 0.000872279, 'French_horn': 0.0017834828, 'trombone': 0.0004510387, 'harmonica': 0.00048546432, 'ocarina': 0.00041573335, 'panpipe': 0.0005880968, 'bassoon': 0.0017976358, 'oboe': 0.00079598906, 'sax': 0.0014975878, 'flute': 0.0008456801, 'daisy': 0.0007133399, "yellow_lady's_slipper": 0.0005282468, 'cliff': 0.00091643014, 'valley': 0.0012302834, 'alp': 0.00025667544, 'volcano': 0.0014490306, 'promontory': 0.0008656905, 'sandbar': 0.0014829241, 'coral_reef': 0.0010663585, 'lakeside': 0.0008574207, 'seashore': 0.0018335097, 'geyser': 0.0019565504, 'hatchet': 0.0005222706, 'cleaver': 0.00068574655, 'letter_opener': 0.0003563477, 'plane': 0.0009281646, 'power_drill': 0.00061272416, 'lawn_mower': 0.0007980305, 'hammer': 0.0011221775, 'corkscrew': 0.0017910097, 'can_opener': 0.0018746562, 'plunger': 0.0005097243, 'screwdriver': 0.0012582233, 'shovel': 0.0004525653, 'plow': 0.0006649758, 'chain_saw': 0.0006513588, 'cock': 0.0013244139, 'hen': 0.0014041583, 'ostrich': 0.0009083533, 'brambling': 0.00051652134, 'goldfinch': 0.0006296056, 'house_finch': 0.00047804936, 'junco': 0.0014165796, 'indigo_bunting': 0.0028740333, 'robin': 0.0007866315, 'bulbul': 0.001917282, 'jay': 0.00076105696, 'magpie': 0.0013161178, 'chickadee': 0.00085238036, 'water_ouzel': 0.0002879172, 'kite': 0.00062900217, 'bald_eagle': 0.0010329705, 'vulture': 0.00042114107, 'great_grey_owl': 0.0026120266, 'black_grouse': 0.0007101799, 'ptarmigan': 0.00026333507, 'ruffed_grouse': 0.000757097, 'prairie_chicken': 0.00075126265, 'peacock': 0.00057938276, 'quail': 0.0020931046, 'partridge': 0.0023236645, 'African_grey': 0.0006997198, 'macaw': 0.0003764595, 'sulphur-crested_cockatoo': 0.00051658193, 'lorikeet': 0.001089204, 'coucal': 0.0006429889, 'bee_eater': 0.0005939811, 'hornbill': 0.00042015742, 'hummingbird': 0.0012699981, 'jacamar': 0.00038460435, 'toucan': 0.0012428985, 'drake': 0.0004888178, 'red-breasted_merganser': 0.001494211, 'goose': 0.00026711606, 'black_swan': 0.00068730576, 'white_stork': 0.0010806646, 'black_stork': 0.00054795877, 'spoonbill': 0.0007178469, 'flamingo': 0.0007972173, 'American_egret': 0.0019316667, 'little_blue_heron': 0.001196161, 'bittern': 0.0017733854, 'crane': 0.0010716481, 'limpkin': 0.00054351514, 'American_coot': 0.0005197537, 'bustard': 0.0008223057, 'ruddy_turnstone': 0.00079439674, 'red-backed_sandpiper': 0.0007670702, 'redshank': 0.00090661953, 'dowitcher': 0.00044888392, 'oystercatcher': 0.0027146111, 'European_gallinule': 0.00105227, 'pelican': 0.00041989624, 'king_penguin': 0.0013082908, 'albatross': 0.000823284, 'great_white_shark': 0.00095469254, 'tiger_shark': 0.0007659887, 'hammerhead': 0.00034065126, 'electric_ray': 0.00046376462, 'stingray': 0.003160964, 'barracouta': 0.0005162672, 'coho': 0.00077205466, 'tench': 0.00026017704, 'goldfish': 0.0006990679, 'eel': 0.0005111648, 'rock_beauty': 0.00080139533, 'anemone_fish': 0.0005497227, 'lionfish': 0.0005297166, 'puffer': 0.0003801149, 'sturgeon': 0.0008049187, 'gar': 0.0004115417, 'loggerhead': 0.0009446465, 'leatherback_turtle': 0.0016841586, 'mud_turtle': 0.0018437328, 'terrapin': 0.0021972153, 'box_turtle': 0.00040449982, 'banded_gecko': 0.0018808753, 'common_iguana': 0.0007888826, 'American_chameleon': 0.00079707993, 'whiptail': 0.00044323158, 'agama': 0.0006787146, 'frilled_lizard': 0.00070589053, 'alligator_lizard': 0.0007762472, 'Gila_monster': 0.00093608676, 'green_lizard': 0.0021551407, 'African_chameleon': 0.0002796997, 'Komodo_dragon': 0.00046416905, 'triceratops': 0.0020266527, 'African_crocodile': 0.0013681892, 'American_alligator': 0.0003778704, 'thunder_snake': 0.0013599838, 'ringneck_snake': 0.0007473412, 'hognose_snake': 0.00066585944, 'green_snake': 0.00066184276, 'king_snake': 0.0002789968, 'garter_snake': 0.0004152252, 'water_snake': 0.0014960772, 'vine_snake': 0.001124733, 'night_snake': 0.0006035525, 'boa_constrictor': 0.00072426005, 'rock_python': 0.0010061796, 'Indian_cobra': 0.000972281, 'green_mamba': 0.0010819746, 'sea_snake': 0.0006987462, 'horned_viper': 0.0012374495, 'diamondback': 0.0011098131, 'sidewinder': 0.00096575415, 'European_fire_salamander': 0.0008947692, 'common_newt': 0.00032571264, 'eft': 0.0008172559, 'spotted_salamander': 0.0018453375, 'axolotl': 0.0011403434, 'bullfrog': 0.0008467938, 'tree_frog': 0.0015964701, 'tailed_frog': 0.0011335404, 'whistle': 0.0016750292, 'wing': 0.0002675159, 'paintbrush': 0.0007092226, 'hand_blower': 0.0009814496, 'oxygen_mask': 0.0005475067, 'snorkel': 0.0032566949, 'loudspeaker': 0.0009572188, 'microphone': 0.00074006227, 'screen': 0.0023267374, 'mouse': 0.0009983559, 'electric_fan': 0.002048344, 'oil_filter': 0.0013005986, 'strainer': 0.00050701346, 'space_heater': 0.0007621984, 'stove': 0.00046690213, 'guillotine': 0.0012463164, 'barometer': 0.0006752621, 'rule': 0.003495674, 'odometer': 0.0009359415, 'scale': 0.00031048447, 'analog_clock': 0.00077728427, 'digital_clock': 0.00041153363, 'wall_clock': 0.0014889947, 'hourglass': 0.0008962763, 'sundial': 0.0010768155, 'parking_meter': 0.0008074726, 'stopwatch': 0.000351166, 'digital_watch': 0.00034004668, 'stethoscope': 0.00074013066, 'syringe': 0.0011007161, 'magnetic_compass': 0.0015685349, 'binoculars': 0.0005992295, 'projector': 0.001144601, 'sunglasses': 0.0011693134, 'loupe': 0.000992853, 'radio_telescope': 0.0009821221, 'bow': 0.0003284918, 'cannon': 0.0018880258, 'assault_rifle': 0.0011750954, 'rifle': 0.0006499053, 'projectile': 0.00074486097, 'computer_keyboard': 0.00048503975, 'typewriter_keyboard': 0.0012519436, 'lighter': 0.00097056787, 'abacus': 0.00044205255, 'cash_machine': 0.0005575715, 'slide_rule': 0.0008857869, 'desktop_computer': 0.0005085318, 'hand-held_computer': 0.000819174, 'notebook': 0.00052175234, 'web_site': 0.00091285346, 'harvester': 0.0017603951, 'thresher': 0.0014266062, 'printer': 0.0017153149, 'slot': 0.0007183797, 'vending_machine': 0.00067375985, 'sewing_machine': 0.0010078662, 'joystick': 0.00035324582, 'switch': 0.00062357594, 'hook': 0.00021052865, 'car_wheel': 0.0029452974, 'paddlewheel': 0.0017677146, 'pinwheel': 0.00078193774, "potter's_wheel": 0.00057588087, 'gas_pump': 0.0012868207, 'carousel': 0.00087172474, 'swing': 0.0005312612, 'reel': 0.00079802464, 'radiator': 0.0006469106, 'puck': 0.000825484, 'hard_disc': 0.00039842707, 'sunglass': 0.00037853874, 'pick': 0.0011971801, 'car_mirror': 0.0015085902, 'solar_dish': 0.0008647065, 'remote_control': 0.0010237267, 'disk_brake': 0.0010853297, 'buckle': 0.0003961923, 'hair_slide': 0.0011131054, 'knot': 0.0002489634, 'combination_lock': 0.00045069132, 'padlock': 0.0006865642, 'nail': 0.0009666945, 'safety_pin': 0.00082895433, 'screw': 0.000519691, 'muzzle': 0.0016549203, 'seat_belt': 0.00044220942, 'ski': 0.0004584521, 'candle': 0.0009548372, "jack-o'-lantern": 0.0009540223, 'spotlight': 0.0015289737, 'torch': 0.0009064998, 'neck_brace': 0.0010379179, 'pier': 0.00093379506, 'tripod': 0.0004079615, 'maypole': 0.0008402531, 'mousetrap': 0.00092358957, 'spider_web': 0.00036225514, 'trilobite': 0.0030412993, 'harvestman': 0.00038505578, 'scorpion': 0.0008469358, 'black_and_gold_garden_spider': 0.0014735492, 'barn_spider': 0.0003356832, 'garden_spider': 0.00054690865, 'black_widow': 0.0012433381, 'tarantula': 0.00065229845, 'wolf_spider': 0.0004580926, 'tick': 0.00067108404, 'centipede': 0.000753112, 'isopod': 0.0008716396, 'Dungeness_crab': 0.0006183142, 'rock_crab': 0.00035523614, 'fiddler_crab': 0.0006676319, 'king_crab': 0.00036002512, 'American_lobster': 0.00039007002, 'spiny_lobster': 0.0013909374, 'crayfish': 0.0017018714, 'hermit_crab': 0.000498715, 'tiger_beetle': 0.000639993, 'ladybug': 0.00085118436, 'ground_beetle': 0.00031612744, 'long-horned_beetle': 0.00030696206, 'leaf_beetle': 0.00047393283, 'dung_beetle': 0.0007297292, 'rhinoceros_beetle': 0.00061509, 'weevil': 0.00046350397, 'fly': 0.0014952285, 'bee': 0.0012114372, 'grasshopper': 0.0011853548, 'cricket': 0.0005844737, 'walking_stick': 0.00040300237, 'cockroach': 0.00073412363, 'mantis': 0.00063629827, 'cicada': 0.00022824801, 'leafhopper': 0.00027522002, 'lacewing': 0.0013366669, 'dragonfly': 0.0024538569, 'damselfly': 0.00022150888, 'admiral': 0.0020160535, 'ringlet': 0.0018166861, 'monarch': 0.00076583313, 'cabbage_butterfly': 0.00077342405, 'sulphur_butterfly': 0.0011847485, 'lycaenid': 0.0006704226, 'jellyfish': 0.00081835577, 'sea_anemone': 0.0011766598, 'brain_coral': 0.00046982957, 'flatworm': 0.0012634732, 'nematode': 0.0009636003, 'conch': 0.0006142067, 'snail': 0.00017130001, 'slug': 0.00075874606, 'sea_slug': 0.0014216286, 'chiton': 0.0006182942, 'sea_urchin': 0.00017237256, 'sea_cucumber': 0.0010081974, 'iron': 0.00018330582, 'espresso_maker': 0.0037977756, 'microwave': 0.0005525739, 'Dutch_oven': 0.0006398203, 'rotisserie': 0.0007416046, 'toaster': 0.0030331607, 'waffle_iron': 0.0006374371, 'vacuum': 0.001281261, 'dishwasher': 0.0011918882, 'refrigerator': 0.00090237235, 'washer': 0.0014799209, 'Crock_Pot': 0.001018635, 'frying_pan': 0.0004062346, 'wok': 0.00057704386, 'caldron': 0.00059988076, 'coffeepot': 0.00048700083, 'teapot': 0.0010013032, 'spatula': 0.0004927666, 'altar': 0.0022658801, 'triumphal_arch': 0.0008646381, 'patio': 0.001307513, 'steel_arch_bridge': 0.0009046664, 'suspension_bridge': 0.0022883005, 'viaduct': 0.0013950545, 'barn': 0.0011256731, 'greenhouse': 0.0006194669, 'palace': 0.0013485613, 'monastery': 0.00064643164, 'library': 0.0012675138, 'apiary': 0.0012780542, 'boathouse': 0.00061652093, 'church': 0.0004499872, 'mosque': 0.001469035, 'stupa': 0.001939639, 'planetarium': 0.0028417956, 'restaurant': 0.0005366011, 'cinema': 0.0008090114, 'home_theater': 0.00051942613, 'lumbermill': 0.0010888351, 'coil': 0.00062355393, 'obelisk': 0.00052302075, 'totem_pole': 0.0006346021, 'castle': 0.0010238918, 'prison': 0.037591904, 'grocery_store': 0.00050340284, 'bakery': 0.00178884, 'barbershop': 0.00057094253, 'bookshop': 0.0008253245, 'butcher_shop': 0.0006958083, 'confectionery': 0.0010081554, 'shoe_shop': 0.0017710367, 'tobacco_shop': 0.0005890935, 'toyshop': 0.00059027725, 'fountain': 0.00065871666, 'cliff_dwelling': 0.00040663886, 'yurt': 0.0013837194, 'dock': 0.0012450936, 'brass': 0.0027852838, 'megalith': 0.00071522524, 'bannister': 0.0013596058, 'breakwater': 0.00011946146, 'dam': 0.0016865965, 'chainlink_fence': 0.0014193305, 'picket_fence': 0.0011133159, 'worm_fence': 0.00082927453, 'stone_wall': 0.0011926274, 'grille': 0.00087253674, 'sliding_door': 0.0014886255, 'turnstile': 0.0012448393, 'mountain_tent': 0.00038131158, 'scoreboard': 0.00053523394, 'honeycomb': 0.0072708465, 'plate_rack': 0.0011068652, 'pedestal': 0.00028404867, 'beacon': 0.003178685, 'mashed_potato': 0.0018442032, 'bell_pepper': 0.00056632253, 'head_cabbage': 0.00058140384, 'broccoli': 0.00029479896, 'cauliflower': 0.0010468279, 'zucchini': 0.0003000654, 'spaghetti_squash': 0.0010554418, 'acorn_squash': 0.0004984984, 'butternut_squash': 0.0020677387, 'cucumber': 0.0014997541, 'artichoke': 0.0003227595, 'cardoon': 0.0022013949, 'mushroom': 0.0008607164, 'shower_curtain': 0.0004795841, 'jean': 0.0005667199, 'carton': 0.0030431573, 'handkerchief': 0.0015435346, 'sandal': 0.00075286604, 'ashcan': 0.000556034, 'safe': 0.00038855596, 'plate': 0.002078893, 'necklace': 0.0026141165, 'croquet_ball': 0.0010774418, 'fur_coat': 0.00043184432, 'thimble': 0.0005171653, 'pajama': 0.0006903484, 'running_shoe': 0.0010900572, 'cocktail_shaker': 0.00047785995, 'chest': 0.00052981183, 'manhole_cover': 0.00081432355, 'modem': 0.00051041314, 'tub': 0.0016273508, 'tray': 0.001271315, 'balance_beam': 0.00054115406, 'bagel': 0.00081605726, 'prayer_rug': 0.0009082688, 'kimono': 0.0018243879, 'hot_pot': 0.000492199, 'whiskey_jug': 0.0010275064, 'knee_pad': 0.00037368093, 'book_jacket': 0.0007844238, 'spindle': 0.0015724301, 'ski_mask': 0.0010130922, 'beer_bottle': 0.0008288061, 'crash_helmet': 0.0009783998, 'bottlecap': 0.00051618373, 'tile_roof': 0.00029629504, 'mask': 0.0009694052, 'maillot': 0.0011045595, 'Petri_dish': 0.0010503475, 'football_helmet': 0.00054752803, 'bathing_cap': 0.00091218116, 'teddy': 0.0016758133, 'holster': 0.00057679816, 'pop_bottle': 0.00042593875, 'photocopier': 0.00086837035, 'vestment': 0.00033034515, 'crossword_puzzle': 0.0010363212, 'golf_ball': 0.0006904559, 'trifle': 0.0010752911, 'suit': 0.00048054964, 'water_tower': 0.0005003764, 'feather_boa': 0.0007605053, 'cloak': 0.00024744385, 'red_wine': 0.00067424827, 'drumstick': 0.00065143243, 'shield': 0.00052620575, 'Christmas_stocking': 0.0008204674, 'hoopskirt': 0.0008784633, 'menu': 0.0007362759, 'stage': 0.0006689148, 'bonnet': 0.0009185699, 'meat_loaf': 0.0007909464, 'baseball': 0.004425101, 'face_powder': 0.0005708383, 'scabbard': 0.0015747502, 'sunscreen': 0.0009909504, 'beer_glass': 0.002912529, 'hen-of-the-woods': 0.0008806184, 'guacamole': 0.0005704701, 'lampshade': 0.000777545, 'wool': 0.0012973505, 'hay': 0.0008455041, 'bow_tie': 0.00035972652, 'mailbag': 0.00040281023, 'water_jug': 0.0005977341, 'bucket': 0.0010246082, 'dishrag': 0.00057096954, 'soup_bowl': 0.0012191479, 'eggnog': 0.0010109239, 'mortar': 0.0004677529, 'trench_coat': 0.0011158193, 'paddle': 0.0011707654, 'chain': 0.0005027149, 'swab': 0.0008694847, 'mixing_bowl': 0.00073785475, 'potpie': 0.00094167195, 'wine_bottle': 0.00041367978, 'shoji': 0.00072146737, 'bulletproof_vest': 0.001549902, 'drilling_platform': 0.00095722085, 'binder': 0.0006494586, 'cardigan': 0.0003860092, 'sweatshirt': 0.00061620853, 'pot': 0.0010708579, 'birdhouse': 0.0006192731, 'hamper': 0.000680508, 'ping-pong_ball': 0.00036742087, 'pencil_box': 0.0008063758, 'pay-phone': 0.00020054205, 'consomme': 0.00063226453, 'apron': 0.0013311043, 'punching_bag': 0.0012086808, 'backpack': 0.0010986532, 'groom': 0.0010530879, 'bearskin': 0.0023114928, 'pencil_sharpener': 0.00031419293, 'broom': 0.000524321, 'mosquito_net': 0.0009460951, 'abaya': 0.00058811624, 'mortarboard': 0.0005296005, 'poncho': 0.00033354198, 'crutch': 0.0018589825, 'Polaroid_camera': 0.0073109074, 'space_bar': 0.00091180863, 'cup': 0.0004914166, 'racket': 0.0006037721, 'traffic_light': 0.00032293762, 'quill': 0.0005353401, 'radio': 0.0008333485, 'dough': 0.0017043498, 'cuirass': 0.0005229454, 'military_uniform': 0.0009487664, 'lipstick': 0.00076575374, 'shower_cap': 0.0013812194, 'monitor': 0.0011247786, 'oscilloscope': 0.000900707, 'mitten': 0.0005356782, 'brassiere': 0.00084054185, 'French_loaf': 0.0004829366, 'vase': 0.00054381037, 'milk_can': 0.0012251097, 'rugby_ball': 0.0007054033, 'paper_towel': 0.0014432722, 'earthstar': 0.001632474, 'envelope': 0.00088640035, 'miniskirt': 0.00090875855, 'cowboy_hat': 0.00039142516, 'trolleybus': 0.0003915289, 'perfume': 0.00051921565, 'bathtub': 0.00015694281, 'hotdog': 0.0006433339, 'coral_fungus': 0.0005394452, 'bullet_train': 0.0022107903, 'pillow': 0.00051732216, 'toilet_tissue': 0.0014297587, 'cassette': 0.0012342895, "carpenter's_kit": 0.00074536796, 'ladle': 0.0008255416, 'stinkhorn': 0.000737084, 'lotion': 0.0012245589, 'hair_spray': 0.00036913148, 'academic_gown': 0.0015320709, 'dome': 0.00074378395, 'crate': 0.00083024806, 'wig': 0.0013755367, 'burrito': 0.0011630281, 'pill_bottle': 0.0017772405, 'chain_mail': 0.002070553, 'theater_curtain': 0.0011759119, 'window_shade': 0.0009147061, 'barrel': 0.00052829145, 'washbasin': 0.0017775083, 'ballpoint': 0.00044607572, 'basketball': 0.0013331033, 'bath_towel': 0.0007362566, 'cowboy_boot': 0.00046114664, 'gown': 0.00095460087, 'window_screen': 0.00084049394, 'agaric': 0.0011892238, 'cellular_telephone': 0.00034753102, 'nipple': 0.0016348582, 'barbell': 0.0041211806, 'mailbox': 0.000823139, 'lab_coat': 0.0010116922, 'fire_screen': 0.0009556892, 'minibus': 0.00033872112, 'packet': 0.00038947322, 'maze': 0.0006725029, 'pole': 0.0014283361, 'horizontal_bar': 0.0008366088, 'sombrero': 0.00040451752, 'pickelhaube': 0.0014557278, 'rain_barrel': 0.0014428993, 'wallet': 0.00064433966, 'cassette_player': 0.00065501226, 'comic_book': 0.0010568693, 'piggy_bank': 0.00032782956, 'street_sign': 0.0021055064, 'bell_cote': 0.0009688309, 'fountain_pen': 0.00056377694, 'Windsor_tie': 0.00040692632, 'volleyball': 0.0010836242, 'overskirt': 0.00085448404, 'sarong': 0.0002908299, 'purse': 0.0005682637, 'bolo_tie': 0.0005429458, 'bib': 0.0019812153, 'parachute': 0.00029132568, 'sleeping_bag': 0.0008590762, 'television': 0.0003643546, 'swimming_trunks': 0.0024170724, 'measuring_cup': 0.00039348195, 'espresso': 0.00026041383, 'pizza': 0.0011925868, 'breastplate': 0.000664609, 'shopping_basket': 0.0005954881, 'wooden_spoon': 0.00054428336, 'saltshaker': 0.001431945, 'chocolate_sauce': 0.00071529514, 'ballplayer': 0.0006756751, 'goblet': 0.0007100134, 'gyromitra': 0.0009879427, 'stretcher': 0.000595041, 'water_bottle': 0.0008173642, 'dial_telephone': 0.00023926221, 'soap_dispenser': 0.00128625, 'jersey': 0.00069372286, 'school_bus': 0.00029718337, 'jigsaw_puzzle': 0.00071380194, 'plastic_bag': 0.0016863031, 'reflex_camera': 0.0016982144, 'diaper': 0.0012433642, 'Band_Aid': 0.0010888961, 'ice_lolly': 0.0010593379, 'velvet': 0.0004295196, 'tennis_ball': 0.0009705796, 'gasmask': 0.0011191316, 'doormat': 0.0015863173, 'Loafer': 0.0010363159, 'ice_cream': 0.00028664025, 'pretzel': 0.00067002926, 'quilt': 0.002805399, 'tape_player': 0.0010363003, 'clog': 0.00045157672, 'iPod': 0.001187576, 'bolete': 0.0016062711, 'scuba_diver': 0.00035697714, 'pitcher': 0.0008663289, 'matchstick': 0.0006115164, 'bikini': 0.0009137165, 'sock': 0.0010276816, 'CD_player': 0.0011872674, 'lens_cap': 0.0027006543, 'thatch': 0.00030401116, 'vault': 0.0009730892, 'beaker': 0.00028762178, 'bubble': 0.00094937376, 'cheeseburger': 0.0004585568, 'parallel_bars': 0.0005167571, 'flagpole': 0.0017233518, 'coffee_mug': 0.00042655034, 'rubber_eraser': 0.00073954894, 'stole': 0.0011692847, 'carbonara': 0.00083475123, 'dumbbell': 0.00044254755}}]
文章
人工智能  ·  并行计算  ·  算法  ·  PyTorch  ·  算法框架/工具  ·  计算机视觉  ·  Docker  ·  异构计算  ·  容器
2023-03-16
docker的四种网络模式
四类网络模式bridge模式内网IP下面给大家列出来,只要ip地址不属于这几个网段范畴的,都是公网ip。100.X.X.X10.X.X.X192.168.X.X172.16.X.X-172.31.X.Xbridge模式当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。如下图所示,当Docker1需要访问外网时,请求先到达Docker0虚拟网卡,然后在到达物理网卡​,请求就发送出去了。实操1)首先有一个服务器,我的云服务器内网IP为:10.0.4.82)然后创建一个docke容器,容器为zookeeper(端口2181)3)查看docker服务器的IPdocker inspect 容器ID执行上面的命令,就可以查看容器的详细信息,从图中可以看出容器的网络模式为bridge,容器的IP为172.17.0.5(我起了其他的容器,所以不是172.17.0.2)host模式host模式如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。实操1)首先有一个服务器,我的云服务器内网IP为:10.0.4.82)通过添加一下参数设置网络模式为host模式--net=host启动一个centos容器docker run -itd --name centos01 --net=host centos:centos7我们使用一下命令查看docker容器的详细信息,如下图所示,并没有发现IP信息docker inspect 容器ID我们可以进入容器内部去查看,其中764af3b723a0为容器ID//进入容器 docker exec -it 764af3b723a0 /bin/bash //安装网络工具 yum install net-tools -y //查看IP ifconfig通过截图发现,host网络模式下的容器的IP和宿主机IP一致container模式container模式这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。Container模式示意图:使用场景k8s中一个Pod中共用一个网络,其实就Pod里先初始化一个Pause容器用来设置网络,其他的容器通过container模式关联到Pause容器上,这样一个Pod里的多个容器共用一个网络none模式使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
文章
Kubernetes  ·  Linux  ·  Docker  ·  容器  ·  Perl
2023-02-25
Kubeadm 快速搭建 k8s v1.19.1 集群(Ubuntu Server 20.04 LTS)
安装准备工作说明:以下配置要求为开发环境部署最小规格,不建议生产环境按照此规格搭建部署环境。安装环境要求 角色 实验环境 生产环境 操作系统 master cpu/内存:2 Core/2G cpu/内存:2 Core/4G linux 内核4.4+ node cpu/内存:1 Core/2G cpu/内存:4 Core/16G linux 内核4.4+ 备注 Node:应根据需要运行的容器数量进行配置; Linux 操作系统基于 x86_64 架构的各种 Linux 发行版本,Kernel 版本要求在 4.4 及以上;【查看 Linux 内核:$ uname -f】 以下环境配置 OS 基于 Linux for ubuntu-server 20.04 Linux Kernel =》5.4.0-47-generic 查看 linux 内核版本=》在命令行中查看 Linux 内核版本的3种方法_Linux教程_Linux公社-Linux系统门户网站 说明 以上为建议配置,实际安装过程中,Master 必须 2 core 及以上(否则安装失败,切记),Node 可以采用 1 core。 单 Master 部署环境说明 主机 配置 组件 ip k8s-master01 cpu/内存:2 Core/2G 硬盘:40GB 网络模式:桥接 kube-apiserver, kube-controller-manager,kube-scheduler, etcd 192.168.0.168 k8s-node01 cpu/内存:2 Core/2G 硬盘:40GB 网络模式:桥接 kubelet, kube-proxy, docker etcd 192.168.0.116 k8s-node02 cpu/内存:2 Core/2G 硬盘:40GB 网络模式:桥接 kubelet, kube-proxy, docker etcd 192.168.0.154 备注 linux 版本:ubuntu-20.04-live-server-amd64.iso kubernetes 版本:v1.19.1 docker 版本:v19.03.8-ce vm 版本:VMware Workstation Pro 15.6 客户端使用 xshell6 连接到 vm 中 linux 系统方便安装配置; 说明 以上配置为 3 节点主机的单 Master 架构的最小规模集群配置,配置环境均在 vm 中部署安装,宿主机固定静态 IP,保障 vm 中 linux 系统的网络在同一网段,使用桥接模式,宿主机和 vm 系统之间能相互通信,vm 中系统能正常访问外网; 生产环境建议扩展多 Master 架构集群部署,node 节点根据部署容器数量预估配置; 单 Master 架构图操作系统初始化配置2.1 关闭 UFW(Uncomplicated Firewall)防火墙Ubuntu20.04 一般都默认安装了 UFW(Uncomplicated Firewall) 防火墙服务,它是一款轻量化的工具,主要用于对输入输出的流量进行监控。而 Kubernetes 的 Master 与工作 Node 之间会有大量的网络通信,安全的做法是在防火墙上配置 Kbernetes 各组件(api-server、kubelet 等等)需要相互通信的端口号。在安全的内部网络环境中可以关闭防火墙服务。# 查看防火墙状态 $ sudo ufw status verbose # 关闭ubuntu的防火墙 $ sudo ufw disable Status: inactive 说明防火墙未运行Status: active 说明防火墙在运行参考:ubuntu 关闭和开启防火墙,https://cloud.tencent.com/developer/article/1503910ubuntu20.04 防火墙设置简易教程(小白),https://www.jb51.net/article/192145.htm2.2 关闭 SELinux安全增强型 Linux(Security-Enhanced Linux) 简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。关闭 SELinux 的两种方法永久方法 – 需要重启服务器修改 /etc/selinux/config 文件中设置 SELINUX=disabled,然后重启服务器。临时方法 – 设置系统参数使用命令 setenforce 0参数说明:setenforce 1 设置 SELinux 成为 enforcing 模式setenforce 0 设置 SELinux 成为 permissive 模式# 安装 selinux-utils $ apt install selinux-utils # 查看 selinux 是否关闭 $ getenforce # 临时 $ setenforce 0 # 永久 $ sed -i 's/enforcing/disabled/' /etc/selinux/config 2.3 关闭 swap 内存分区这个 swap 其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭 swap,修改 /etc/fstab 文件:# 临时 $ sudo swapoff -a # 永久,修改/etc/fstab,注释掉swap那行,持久化生效 $ sudo vi /etc/fstab2.4 根据规划设置主机名# 查看主机名称 $ hostname # 设置主机名称 $ hostnamectl set-hostname <hostname> 2.5 在 Master 添加 hostshosts 文件的作用相当如 DNS(Domain Name System),提供 IP 地址到 hostname 的映射。早期的互联网计算机少,单机 hosts 文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的 DNS 系统。由 DNS 服务器来提供类似的 IP 地址到域名的对应。具体可以 man hosts。/etc/hosts 中包含了 IP 地址和主机名之间的映射,还包括主机名的别名。hosts 文件的配置格式是: IP FQDN alias,其中全域名 (FQDN,Fully Qualified Domain Name) 是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置。Linux 系统在向 DNS 服务器发出域名解析请求之前会查询 /etc/hosts 文件,如果里面有相应的记录,就会使用 hosts 里面的记录。此处 hosts 类似 DNS(Domain Name System), DNS 可以降低延迟,但是不能提高上下行网速。$ cat >> /etc/hosts << EOF 172.26.16.100 k8s-master01 172.26.16.101 k8s-node01 172.26.16.102 k8s-node02 EOF注意:此处添加 hosts 防止重启 linux 系统后,IP 无效,可以事先根据规划的网段设置好静态IP地址,操作如下:Ubuntu 18.04 配置静态IP地址。使用 Netplan(新一代网络配置工具)工具配置网络1. 备份系统默认 /etc/netplan/*.yaml 文件$ sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak2. 编写 /etc/netplan/*.yaml 文件network: version: 2 renderer: networkd ethernets: eth0: #配置的网卡名称 dhcp4: false #dhcp4关闭 dhcp6: false #dhcp6关闭 addresses: [172.26.16.100/16] #设置本机IP及掩码 gateway4: 172.26.16.1 #设置网关 nameservers: addresses: [114.114.114.114, 8.8.8.8] #设置DNSeth0 - 网络接口名称。dhcp4 和 dhcp6 - 接受 IPv4 和 IPv6 接口的 dhcp 属性。addresses - 接口的静态地址序列。gateway4 - 默认网关的 IPv4 地址。nameservers - nameservers 的 IP 地址序列。DNS 可以配置多个,配置列表见附件。 IP 地址段和子网掩码对照表 =》精心整理IP地址段与子网掩码表(收藏) (360doc.com),http://www.360doc.com/content/18/0121/21/40298311_723964860.shtmlIP和子网掩码对照表 - 百度文库 (baidu.com),https://wenku.baidu.com/view/aec639e0a1116c175f0e7cd184254b35eefd1ad8.html3. 执行 apply 命令,使 yaml 配置生效$ netplan apply -f 00-installer-config.yaml附:国内知名公共DNS服务器IP腾讯DNS:119.29.29.29、 182.254.116.116阿里DNS:223.5.5.5、 223.6.6.6百度DNS:180.76.76.76114DNS:114.114.114.114、 114.114.115.115CNNIC DNS:1.2.4.8、 210.2.4.8OneDNS:117.50.11.11、 117.50.22.22Hi!XNS DNS服务器:40.73.101.101清华大学TUNA协会DNS服务器:101.6.6.6Google Public DNS:8.8.8.8、8.8.4.42.6 时间同步,确保时区和时间正确每个宿主机上都要确保时区和时间是正确的。如果时区不正确,请使用下面的命令来修改:$ sudo timedatectl set-timezone Asia/Shanghai #修改后,如果想使得系统日志的时间戳也立即生效,则: $ sudo systemctl restart rsyslog (Ubuntu如何同步网络时间,https://www.cnblogs.com/zhongguiyao/p/9293764.html)装完Ubuntu设置完时间,重启总是恢复设置前的时间。设定时区:dpkg-reconfigure tzdata选择Asia -> 再选择Shanghai -> OK解决方法:# 1.安装ntpdate工具 $ sudo apt install ntpdate -y # 2.将系统时间与网络同步 $ ntpdate cn.pool.ntp.org # 3.将时间写入硬件 $ hwclock --systohc # 4.查看时间是否已同步 $ date 2.7 关闭 suspend(待机/休眠),确保每个机器不会自动待机/休眠;$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target2.8 设置 iptables 可以看到 bridged traffic / 将桥接的 IPv4 流量传递到 iptables 的链先确认 Linux 内核加载了 br_netfilter 模块:$ lsmod | grep br_netfilter注意:确保 sysctl 配置中 net.bridge.bridge-nf-call-iptables 的值设置为了 1。在 Ubuntu 20.04 Server 上,这个值就是 1。如果你的系统上不一致,使用下面的命令来修改:$ cat << EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF $ sudo sysctl --system # 生效$ cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF $ sudo sysctl --system # 生效2.9 设置 rp_filter 的值因为 K8s 集群即将部署的是 calico 网络插件,而 calico 需要这个内核参数是 0 或者 1,但是 Ubuntu20.04 上默认是 2,这样就会导致 calico 插件报下面的错误(这是个 fatal 级别的 error):int_dataplane.go 1035: Kernel's RPF check is set to 'loose'. \ This would allow endpoints to spoof their IP address. \ Calico requires net.ipv4.conf.all.rp_filter to be set to 0 or 1. \ If you require loose RPF and you are not concerned about spoofing, \ this check can be disabled by setting the IgnoreLooseRPF configuration parameter to 'true'.使用下面的命令来修改这个参数的值:# 修改/etc/sysctl.d/10-network-security.conf $ sudo vi /etc/sysctl.d/10-network-security.conf # 将下面两个参数的值从2修改为1 $ net.ipv4.conf.default.rp_filter=1 $ net.ipv4.conf.all.rp_filter=1 # 然后使之生效 $ sudo sysctl --system2.10 重启 Linux 系统$ shutdown -r now #重启系统安装基础软件Kubernetes 在 1.20.x 版本以前默认 CRI/Container Runtime Interface(容器运行时)为 Docker,因此此处先安装 Docker;关于 CRI 的一些实现:CRI-containerd 是目前社区中比较主流的新一代 CRI 的实现;CRI-O 来自于红帽公司基于 Open Container Initiative 的 K8s CRI 的实现;PouchContainer 是由 alibaba 实现的 CRI;其它的 CRI 实现,这里就不一一介绍了,更多详细信息自行查阅资料。注意:Kubernetes 官方发布公告,宣布自 v1.20 起放弃对 Docker 的支持,届时用户将收到 Docker 弃用警告,并需要改用其他容器运行时。目前 k8s 最新版默认容器运行时是 CRI-containerd。3.1 安装 Docker目前 Ubuntu 20.04 上没有 docker 官方提供的安装包,但是 Ubuntu 有,使用下面的命令来安装 Docker;1. apt 方式安装 docker# 安装 Docker $ sudo apt update && sudo apt install docker.io # 启动 Docker,并设置为开机启动 $ sudo systemctl start docker && systemctl enable docker注意:apt 方式安装 docker, daemon.json 文件的位置在 /etc/docker/ 文件下面。2. snap 方式安装 docker# 安装 docker $ sudo snap install docker # 启动 docker $ sudo snap start docker注意:snap 方式安装 docker,daemon.json 文件的位置在 /var/snap/docker/*/config/ 文件下面。参考:Ubuntu 20.04 以 snap 的方式安装 Docker,https://www.cnblogs.com/jijizhazha/p/13170711.html​3.2 验证 Docker 是否安装成功$ docker -v # 查看docker版本3.3 配置 Docker 镜像下载加速器$ cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF $ systemctl restart docker $ docker info国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:中国科技大学镜像:https://docker.mirrors.ustc.edu.cn/网易镜像:https://hub-mirror.c.163.com/阿里云镜像:https://<你的ID>.mirror.aliyuncs.com/七牛云加速器:https://reg-mirror.qiniu.com/Docker中国区官方镜像:https://registry.docker-cn.com/ustc: https://docker.mirrors.ustc.edu.cn/3.4 在 Ubuntu 系统中配置阿里云 apt 软件源#第一步:备份源文件: $ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup #第二步:编辑 `/etc/apt/sources.list` 文件 #在文件最前面添加以下条目(操作前请做好相应备份): $ vi /etc/apt/sources.list # 阿里云 apt 源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse #deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse #deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse #deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse #deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse # 预发布软件源,不建议启用 #deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse #deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse #第三步:执行更新命令: $ sudo apt-get update $ sudo apt-get upgrade其中 3.4 参考如下:Ubuntu 系统配置源并安装,https://www.cnblogs.com/zqifa/p/12910989.htmlLinux 发行版添加软件源,https://developer.aliyun.com/article/746822?spm=a2c6h.13813017.content3.1.7afe1211cFoJxx基于 Debian 的发行版,https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%AE%89%E8%A3%85-kubeadm-kubelet-%E5%92%8C-kubectl#1.查看 docker 服务是否开机启动 $ sudo systemctl list-unit-files | grep enable|grep docker snap-docker-1125.mount enabled snap.docker.dockerd.service enabled #2.关闭 docker 开机自启动 $ systemctl disable snap.docker.dockerd.service Removed /etc/systemd/system/multi-user.target.wants/snap.docker.dockerd.service. #3.开启 docker 开机自启动 $ systemctl enable snap.docker.dockerd.service #4.关闭 docker 服务 $ systemctl stop snap.docker.dockerd.service #5.启动 docker 服务 $ systemctl start snap.docker.dockerd.service #6.查看 docker 服务是否启动 $ sudo systemctl list-units --type=service|grep docker snap.docker.dockerd.service loaded active running Service for snap application docker.dockerd注意:以上操作(除开2.4、2.5)均在所有节点执行;开始安装 k8s4.1 安装 K8s master以下的操作只在 master 宿主机上执行,适合中国大陆地区使用(因为弃用谷歌的源和 repo,转而使用阿里云的镜像):4.1.1 安装 kubelet、 kubeadm 和 kubectl$ sudo apt update && sudo apt install -y ca-certificates curl software-properties-common apt-transport-https curl $ curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - $ sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF $ sudo apt update # 查看 kubeadm 可用版本 $ sudo apt-cache madison kubeadm # 指定 kubeadm 版本安装 $ sudo apt install -y kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00 $ sudo apt-mark hold kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器;kubeadm 用于初始化 Cluster ;kubectl 是 k8s 命令行工具,通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件;注意:在所有节点均安装 kubelet、 kubeadm 和 kubectl。4.1.2 初始化 Kubernetes Master注意:这里使用了阿里云的镜像,然后使用了非默认的 CIDR(一定要和宿主机的局域网的 CIDR 不一样!)=》4.1.2.1 命令初始化$ kubeadm init \ --apiserver-advertise-address=172.26.16.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all # 或者 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers命令参数说明:【--apiserver-advertise-address】集群通告地址;【--image-repository】由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址;【--kubernetes-version】K8s版本,与上面安装的一致;【--service-cidr】集群内部虚拟网络,Pod统一访问入口;【--pod-network-cidr】Pod网络与下面部署的 CNI 网络组件 yaml 中保持一致;【--ignore-preflight-errors】忽略预检查错误信息,这个参数会跳过对docker-ce的版本检查;=》4.1.2.2 yaml 配置文件引导初始化# 编辑配置文件 $ vi kubeadm.conf apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.18.0 imageRepository: registry.aliyuncs.com/google_containers networking: podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12 #执行并应用配置文件 $ kubeadm init --config kubeadm.conf --ignore-preflight-errors=all 4.2 加入 Kubernetes Node (部署 K8s worker 节点)上面的命令执行成功后,会输出一条和 kubeadm join 相关的命令,后面加入 worker node 的时候要使用。输出其他节点加入 master 的命令:Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \ --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1拷贝 kubectl 使用的连接k8s认证文件到默认路径,给自己的非 sudo 的常规身份拷贝一个 token,这样就可以执行 kubectl 命令了:# 切换到非管理员账户 $ su chait # 最后拷贝 kubectl 工具用的 kubeconfig 到默认路径下 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 查看集群节点信息 $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 2m v1.18.0在每个 node/worker 宿主机上,执行上面初始化 master 最后输出的命令,如下所示:kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \ --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1接下来在 node/worker 节点输入命令=》【kubectl get pods】,结果出现如下错误:The connection to the server localhost:8080 was refused - did you specify the right host or port?出现这个问题的原因是 kubectl 命令需要使用 kubernetes-admin 来运行,解决方法如下,将 Master 节点中的【/etc/kubernetes/admin.conf】文件拷贝到 worker 节点相同目录下,然后配置环境变量:echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile source ~/.bash_profile # 立即生效再次输入命令【kubectl get pods --all-namespaces】查看所有 pod 的命名空间,显示如下:默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:$ kubeadm token create $ kubeadm token list $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1 $ kubeadm join 192.168.31.61:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1命令:kubeadm token create --print-join-command参考地址 =》https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/4.3 部署容器网络(CNI)Calico 是一个纯三层的数据中心网络方案,Calico 支持广泛的平台,包括 Kubernetes、OpenStack 等。Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器(vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。此外,Calico 项目还实现了 Kubernetes 网络策略,提供 ACL 功能。=》 Quickstart for Calico on Kubernetes,https://docs.projectcalico.org/getting-started/kubernetes/quickstart4.3.1 安装 calico 插件下载 calico 的 k8s yaml 文件# 下载 https://docs.projectcalico.org/v3.11/manifests/calico.yaml sudo wget https://docs.projectcalico.org/v3.11/manifests/calico.yaml # 修改CALICO_IPV4POOL_CIDR root@k8s-master01:/# vim calico.yaml # 通过文件名或控制台输入,对资源进行配置。 root@k8s-master01:/# kubectl apply -f calico.yaml下载完后还需要修改里面配置项:定义 Pod 网络(CALICO_IPV4POOL_CIDR),与前面 pod CIDR 配置一样;选择工作模式(CALICO_IPV4POOL_IPIP),支持 BGP(Never)、IPIP(Always)、CrossSubnet(开启 BGP 并支持跨子网);修改里面的 CALICO_IPV4POOL_CIDR 的值来避免和宿主机所在的局域网段冲突(把原始的192.168.0.0/16 修改成了 172.16.0.0/16):修改完后应用清单:等待所有的 pod 都 ready 就绪。4.4 测试 K8s 集群环境验证Pod工作;验证Pod网络通信;验证DNS解析;在 Kubernetes 集群中创建一个 pod,验证是否正常运行:$ kubectl create deployment nginx --image=nginx $ kubectl expose deployment nginx --port=80 --type=NodePort $ kubectl get pod,svc访问地址:http://NodeIP:Port4.5 部署 K8s dashboardkubernetes/dashboard =》https://github.com/kubernetes/dashboard执行命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml以上方式启动 dashboard 访问会不太方便,只能在集群内部(cluster-ip)访问,可修改 yaml 中的 service 暴露端口方式为 NodePort 类型,即可直接在浏览器中访问;$ vi recommended.yaml ... kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 17030 targetPort: 8443 type: NodePort externalIPs: - 192.168.0.168 selector: k8s-app: kubernetes-dashboard ... $ kubectl apply -f recommended.yaml $ kubectl get pods -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-6b4884c9d5-gl8nr 1/1 Running 0 13m kubernetes-dashboard-7f99b75bf4-89cds 1/1 Running 0 13m执行上面命令可能出现网络原因访问不起,可以 github 直接下载相应 yaml 文件设置;在需要部署的节点中安装文件传输工具:$ sudo apt install lrzsz # 安装 rz 工具 $ rz # 选择上传的文件此时查看当前列表=》【ls】此处 dashboard 本人是安装在 master 节点,安装信息如下:访问地址:https://NodeIP:30001创建 service account 并绑定默认 cluster-admin 管理员集群角色:# 创建用户 $ kubectl create serviceaccount dashboard-admin -n kube-system # 用户授权 $ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin # 获取用户Token $ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')使用输出的 token 登录 Dashboard。4.6 安装 Ingress此处我们使用 NGINX ingress controller 方式安装,更多的安装方式查看=》(Ingress Controllers | Kubernetes,https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) ;K8s 官方支持和维护的是 GCE 和 NGINX 两种 Controller,执行如下命令:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml上面方式可能存在网络访问失败的情况,此处安装的是【ingress-nginx】版本【v0.30.0】,ingress-controller.yaml 文件已经下载好,rz 上传到 worker 节点,如下所示:最后我们来查看下 1 Master 架构的 3 node 集群情况, 显示信息如下:4.7 访问 Dashboard4.7.1 使用 kubectl proxy ;启动成功后,可在内网节点的浏览器中访问 =》http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/vmware 虚拟化节点访问 =》curl http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/4.7.2 使用 API Server如果 Kubernetes API 服务器是公开的并且可从外部访问,就可以用 API Server 来访问 =》https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/查看 yaml 文件对应的镜像版本cat kubernetes-dashboard.yaml|grep kubernetes-dashboard4.7.3 两种登录模式 Kubeconfig 和 Token;此处我使用的是 Token 方式登陆,获取 Token =》 输入以下命令来创建用户 token,利用 token 来登录 dashboard:kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
文章
Kubernetes  ·  网络协议  ·  Ubuntu  ·  安全  ·  Linux  ·  网络安全  ·  API  ·  Docker  ·  容器  ·  Perl
2023-02-28
【Docker系列】如何部署Docker并进行小优化(内含一键安装脚本)
一、docker安装步骤详解docker初期版本是1.13(同一版本,开源)——>分类型 1.15 - 1.17 过程中分成两种。①开源社区 docker-ce②企业版 docker-ee今天我们学习安装的是开源版以下是整体操作目前 Docker 只能支持 64 位系统。 1.#关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 2.#安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 -------------------------------------------------------------------------------- #yum-utils:提供了 yum-config-manager 工具。 #device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 #device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。 -------------------------------------------------------------------------------- 3.#设置阿里云镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 4.#安装 Docker-CE 社区版并设置为开机自动启动 yum install -y docker-ce systemctl start docker.service systemctl enable docker.service 5.#查看 docker 版本信息 docker version 1.1关闭防火墙systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 ## 关闭防火墙和增强机制1.2安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2 -------------------------------------------------------------------------------- #yum-utils:提供了 yum-config-manager 工具。 #device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 #device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。 --------------------------------------------------------------------------------1.3设置阿里云镜像源cd /etc/ yum.repos.d/ ##切换路径到yum源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ## 添加安装路径 1.4安装 Docker-CE并设置为开机自动启动yum install -y docker-ce ##安装社区版 systemctl start docker.service systemctl enable docker.service ##开启Docker服务并设置开机自启 1.5查看 docker 版本信息docker version 二、设置镜像加速(优化)可以设也可以不设到这里基本上Docker就已经安装完毕了申请加速器地址这里我们使用阿里云的镜像,加速镜像下载速度注册阿里云账号并登录三、网络优化vim /etc/sysctl.conf net.ipv4.ip_forward=1 #开启路由转发 sysctl -p #刷新 systemctl restart network ##重启网卡 systemctl restart docker ##重启docker 为什么要开启路由转发功能?开启路由转发 是让docker0能根据虚拟机ip为自己所有的docker容器分配虚拟ip四、docker-server端配置文件建议配置#在daemon. json文件中配置 { "graph":"/data/docker", #数据目录,数据存储位置 "storage-driver":"overlay2", #存储引擎,docker1.18以上版本默认使用overlay2存储引擎。早期的适合存储引擎使用的aufs "insecure-registries":["registry.access.redhat.com","quary.io"], #私有仓库 #"registry-mirrors": [ "https:/lq" ] #镜像加速,在这个下面添加 "bip":"172.137.20.1/24", #docker网络 "exec-opts":["native.cgroupdriver=systemd"], #启动时的额外参数,(是一种挂载驱动,k8s使用) "live-restore":true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行 } 以上是建议的配置项 docker的网络建议和宿主机的IP"对照" 比如宿主机10.2.5.6 容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点的位置 systemctl daemon-reload #重载守护进程 systemctl restart docker #重载引擎 { "graph":"/data/docker", "storage-driver":"overlay2", "insecure-registries":["registry.access.redhat.com","quary.io"], "bip":"172.137.20.1/24", "exec-opts":["native.cgroupdriver=systemd"], "live-restore":true } systemctl daemon-reload systemctl restart docker五、总结本章主要是学习如何安装docker以及进行一些简单的优化六、 一键安装 docker 的 shell 脚本 _6.1创建 shell 脚本touch install_docker.shchmod 777 install_docker.sh6.2一键安装 docker 的 shell 脚本yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine echo -e " =========== 1.delete exist docker ================\n\n" echo -e "step 1: 安装必要的一些系统工具" sudo yum install -y yum-utils device-mapper-persistent-data lvm2 echo -e "\n\nStep 2: 添加软件源信息,国内 Repository 更加稳定" sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo version=sudo cat /etc/redhat-release|sed -r 's/.* ([0-9]+)\..*/\1/' if $version=7; then echo -e "\n\nStep 3: 更新 Centos version is : $version; run yum makecache fast" sudo yum makecache fast elif $version=8; then echo -e "\n\nStep 3: 更新Centos version is : $version; run yum makecache fast" sudo dnf makecache fi echo -e "=========== 2.完成配置 docker Repository ================\n\n" # 安装最新版本的 Docker Engine 和 Container sudo yum install docker-ce docker-ce-cli containerd.io sudo yum -y install docker-ce echo -e "=========== 3.成功安装完 docker ================\n\n" sudo systemctl enable docker sudo systemctl start docker echo -e "=========== 4.自启动 docker ================\n\n" # 1.创建一个目录 sudo mkdir -p /etc/docker # 2.编写配置文件 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn", "https://reg-mirror.qiniu.com", "http://f1361db2.m.daocloud.io" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker echo -e "=========== 5.配置国内镜像加速 ================\n\n" docker ps -a现在常用 centos 7、8,所以仅适配这两个系统安装 docker,自己实操过暂时没有问题希望有大神可以迷津指点
文章
Shell  ·  Linux  ·  网络安全  ·  Docker  ·  容器
2023-02-22
Docker官方文档学习笔记(二):Docker Desktop入门
参考官方文档Get started下载并启动教程镜像先启动Docker Desktop,然后打开终端,输入命令:docker run -d -p 80:80 docker/getting-started参数说明:-d 以分离模式(detached mode)运行容器(即后台运行容器)-p 80:80 将主机的80端口映射到容器的80端口docker/getting-started 要使用的容器的名称第一次输入的时候,提示未运行docker daemon,启动docker desktop之后,第二次运行成功多个单字符的参数可以合并,例如将-d -p 80:80简化为-dp 80:80docker run -dp 80:80 docker/getting-started容器运行后,通过浏览器打开http://localhost即可看到官方教程Docker Dashboard(Docker仪表板)使用Docker Dashboard可以方便地管理容器,如图所示(docker会给容器随机生成一个名称)体验示例APP在本教程的剩余部分,将通过运行一个Node.js的应用程序示例来演示docker如何使用下载APP代码可以下载app文件夹的压缩包或将整个仓库克隆下来,文件夹内有一个json和两个子文件夹创建APP的容器镜像Dockerfile是一个基于文本的用于创建容器镜像的脚本文件在package.json所在文件夹下(package.json的同级位置)创建一个名为“Dockerfile”的文件,内容如下# syntax=docker/dockerfile:1 FROM node:12-alpine RUN apk add --no-cache python2 g++ make WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"] EXPOSE 3000在文件夹下打开终端,使用docker build命令创建容器镜像docker build -t getting-started .此时会发现正在下载很多“layers”,这是因为在脚本中写了FROM node:12-alpine来表示镜像需要从这个镜像开始构建,而电脑里没有这些镜像,所以需要下载。下载好后,通过yarn命令将app的依赖下载下来。-t后跟参数getting-started表示将这个镜像命名为getting-started最后的“.”表示docker build命令应该在当前目录下查找Dockerfile不使用代理的话,下载起来可能会很慢,两种办法,换源或者使用代理若使用代理,则方法一:在运行命令的时候添加参数(不能为127.0.0.1,因为docker会使用自己创建的网卡,所以需要将代理地址改为本机ip,然后在代理软件里设置监听地址为0.0.0.0,Ubuntu软件商店的Electron不能设置监听地址,可以使用商店里的Qv2ray):--build-arg http_proxy=http://192.168.66.23:1080 --build-arg https_proxy=http://192.168.66.23:1080方法二:在~/.docker/config.json中添加"proxies": { "default": { "httpProxy": "http://192.168.66.23:1080", "httpsProxy": "http://192.168.66.23:1080", "noProxy": "localhost" } },如图所示运行的时候不需要加参数,docker会自动配置容器的代理- 方法三:方法一适用于docker build命令,若docker run命令下载镜像时,在Docker Desktop的设置中设置代理即可若换源,则参考菜鸟教程启动APP容器使用docker run命令来启动docker run -dp 3000:3000 getting-started-d -p 这两个参数在上个博客中已经介绍过了,一个是后台运行,一个是指定端口映射。如果没有端口映射,就无法访问app。运行后,在浏览器中输入地址http://localhost:3000就可以看到app,界面如图所示在New Item栏输入内容,然后点击Add Item添加,可以看到已经加入了内容,点击左侧的方框可以标记内容,点击右侧的红色垃圾桶可以删除内容此时打开Docker DashBoard,可以看到正在运行的app容器接下来学习如何更新app并且用新的镜像来更新我们正在运行的app更新APP以将页面中的文字由No items yet! Add one above!更换为You have no todo items yet! Add one above!为例更新源代码在src/static/js/app.js文件中,将第56行的<p className="text-center">No items yet! Add one above!</p>改为<p className="text-center">You have no todo items yet! Add one above!</p>构建容器docker build -t getting-started .因为我使用了代理,所以添加了代理参数后的命令为docker build -t getting-started . --build-arg http_proxy=http://192.168.66.23:1080 --build-arg https_proxy=http://192.168.66.23:1080运行容器docker run -dp 3000:3000 getting-started会报错这是因为旧容器还在运行,占用了3000端口,要解决这个问题,需要删除旧容器删除旧容器要删除一个容器,首先需要停止运行这个容器。当它停止运行后,有两种方法删除旧容器,任选一个即可。方法一:使用命令删除容器使用docker ps命令获取容器的IDdocker ps使用docker stop命令停止容器docker stop 容器ID使用docker rm命令删除容器docker rm 容器ID可以将步骤2和3简化为一个步骤,即使用docker rm -f命令删除容器 docker rm -f 容器ID方法二:使用Docker Dashboard删除容器打开Dashboard,找到要删除的容器点击右侧的删除点击Delete Forever确认删除即可![在这里插入图片描述](https://img-blog.csdnimg.cn/929fe4fda68748898978550e6daace51.png#pic_center)启动刚才更新了APP的容器执行命令docker run -dp 3000:3000 getting-started刷新浏览器页面或重新打开http://localhost:3000/即可看到更新成功小结以上的更新APP的方法存在两个问题:更新完后所有的Item都丢失了,即原先的数据都丢失了。为了仅仅实现将这么小的一个改动部署,却执行了很多步。共享APPDocker Hub 是全世界最大的Docker容器镜像仓库和社区,如果没有账号的话,需要 注册Docker ID 才能登录初始化用户docker desktop使用 pass 存储gpg密钥,从Docker Dashboard或Docker menu登录Docker Hub前,必须初始化pass。生成gpg密钥后,就可以实现 docker login 的时候不输入密码,使用 Docker Hub生成的访问令牌 登录生成gpg密钥gpg --generate-key生成后将输出内容中的pub部分复制初始化passpass init 刚才复制的pub部分登录Docker Desktop或使用docker login命令登录即可,使用docker hub生成的访问令牌登录时,注意保管好令牌,因为生成之后只在生成完成的时候显示一次,登录的时候将输入的密码改为输入生成的令牌即可若要删除密钥,需要删除公钥和私钥,推荐使用系统应用程序菜单中自带的密码管理器# 删除私钥 gpg --delete-secret-keys 私钥 # 删除公钥 gpg --delete-keys 公钥若要删除pass中的密码信息pass rm gpg生成密钥时使用的邮箱创建一个仓库为了能够推送(push)镜像,首先需要在Docker Hub上创建一个仓库登录Docker Hub点击创建仓库按钮“Create a Repository”使用“getting-started”作为仓库名称,并且将可访问性设置为公开,然后点击创建按钮“Create”推送镜像打开命令行,输入仓库显示的推送命令docker push 用户名/getting-started例如用户名为docker,则推送命令为docker push docker/getting-started上面的推送命令会执行失败,这是因为这条命令会查找名为 docker/getting-started 的镜像,但是并没有找到。如果运行 docker image ls 命令,会发现列出的镜像里也没有这个镜像。(如果之前在 下载并启动教程镜像 这一部分中下载了教程镜像,则这个命令会开始执行,并且使用 docker image ls 命令会列出该镜像)使用命令登录 Docker Hubdocker login -u 用户名使用 docker tag 命令给getting-started镜像命名一个新名称docker tag getting-started 用户名/getting-started现在尝试重新推送镜像,如果是从 Docker Hub 复制的命令:docker push 用户名/getting-started:tagname那么现在不需要输入tagname部分,只需使用 1. 中的命令即可,因为并没有添加tagname。如果推送的时候不指定tag,Docker将使用名为latest的tag在新的实例上运行镜像打开 Play with Docker 并登录点击 ADD NEW INSTANCE 添加实例在右侧的终端中输入命令docker run -dp 3000:3000 你的用户名/getting-started点击右上角的open port输入3000,或点击3000按钮,即可看到更新的界面小结在这一部分中,我们学习了如何将镜像推送到仓库来分享我们的镜像,并在全新的实例中运行推送的最新镜像。接下来我们将学习如何在重启容器后还能保持数据。保留容器的数据(库)每次我们启动容器的时候,todo list中的数据就会被清除,为什么会是这种情况?让我们研究一下容器是如何工作的。容器的文件系统当一个容器运行的时候,它会使用一个镜像中的很多layers来作为它的文件系统。每个容器也有自己的“暂存空间”(scratch space)用于创建、升级、删除文件。任何改变都不会在别的容器中看到,及时它们使用的是相同的镜像。通过练习查看容器的文件系统我们将启动两个容器并各自创建一个文件。你将看到一个容器中创建的文件在另一个容器中无法使用。启动 ubuntu 镜像并把1~10000之间的一个随机数写入一个名为data.txt的文件docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"我们通过 && 以使用两个命令,第一个命令为生成随机数并写入data.txt中,第二个命令只是监视文件以保持容器运行(The second command is simply watching a file to keep the container running.)点击 open in terminal在打开的终端中输入以下命令以查看文件内容cat /data.txt如果想在自己的终端中运行命令,则使用以下命令(容器ID需要使用 docker ps 命令获取)docker exec 容器ID cat /data.txt![在这里插入图片描述](https://img-blog.csdnimg.cn/1637ca285d754d2fbfed77e311631579.png#pic_center)同样可以看到生成的随机数使用以下命令删除刚才的容器docker rm -f 容器ID容器卷(Container volumes)在先前的实验中,我们看到每个容器每次启动时都从镜像定义开始(we saw that each container starts from the image definition each time it starts)。尽管容器可以创建、更新和删除文件,这些变动都会在容器删除时丢失并且容器间所有的改变都是独立的。使用卷,我们可以改变这些情况。卷为容器提供了连接主机的特定路径下的文件系统的能力(Volumes provide the ability to connect specific filesystem paths of the container back to the host machine.)。如果容器中的一个目录被挂载,这个目录中的变动就可以被主机看到。如果我们跨容器重新启动装载相同的目录,我们将看到相同的文件(If we mount that same directory across container restarts, we’d see the same files.)。卷主要有两种类型。这两种类型我们最后都会使用,但是开始的时候会用命名卷(named volumes)。使用命名卷(named volume)保留todo数据todo app默认将它的数据使用 SQLite Database 存储在容器的文件系统内的 /etc/todos/todo.db 下。这是一种简单的关系型数据库,所有的数据都存在一个文件中,稍后我们将讨论如何将其切换到其他数据库引擎。使用 docker volume create 命令创建一个卷docker volume create todo-db在Docker Dashboard中停止并删除todo app容器(或使用 docker rm -f 命令)启动todo app容器,但在启动时加入 -v 参数来指定要挂载的卷。我们将使用命名卷并将它挂载到 /etc/todos 。docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started容器启动后,打开app并在todo list中添加一些项目重复步骤 2. ,删除容器重复步骤 3. ,启动一个新的容器打开app,你会发现你在上个app容器添加的项目还在进一步了解卷使用 docker volume inspect 命令查看卷docker volume inspect todo-dbMountpoint 是数据实际存储的位置小结现在,我们有了一个可以在重启之后继续运行的应用程序!然而在之前的步骤中我们看到,对于每个变动,都需要花费相当一部分时间重新构建镜像以使得变动生效。有一个更好的办法来使这些变动生效,那就是绑定挂载。使用绑定挂载(bind mounts)在之前的章节中,我们讲解了使用命名卷(named volume)来保留我们数据库中的数据。如果我们只是简单地存储数据,命名卷会非常好用,因为我们不必担心数据存放的具体位置。使用绑定挂载,我们可以在主机上指定挂载点,我们可以用这个方法来存储数据,但是它经常用于向容器提供额外的数据。当容器工作时,我们可以使用绑定挂载来向容器挂载我们的源码以使得容器能看到代码的更改、响应并让我们立即看到更改。快速比较不同类型的卷之间的区别  命名卷(Named Volumes) 绑定挂载(Bind Mounts) 数据在主机中存放的位置 由Docker决定 由用户指定 挂载示例 (使用 -v) my-volume:/usr/local/data /path/to/data:/usr/local/data 用容器内容填充新卷(Populates new volume with container contents) 支持 不支持 支持卷驱动程序(Supports Volume Drivers) 支持 不支持 启动一个开发模式的容器为了使我们的容器支持开发流程,我们将执行以下步骤将我们的源码挂载到容器安装所有的依赖,包括“dev”依赖启动 nodemon 以监视文件更改确保你现在没有任何正在运行的 getting-started 容器在app所在目录下运行以下命令,在之后我们会解释这些命令对于Linux,运行docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ node:12-alpine \ sh -c "yarn install && yarn run dev"如果是在Windows,在PowerShell中运行以下命令docker run -dp 3000:3000 ` -w /app -v "$(pwd):/app" ` node:12-alpine ` sh -c "yarn install && yarn run dev"如果是在 Apple silicon Mac 或其他 ARM64 设备,运行以下命令docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ node:12-alpine \ sh -c "apk add --no-cache python2 g++ make && yarn install && yarn run dev"命令解释: -dp 3000:3000和之前一样,分离(后台)模式运行并创建一个端口的映射-w /app设置运行命令的“工作目录”或当前目录-v "$(pwd):/app"将当前目录挂载到容器的 /app 目录node:12-alpine要使用的镜像sh -c "yarn install && yarn run dev"在容器中要执行的命令。使用sh(alpine 没有bash)运行 yarn install 安装所有依赖,然后运行 yarn run dev。如果看一下 package.json 就会看到 dev 脚本是在启动 nodemon。使用 docker logs 命令查看输出日志。当你看到这种输出时就可以知道你可以继续接下来的步骤了docker logs -f 容器ID如果要关闭查看,按下 Ctrl+C 即可退出既可以使用docker ps命令查看正在运行的容器的信息,也可以使用 docker container ls 列出所有容器的信息(docker image ls 是列出所有镜像)现在对app进行修改。在 src/static/js/app.js 文件中,将109行的 “Add Item”改为“Add”只需要刷新app页面(或重新打开)就可以立即看到改动。可能需要等待node服务器重启,所以如果页面报错,等待一会然后再刷新,当使用步骤 3. 看到如下输出时,说明成功启动在后面的教程中我们会介绍 Docker Compose ,这会简化我们的命令(我们已经使用了很多参数了,例如-dp -v -t等)小结通过使用绑定挂载,我们可以快速响应需求并发布更改。在接下来的教程中,将会介绍如何在容器中使用MySQL来代替SQLite,并使多个容器互相通信。多容器的APP目前为止,我们已经能够使用单个容器运行app。但是现在需要向app添加MySQL,那么就会出现接下来的问题——“MySQL应该在哪运行?是安装在app所在的容器中并运行吗?”总的来说,每个容器应该只能做一件事并做好,理由如下:很有可能您必须以不同于数据库的方式扩展API和前端(There’s a good chance you’d have to scale APIs and front-ends differently than databases)单独的容器允许您独立地进行版本和更新(Separate containers let you version and update versions in isolation)虽然您可以在本地为数据库使用容器,但您可能希望在生产中为数据库使用托管服务。那么,你不想在应用程序中附带数据库引擎。(While you may use a container for the database locally, you may want to use a managed service for the database in production. You don’t want to ship your database engine with your app then.)运行多个进程将需要一个进程管理器(容器只启动一个进程),这会增加容器启动/关闭的复杂性(Running multiple processes will require a process manager (the container only starts one process), which adds complexity to container startup/shutdown)app的架构将升级如下容器网络容器默认情况下是独立运行的,不知道运行在同一机器上的其他进程或容器的任何信息。在同一网络下的两个容器可以互相通信。启动MySQL有两种让容器联网的方法:启动时分配连接现有容器现在我们将创建一个网络并在MySQL容器启动时连接创建网络docker network create todo-app启动MySQL容器并连接创建的网络。同时还会设置一些环境变量以供数据库初始化自己时使用(详情见官方文档的“Environment Variables”)Linux系统使用以下命令docker run -d \ --network todo-app --network-alias mysql \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:5.7 如果是基于ARM的芯片,比如M1,使用以下命令 ```bash docker run -d \ --network todo-app --network-alias mysql \ --platform "linux/amd64" \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:5.7 ``` 如果是Windows,在PowerShell中使用以下命令 ```bash docker run -d ` --network todo-app --network-alias mysql ` -v todo-mysql-data:/var/lib/mysql ` -e MYSQL_ROOT_PASSWORD=secret ` -e MYSQL_DATABASE=todos ` mysql:5.7 ``` 我们指定了--network-alias参数,一会我们会回过头来讨论这个。 我们正在使用挂载在存放MySQL数据的 /var/lib/mysql 下的名为 todo-mysql-data 的卷。然而我们从未使用 docker volume create 命令。Docker会识别我们想要的命名卷的名称并自动为我们创建这个卷。 为了确认我们已经启动了数据库,使用以下命令连接数据库docker exec -it MySQL容器的ID mysql -u root -p输入密码时,输入secret在MySQL Shell中,列出数据库并确认你看到了 todos 数据库SHOW DATABASES;你应该看到类似这种的输出连接MySQL使用 nicolaka/netshoot 容器(附带有许多工具,对于解决或调试网络问题非常有用)新建一个使用 nicolaka/netshoot 的容器,确保它连接到和MySQL容器相同的网络docker run -it --network todo-app nicolaka/netshoot在容器中,使用 dig 命令,这是一个很有用的DNS工具dig mysql会看到类似如下的输出在“ANSWER SECTION”中,你会看到MySQL有一个记录 A 解析172.18.0.2。虽然mysql通常不是有效的主机名,但Docker能够将其解析为具有该网络别名的容器的IP地址(因为之前使用了--network alias参数)。这意味着我们的app只需要连接到名为mysql的主机就可以和数据库通信了。使用MySQL运行apptodo app支持使用以下环境变量来设置MySQL的连接:MYSQL_HOST运行MySQL服务器的主机名MYSQL_USER连接MySQL使用的用户名MYSQL_PASSWORD连接MySQL使用的密码MYSQL_DB要使用的数据库的名称注意:对于8.0及以上版本的MySQL,确保在mysql中运行以下命令(Note: for MySQL versions 8.0 and higher, make sure to include the following commands in mysql)ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'secret'; flush privileges;设置上面的每一个环境变量,并将容器连接到app网络(同样在app所在目录下执行)Linux系统运行以下命令docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ --network todo-app \ -e MYSQL_HOST=mysql \ -e MYSQL_USER=root \ -e MYSQL_PASSWORD=secret \ -e MYSQL_DB=todos \ node:12-alpine \ sh -c "yarn install && yarn run dev"如果使用的Windows,在PowerShell中运行以下命令docker run -dp 3000:3000 ` -w /app -v "$(pwd):/app" ` --network todo-app ` -e MYSQL_HOST=mysql ` -e MYSQL_USER=root ` -e MYSQL_PASSWORD=secret ` -e MYSQL_DB=todos ` node:12-alpine ` sh -c "yarn install && yarn run dev"使用 docker logs 容器ID 命令会看到类似如下的输出打开app,添加一些item连接数据库,密码secretdocker exec -it MySQL容器ID mysql -p todos然后在mysql shell中输入以下命令select * from todo_items;可以看到以下输出打开Docker DashBoard,可以看到这两个容器都在运行,但没有迹象表明它们在一个应用程序中组合在一起,接下来就会介绍如何使用 Docker Compose 改善这种情况。小结在这部分教程中,我们实现了一个将数据存储在另一个容器中的应用程序。我们学习了一点关于容器网络的内容并看到了如何使用DNS执行服务发现。在下一个教程中,我们将介绍 Docker Compose。通过 Docker Compose 可以以一种非常容易的方式将我们的应用程序分享出去,并且其他人只需要一个命令就能启动它们。使用Docker ComposeDocker Compose 是一个用于帮助定义并分享多容器应用程序的工具。使用Compose,我们可以创建一个YAML文件来定义服务,并且只需一个命令就能启用或关闭它们的每一个。使用Compose最大的优点就是你可以在一个文件中定义你的应用程序栈,将这个文件放在你的项目仓库的根目录。其他用户只需要clone你的仓库并启动compose程序就可以使用。安装Docker Compose按照官方文档的说法,如果你在Windows或Mac上安装了 Docker Desktop 或 Docker Toolbox ,你就已经有了 Docker Compose 。 Play-with-Docker 实例同样已经安装了 Docker Compose 。如果你使用的是Linux设备,你需要安装 Docker Compose 实际上,Linux上如果安装了Docker Desktop也不需要再手动安装 Docker Compose。文档中给的查看是否安装的命令是docker-compose version但经过实际测试,命令为docker compose version创建Compose文件在app项目的根目录,创建一个名为 docker-compose.yml的文件在Compose文件中,我们将从定义模式版本开始。在大部分情况下,最好使用最新版本。关于不同版本和兼容性的详细信息参见官方文档 compose-versioningversion: "3.7"下一步,我们将定义作为应用程序的一部分运行的服务(或容器)列表version: "3.7" services:定义应用程序服务这是我们之前定义容器的时候所用的命令Linux使用 docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ --network todo-app \ -e MYSQL_HOST=mysql \ -e MYSQL_USER=root \ -e MYSQL_PASSWORD=secret \ -e MYSQL_DB=todos \ node:12-alpine \ sh -c "yarn install && yarn run dev"Windows在PowerShell中使用docker run -dp 3000:3000 ` -w /app -v "$(pwd):/app" ` --network todo-app ` -e MYSQL_HOST=mysql ` -e MYSQL_USER=root ` -e MYSQL_PASSWORD=secret ` -e MYSQL_DB=todos ` node:12-alpine ` sh -c "yarn install && yarn run dev"首先,定义服务入口和容器的镜像。我们可以为服务选择任何名称,这个名称将自动成为网络的别名,这在定义我们的MySQL服务时会很有用。version: "3.7" services: app: image: node:12-alpine使用 command 定义要执行的命令version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev"使用 ports 定义端口映射version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000使用 working_dir 定义工作目录,使用 volumes 定义卷。卷的定义的写法有两种,长写法和短写法version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app使用 environment 定义环境变量version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos定义MySQL服务在之前的教程中使用以下命令运行容器Linux下使用 docker run -d \ --network todo-app --network-alias mysql \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:5.7Windows下在PowerShell中使用 docker run -d ` --network todo-app --network-alias mysql ` -v todo-mysql-data:/var/lib/mysql ` -e MYSQL_ROOT_PASSWORD=secret ` -e MYSQL_DATABASE=todos ` mysql:5.7定义名为 mysql 的服务,这样它就会自动获得网络别名。然后定义镜像。version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7接下来使用 volumes 定义卷映射,如果只是简单的提供卷的名称,则compose使用的是默认选项。定义更多内容参见Volume configuration referenceversion: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data:最后指定环境变量version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:现在,docker-compose.yml应该看起来是这样的version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:运行应用程序栈确保没有正在运行的其他容器使用 docker compose up 命令运行应用程序,-d 参数意为后台运行所有内容docker compose up -dDocker Compose 会自动为应用程序栈创建相应名称的网络(这就是为什么我们没有在compose文件中定义一个网络)现在通过 docker compose logs -f 命令查看日志,你将在一个流里面看到每个服务实时输出的日志,因为 -f 参数意为“follow”,所以会提供实时输出。docker compose logs -f如果要查看特定服务的输出,在 -f 后加上服务的名称即可在 Docker DashBoard 中查看应用程序栈可以看到有一个名为app的分组。默认情况下,docker-compose.yml所在的文件夹的名称(即项目名称)会作为分组名称。点击进入分组,里面所含的容器的名称也很有描述性,遵循<project-name>_<service-name>_<replica-number>即:项目名称_服务名称_副本编号 的命名方式。删除容器组(包含其中的容器)和网络使用 docker compose down 命令或点击 Docker Dashboard 中分组栏的垃圾桶图标来删除,默认情况下两种方式都不会删除创建的卷,如果需要删除相应的卷,在命令后加上 --volumes 参数或点击 Docker Dashboard 的 Volumes 栏找到卷并删除镜像构建最佳实践详细内容参见官方文档安全扫描构建镜像后,最好使用 docker scan命令扫描它以查找安全漏洞。Docker 与 Snyk 合作提供漏洞扫描服务。需要使用 docker scan --login 登录后才能使用扫描。扫描结果的输出会列出漏洞的类型、了解更多信息的 URL,以及重要的是相关库的哪个版本修复了漏洞。查看镜像层(layer)使用 docker image history 可以查看用于在镜像中创建每个镜像层的命令,添加 --no-trunc 参数可以获得完整输出,例如docker image history --no-trunc getting-started镜像层缓存使用缓存可以减少容器构建时间。因为一旦某个层发生变化,所有的下层也会被重新构建。回顾之前为getting-started创建的Dockerfile# syntax=docker/dockerfile:1 FROM node:12-alpine RUN apk add --no-cache python2 g++ make WORKDIR /app COPY . . RUN yarn install --production CMD ["node", "src/index.js"] EXPOSE 3000再回想 docker image history 的输出,可以看到Dockerfile中的每个命令最后都成了镜像的一层。你可能还记得每次我们向镜像中做出变动,yarn的依赖就会被重新安装一次。为了解决这个问题,我们需要重构我们的Dockerfile以便支持缓存依赖。对于基于node应用程序,这些依赖都位于package.json中。首先将package.json复制进Dockerfile,然后再复制剩下的所有内容# syntax=docker/dockerfile:1 FROM node:12-alpine RUN apk add --no-cache python2 g++ make WORKDIR /app COPY package.json yarn.lock ./ RUN yarn install --production COPY . . CMD ["node", "src/index.js"] EXPOSE 3000在Dockerfile所在目录下创建一个 .dockerignore 文件,写入以下内容node_modules使用 docker build 命令构建镜像docker build -t getting-started .现在改变 src/static/index.html 中的内容(比如将 \<title> 中的内容改为“The Awesome Todo App”)重复步骤 3. ,你将看到类似这种的输出多阶段构建Maven/Tomcat 示例在构建基于 Java 的应用程序时,需要一个 JDK 来将源代码编译为 Java 字节码。但是,生产中不需要 JDK。此外,您可能正在使用 Maven 或 Gradle 等工具来帮助构建应用程序。在我们的最终镜像中也不需要这些。多阶段构建可以帮助解决这个问题。# syntax=docker/dockerfile:1 FROM maven AS build WORKDIR /app COPY . . RUN mvn package FROM tomcat COPY --from=build /app/target/file.war /usr/local/tomcat/webapps 在此示例中,我们使用一个阶段(称为build)来使用 Maven 执行实际的 Java 构建。在第二阶段(从 FROM tomcat 开始),我们从 build 阶段复制文件。最终镜像只在最后阶段构建(可以使用 --target 标志覆盖)。React 示例在构建 React 应用程序时,我们需要一个 Node 环境来将 JS 代码(通常是 JSX)、SASS 样式表等编译成静态 HTML、JS 和 CSS。如果我们不进行服务器端渲染,我们甚至不需要 Node 环境来进行生产构建。为什么不在静态 nginx 容器中发送静态资源?# syntax=docker/dockerfile:1 FROM node:12 AS build WORKDIR /app COPY package* yarn.lock ./ RUN yarn install COPY public ./public COPY src ./src RUN yarn run build FROM nginx:alpine COPY --from=build /app/build /usr/share/nginx/html在这里,我们用了 node:12 镜像来构建(最大化层缓存),然后将输出复制到Nginx容器中回顾通过简单了解镜像的结构,我们可以更快地构建镜像并减少更改。扫描镜像让我们确保我们正在运行和分享的容器是安全的。多阶段构建还能通过将构建时依赖项与运行时依赖项分开,帮助我们减少整体镜像大小并提高最终容器的安全性。
文章
存储  ·  资源调度  ·  关系型数据库  ·  MySQL  ·  Java  ·  Linux  ·  数据库  ·  数据安全/隐私保护  ·  Docker  ·  容器
2023-01-02
降价背后,函数计算规格自主选配功能揭秘
在刚刚结束的 2022 杭州 · 云栖大会上,阿里云宣布函数计算 FC 开启全面降价,vCPU 单价降幅 11%,其他的各个独立计费项最高降幅达 37.5%。函数计算 FC 全面降价,让 Serverless 更加普惠,用户可随用随取,按量计费,用更低成本采用 Serverless 架构,但是函数计算 FC 究竟在技术上作出怎样的升级才促成本次降价发生呢?本文将全面揭秘幕后关键技术——函数规格自主选配功能。痛点:规格灵活度低,成本浪费随着越来越多用户逐步将更多样化的负载部署至函数计算,比如 CPU 密集型,IO 密集型等,这些负载中有的需要更大的磁盘,但函数计算却只提供了按照内存大小等比例分配算力的能力,此时为了满足需求最大的一项,用户需要设置比实际所需更大的规格,这并不利于更精确的控制成本。但由于可选的规格方案数量较少,加上较大的梯度,进一步削弱了灵活性。为解决以上痛点,函数计算提供了规格自主选配功能,不仅放开了 CPU 和内存固定比例的限制,同时提供极小的梯度,精确地设置函数规格,让函数需要多少用多少,提升资源利用率的同时,降低用户成本。规格自选功能如何帮助降低用户成本?接下来以具体案例进行展示,让大家直观地了解函数规则自主选配功能的优势。贴合实际资源用量的函数规格下图展示了函数运行期间 vCPU 和内存的使用情况,该函数的 vCPU 用量一直低于1.5核,内存用量低于 6GB,资源浪费明显,用户需要为没使用到的资源付费。在推出自主选配功能前,函数计算提供的内存规格有 4GB、8GB、16GB、32GB。由于该函数内存最大使用量超过 5GB,为确保函数正常执行,只能配置内存为 8GB,该内存对应的 vCPU 规格为 4核。现在,我们可以将函数规格调整为 1.5核 vCPU 和 6GB 内存,显著提升资源利用率的同时,成本也降低到了原来的 44%。调整前:4核 8GB规格的函数,每秒费用是 4核*0.000127元/(核*秒) + 8GB*0.0000127元/(GB*秒) = 0.0006096元调整后:1.5核 6GB规格的函数,每秒费用是1.5核*0.000127元/(核*秒)+6GB*0.0000127元/(GB*秒)=0.0002662元tips:观察监控指标页面的实例指标,如果函数不能充分利用vCPU或内存资源,考虑调整函数规格以降低成本。更细粒度 GPU 算力在一些算法场景下,我们将模型部署到云上提供在线推理服务,假设模型需要使用 1.8GB 的显存,如果采用传统方案,购买配备 GPU 资源的云服务器,最低显存是 8GB,运行单个在线推理服务时,GPU 利用率低于 25%,存在巨大的浪费。即使通过单机运行多个在线推理服务来提高利用率,但需要额外开发请求调度功能、平衡其他类型资源的分配,增加开发和运维的复杂性,并且弹性能力几乎为 0。相比于持有整张GPU卡,使用函数计算可以仅为函数分配 2GB 的显存,实现对资源利用率极致压榨的同时,也收获了强大的弹性能力,节省资源成本和运维成本。立即体验规格自主选配功能现已对所有用户开放,您可以在函数计算控制台的函数配置页面修改 CPU、内存、磁盘和 GPU资源的规格,但需满足如下具体规则如下:vCPU:在0.05核到16核 的范围内,且是 0.05 核的倍数内存:在 128MB 到 32GB 的范围内,且是 64MB 的倍数GPU:在 2GB 到 16GB 的范围内,且是 1GB 的倍数磁盘:提供了 512 MB 和 10GB 两种规格,函数计算为每个实例提供512MB的免费磁盘空间如果您使用 Serverless Devs 工具,可以通过配置 function 字段的 memorySize、cpu 和 diskSize 属性实现相同的效果,其中 memorySize 和 diskSize 的单位为 MB,cpu 单位为核数。实现技术揭秘从上文介绍的案例,可以感受到该功能的实用性和价值,而且这并不是一个复杂的功能,但为什么现在才推出呢?要回答这个问题,我们需要了解函数计算资源管理系统的工作原理。高密部署过去,函数计算使用 Docker 创建容器作为函数的运行环境,为了保证多租环境下的安全,为每个用户分配独立的虚拟机,即使只需要运行1个 128MB 的小函数,也需要分配一台 2核4G 的虚拟机,平台承担了资源浪费。由于虚拟机的规格都是固定的,为了提高平台的资源利用率,在设置函数规格时,只允许设置内存大小,并且 CPU 与内存的比例与虚拟机规格相近。现在,函数计算在弹性裸金属服务器上通过安全容器运行用户的函数,单机运行 2000+函数实例,实现高密部署,降低平台成本。调度优化实现了高密部署后,还不能直接提供自主选配功能,因为这个功能会导致函数的规格种类呈现多样化,各种可能的配比会增加函数计算的调度复杂性,降低平台资源利用率。例如一台裸金属服务器上运行了少数函数实例后,就将CPU打满,而内存利用率仍在较低水位,但此时已经无法在该机器上创建新的函数实例。对于这个问题,函数计算对函数进行资源画像,统计函数对每种资源的使用情况,在调度函数实例时,选择最有利于资源互补的机器创建实例。基于多年来的技术沉淀和高效的调度策略,函数计算不断提高资源池利用率,这也让我们敢于提供自主选配功能,为用户提供更灵活的体验,更轻松地享受 Serverless 技术的红利。🌏更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。👉点击直达函数计算官网!
文章
运维  ·  监控  ·  安全  ·  算法  ·  Serverless  ·  调度  ·  异构计算  ·  Docker  ·  容器
2022-11-23
...
跳转至:
阿里云机器学习平台PAI
2304 人关注 | 150 讨论 | 320 内容
+ 订阅
  • 【DSW Gallery】基于MAE的自监督学习示例
  • 【DSW Gallery】基于Top Down的关键点检测示例
  • 【DSW Gallery】基于EasyCV的文字识别示例
查看更多 >
阿里云 Serverless
530 人关注 | 532 讨论 | 473 内容
+ 订阅
  • 阿里云函数计算助力高德 RTA 广告投放系统架构升级
  • 免费下载丨一看即会,Serverless 技术进阶必读百宝书
  • 体验有奖丨1 分钟 Serverless 部署 PHP 商城,赢取天猫超市卡
查看更多 >
PolarDB开源社区
976 人关注 | 272 讨论 | 192 内容
+ 订阅
  • 【活动回顾】PolarDB × ScaleFlux Meetup(杭州站)圆满落幕!
  • 实践教程之PolarDB-X replica原理和使用
  • 实践教程之用PolarDB-X搭建一个高可用系统
查看更多 >
云原生
234317 人关注 | 11556 讨论 | 47162 内容
+ 订阅
  • 软件工程高效学 | 软件工程基础
  • 【活动回顾】PolarDB × ScaleFlux Meetup(杭州站)圆满落幕!
  • Dragonfly 最新正式版本 v2.0.9 已经发布!
查看更多 >
开发与运维
5755 人关注 | 133133 讨论 | 317817 内容
+ 订阅
  • 「重启程序」的正面和反面
  • Hologres技术揭秘: JSON半结构化数据的极致分析性能
  • 阿里云实名认证api接口怎么调用
查看更多 >