• Docker 基本管理


    目录

    Docker 概述

    容器化越来越受欢迎,因为容器是:

    Docker与虚拟机的区别:

    容器技术有哪些

    容器在内核中支持2种重要技术:

      六大namespace

    Docker核心概念:


    你知道哪些云

     华为云 、百度云 、移动云、 天翼云 、西部数码云、谷歌云 、腾讯云、 阿里云、亚马逊云等等

    1.1国内云

    华为云、阿里云、腾讯云、天翼云(私有云) 

    1.2国外云

    谷歌云 、亚马逊

    二、Iaas、 Paas、SaaS三种云服务区别

    我们可以把云计算理解成一栋大楼,而这栋楼又可以分为顶楼、中间、低层三大块。那么我们就可以把Iass(基础设施)、Pass(平台)、Sass(软件)理解成这栋楼的三部分。基础设施在最下端,平台在中间,软件在顶端。别的一些“软”的层可以在这些层上面添加。

    2.1第一层叫做IaaS
    IaaS:Infrastructure-as-a-Service(基础设施即服务)

    举例:几年前如果你想在办公室或者公司的网站上运行一些企业应用,你需要去买服务器,或者别的高昂的硬件来控制本地应用,才能让你的业务正常运行。
    但现在可以租用IaaS公司提供的场外服务器,存储和网络硬件。这样一来,便大大的节省了维护成本和办公场地。

    2.2第二层就是所谓的PaaS
    PaaS:Platform-as-a-Service(平台即服务)

    举例: PaaS公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。这节省了你在硬件上的费用,也让分散的工作室之间的合作变得更加容易。网页应用管理,应用设计,应用虚拟主机,存储,安全以及应用开发协作工具等。

    2.3第三层也就是所谓SaaS
    SaaS:Software-as-a-Service(软件即服务)

    举例:生活中,几乎我们每一天都在接触SaaS云服务,比如:我们平时使用的苹果手机云服务,网页中的一些云服务等。

    虚拟化架构

    根据在整个系统中的位置不同,虚拟化架构分为以下几种:

    • 寄居虚拟化架构
    • 裸金属虚拟化架构
    • 操作系统虚拟化架构
    • 混合虚拟化架构

    3.1寄居架构

    本机(真实的操作系统)------>虚拟化产品------->虚拟化操作系统或软件

     

    寄居虚拟化架构指在宿主操作系统之上安装和运行虚拟化程序,依赖于宿主操作系统对设备的支持和物理资源的管理。

    3.2源生架构

    裸金属 服务器-------->虚拟化产品

     

    裸金属虚拟化架构指直接在硬件上面安装虚拟化软件,再在其上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理

    3.3操作系统虚拟化架构

     

    操作系统虚拟化架构在操作系统层面增加虚拟服务器功能。

    操作系统虚拟化架构把单个的操作系统划分为多个容器,使用容器管理器来进行管理。
    宿主操作系统负责在多个虚拟服务器(即容器)之间分配硬件资源,并且让这些服务器彼此独立。

    3.4混合虚拟化架构

     

    混合虚拟化架构将一个内核级驱动器插入到宿主操作系统内核。

    这个驱动器作为虚拟硬件管理器来协调虚拟机和宿主操作系统之间的硬件访问。

    四、虚拟化特点及优势

    分区:对物理机分区,可实现在单一物理机上同时运行多个虚拟机;
    隔离:同一物理机上多个虚拟机相互隔离;
    封装:整个虚拟机执行环境封装在独立文件中;
    独立:虚拟机无须修改,可运行在任何物理机上。

    五、虚拟化产品有哪些

    仿真虚拟化(对系统硬件没有要求,性能最低)
    半虚拟化 虚拟机 可以使用 真机物理机
    全虚拟化直接使用物理硬件,性能高
    ①vmware客户端
    VMware workstation 个人在windows安装的虚拟机
    vmware Fusion  MAC


    ②vmware  服务端   exis VM ware vsphere  裸金属 

    全虚拟化 直接使用物理硬件 ,性能高

    客户端连接 VM ware vsphere

    现企业 网页端连接 VM ware vsphere

    ③KVM/openstack(开发)  linux环境虚拟机  私有云环境 全虚拟

    KVM 基于内核的虚拟机主机

    ④半虚拟化  reh1 5 自带 xen(虚拟机监视器)   xen-Hypervisor 层

    微软 Microsoft Hyper-v 

    virtualBox 7.0虚拟盒子

    cirix Hypervisor

    重点

    ①KVM linux 内核 来完成的功能和性能
    ②ESXI 企业用的特别多 除了云,就是它

    Docker 概述


    Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
    Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
    Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。

     

     Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
    鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

     

     
    Docker的设计宗旨Build,Ship and Run Any App,Anywhere,
    即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
     

    容器化越来越受欢迎,因为容器是:

    ●灵活:即使是最复杂的应用也可以集装箱化。
    ●轻量级:容器利用并共享主机内核。
    ●可互换:可以即时部署更新和升级。
    ●便携式:可以在本地构建,部署到云,并在任何地方运行。
    ●可扩展:可以增加并自动分发容器副本。
    ●可堆叠:可以垂直和即时堆叠服务。
     

     容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
    虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

    Docker与虚拟机的区别:

    1、底层系统

    每个容器是共享宿主机的内核

    每个虚拟机拥有独立的操作系统和内核

    2、隔离性
    容器通过namespace做资源隔离,通过cgroup限制资源使用量比如cpu 内存 磁盘等;

    虚拟机之间完全隔离,每个虚拟机拥有独立的硬件资源

    3、启动速度
    容器是秒级启动

    虚拟机是分钟级启动

    4、计算能力消耗
    容器几乎没有性能损耗

    虚拟机是通过Hypervisor虚拟机管理程序对宿主机资源访问,通常由20%的性能损耗

    5、系统支持量
    一个宿主机可以支持上千个容器,但是最多只能支持几十个虚拟机

    6、性能
    容器接近原生,能够保证开发测试与生产环境一致

    特性                          Docker容器                               虚拟机
    启动速度                         秒级                                       分钟级
    计算能力损耗                 几乎无                         损耗 50%左右
    性能                              接近原生                                     弱于
    系统支持量(单机)        上千个                                 几十个
    隔离性                        资源隔离/限制                          完全隔离

     

    容器技术有哪些

    docker
    podman 与docker相似 OCI  redhat
    K8s
    container  docker核心组件之一
    LXC  linux 容器化技术

    crio: 轻量级  专门用于 k8s

    apche mesos  容器编排平台  
     

    容器在内核中支持2种重要技术:

    docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)表示在容器上面写入的数据相当于快照会同步写入到本地磁盘上。

      六大namespace

     

    namespace     系统调用参数                                        隔离内容
    UTS            CLONE_NEWUTS                                 主机名与域名
    IPC            CLONE_NEWWIPC                                 信号量、消息队列和共享内存
    PID            CLONE_NEWPID                                       进程编号                                    重点
    NETWORK        CLONE_NEWNET                 网络设备、网络栈、端口等                    重点
    MOUNT          CLONE_NEWNS                         挂载点(文件系统)                           
    USER           CLONE_NEWUSER                       用户和用户组(3.8以后的内核才支持〉
     

    Docker核心概念:


    ●镜像

    Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
    通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
    Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统(没有内核的操作系统)来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。

    ●容器
    Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
    可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。

    镜像 nginx  (run) 起来之后的一个实例,可以把容器看做时一个简易版的linux环境容器 就是集装箱(logo上的集装箱)

    ●仓库
    Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。

    Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 


    仓库就是放镜像的场所,做大的公开库 docker hub
     

     为什么要用到容器:

    安装 Docker-

    目前 Docker 只能支持 64 位系统 

     如何安装docker:
    1.yum安装

    2.在网上下载二进制文件下载

    3.如果没有网,则在有网的主机当中。下载rpm或者二进制包,随后通过文件传输的方式再上传到内网主机上面,再进行安装

    1. systemctl stop firewalld.service
    2. setenforce 0
    3. #安装依赖包
    4. yum install -y yum-utils device-mapper-persistent-data lvm2
    5. --------------------------------------------------------------------------------------------
    6. yum-utils:提供了 yum-config-manager 工具。
    7. device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
    8. device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
    9. --------------------------------------------------------------------------------------------
    10. #设置阿里云镜像源
    11. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    12. #安装 Docker-CE并设置为开机自动启动
    13. yum install -y docker-ce docker-ce-cli containerd.io 安装最新版本
    14. docker-ce-20.10.18
    15. systemctl start docker.service
    16. systemctl enable docker.service
    17. --------------------------------------------------------------------------------------------
    18. 安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
    19. --------------------------------------------------------------------------------------------

     

     

    安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。也可以远程通信
     

    查看 docker 版本信息
    docker version
     

     客户端与服务端的关系;客户端通过命令去发送给服务端,可以从仓库中拉去镜像,随后拉入到本地然后运行容器。

     docker 信息查看  详细查看
    docker info  

    客户端:

     

    服务端:

    Docker 镜像操作 

    搜索镜像
    格式:docker search 关键字
    docker search nginx

      

    获取镜像  nginx

    格式:docker pull 仓库名称[:标签]
    #如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest (最新版本)标签。
    docker pull nginx
     

    镜像加速下载

    1. 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
    2. mkdir -p /etc/docker
    3. tee /etc/docker/daemon.json <<-'EOF'
    4. {
    5.   "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]
    6. }
    7. EOF
    8. systemctl daemon-reload
    9. systemctl restart docker
    10.  

     

     查看镜像信息
    镜像下载后存放在 /var/lib/docker 。
    Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件

    查看下载的镜像文件信息
    cat /var/lib/docker/image/overlay2/repositories.json

    1. 查看下载到本地的所有镜像
    2. docker images
    3. REPOSITORY TAG IMAGE ID CREATED SIZE
    4. nginx latest ae2feff98a0c 9 days ago 133MB
    5. --------------------------------------------------------------------------------------------
    6. REPOSITORY:镜像属于的仓库;
    7. TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
    8. IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
    9. CREATED:镜像创建时间;
    10. VIRTUAL SIZE:镜像大小;

     

    根据镜像的唯一标识 ID 号,获取镜像详细信息
    格式:docker inspect 镜像ID号
    docker inspect ae2feff98a0c

     

     

    为本地的镜像添加新的标签
    格式:docker tag 名称:[标签] 新名称:[新标签]
    docker tag nginx:latest nginx:web (名称跟标签都可以修改)

     

     

    删除镜像
    格式:
    docker rmi 仓库名称:标签                #当一个镜像有多个标签时,只是删除其中指定的标签
    或者
    docker rmi 镜像ID号                        #会彻底删除该镜像

    注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

    docker rmi nginx:web

     

     镜像迁移到另一台主机

    1. #存出镜像:将镜像保存成为本地文件
    2. 格式:docker save -o 存储文件名 存储的镜像
    3. docker save -o http.tar httpd:latest #存出镜像命名为nginx存在当前目录下
    4. ls -lh
    5. #载入镜像:将镜像文件导入到镜像库中
    6. 格式:
    7. docker load < 存出的文件
    8. 或者
    9. docker load -i 存出的文件
    10. docker load < http.tar

    随后,切换到另外一台centos2 终端上

     

    镜像上传 

    1. #上传镜像
    2. 默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
    3. 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
    4. 在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
    5. docker tag soscscs/myapp:v1 longxiangc0123/sos0123:lxy #添加新的标签时必须在前面加上自己的dockerhub的username
    6. docker login #登录公共仓库
    7. Username:用户名
    8. password:密码
    9. docker push longxiangc0123/sos0123:lxy #上传镜像
    10. docker tag nginx:1.20 longxiangc0123/mynginx:lxy ##先修改tag标签
    11. docker push longxiangc0123/mynginx:lxy

    随后,去官网查看

    容器操作命令

    1、创建容器

    #容器创建:就是将镜像加载到容器的过程。
    新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

     

    1. 格式:docker create [选项] 镜像
    2. 常用选项:
    3. -i:让容器开启标准输入接受用户输入命令
    4. -t:让 Docker 分配一个伪终端 tty
    5. -it :合起来实现和容器交互的作用,运行一个交互式会话 shell
    6. docker create -it nginx:latest /bin/bash
    7. #查看容器的运行状态
    8. docker ps -a #-a 选项可以显示所有的容器
    9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    10. 8b0a7be0ff58 nginx:latest "/docker-entrypoint.…" 57 seconds ago Created inspiring_swanson
    11. 容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称

     

    启动容器

    格式:docker start 容器的ID/名称
    docker start 8b0a7be0ff58
    docker ps -a

     

     终止容器运行

    格式:docker stop 容器的ID/名称
    docker stop 2592d3fad0fb

    docker ps -a

     

    查看容器的运行状态 

    1. docker ps -a ##查看所有
    2. docker ps ##只看运行中的容器状态
    3. docker ps -a -q ##返回所有容器的id号

     

    容器的进入

    1. #容器的进入
    2. 需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
    3. 格式:docker exec -it 容器ID/名称 /bin/sh
    4. -i 选项表示让容器的输入保持打开;
    5. -t 选项表示让 Docker 分配一个伪终端。
    6. docker start 容器id #进入容器前,确保容器正在运行
    7. docker exec -it 容器id /bin/sh
    8. ls
    9. exit #退出容器后,容器仍在运行
    10. docker ps -a

     

    举例说明 test02 是关闭的  进入test02之前,要先开启

     

     

    怎么把宿主机的文件传入到容器内部

    1、linux 怎么复制
    cp 原文件路径目标文件路径
    docker cp l opt / abc容器id: /opt/abc


    2.复制到容器中
    echo abc123 > ~/test.txt
    docker cp ~/test.txt 2592d3fad0fb:/opt/

    #从容器复制文件到主机
    docker cp 2592d3fad0fb:/opt/test.txt ~/abc123.txt

    1. #复制到容器中
    2. [root@localhost opt]#docker cp /opt/test.txt 79720a19adea:/mnt/
    3. [root@localhost opt]#docker cp /opt/lxy/ 79720a19adea:/mnt/
    4. #从容器复制文件到主机
    5. [root@localhost opt]#docker cp 79720a19adea:/mnt/haha/ /opt

    从宿主机复制到容器当中:

    从容器复制到宿主机上面:

     

     

    创建并启动容器

    以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令
    注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出
    docker 容器默认会把容器内部第一个进程
    ,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉

     

    /var/lib/docker

    1.4.1当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
    (1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
    (2)利用镜像创建并启动一个容器;
    (3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
    (4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
    (5)分配一个地址池中的 IP 地址给容器;
    (6)执行用户指定的应用程序,执行完毕后容器被终止运行

     

     

    1. docker run -itd nginx:latest /bin/bash
    2. #-d选项,让程序再后台持续运行
    3. docker run centos:7 /usr/bin/bash -c ls -lh /
    4. #没有-d选项,执行完退出,-c选项可以将命令发送到容器中运行
    5. docker run -d centos:7 /bin/bash -c "while true;do echo ydq;done"
    6. #执行循环造成进程运行,但是会持续增加压力
    • -i:表示标准输入
    • -t:指定一个伪终端(环境)
    • -d:开启守护进程(后台运行)

     

     docker run centos:7 /usr/bin/bash -c ls /
    docker ps -a      #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

     

     docker ps -a      #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

     详细解释下哦

    在后台持续运行 docker run 创建的容器

    需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。

    并且容器所运行的程序不能结束

    while true死循环

     

     查看cpu

     

     停止容器

     

     创建容器并持续运行容器

     

    docker run -itd --name test1 centos:7 /bin/bash   #创建容器并持续运行容器

    批量删除容器 

    1. 格式:docker rm [-f] 容器ID/名称
    2. docker stop 08ec23f245f7
    3. docker rm 08ec23f245f7 #删除已经终止状态的容器
    4. docker rm -f 08ec23f245f7 #强制删除正在运行的容器
    5. docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash #批量停止容器
    6. docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
    7. docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash #批量删除所有容器
    8. docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
    9. docker images | awk 'NR>=2{print "docker rmi "$3}' | bash #批量删除镜像
    10. docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像
    11. docker rm $(docker ps -a -q) #批量清理后台停止的容器

     

    一般情况下,不建议使用rm -f 尽量把正在运行的容器,停止,随后再删除

     有个很重要的概念  容器的内容都是临时存放的,一旦关闭,那么就会永久删除,所以传输文件这个操作需要在容器为运行状态下完成 

     

    容器的迁移

    用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

    导入后为镜像,还需额外创建容器,需要注意的是创建容器的时候需要额外添加容器启动命令

    1. #导出格式:
    2. docker export 容器ID/名称 > 文件名
    3. docker export -o 文件名 容器ID/名称
    4. #导入格式:
    5. cat 文件名 | docker import – 镜像名称:标签
    6. docker import 文件名 -- 镜像名称:标签
    7. #导入后会生成镜像,但不会创建容器
    8. 需要重新创建容器并启动 要么docker create /docker start
    9. 要么docker run

    1、先在容器中创建测试文件

    2、将容器存储为一个镜像文件并传输给另一个主机

    3、接收文件 并导入镜像,创建容器并启动容器

    容器导出格式

    格式:docker export 容器ID/名称 > 文件名
    docker export 2592d3fad0fb > centos7.tar

      

     随后,去另外一台主机上面

    容器导入格式

    导入格式:cat 文件名 | docker import – 镜像名称:标签
    cat centos7.tar | docker import - centos7:test         #导入后会生成镜像,但不会创建容器

     

    docker容器生命周期

    docker容器七个状态

    cerated已创建 、还未运行的容器
    running:正在运行中的容器
    restarting:容器正在重启中
    removeing:容器正在迁移中
    paused:已暂停状态的容器
    exited:停止状态的容器
    dead 死亡 主要是操作系统出现异常 或 断点关机等有可能引发dead状态 ,但是 不是很常见
    暂停和停止状态的区别:

    paused 命令挂起指定的容器中的所有进程为暂停,
    stop:表示杀掉正在运行的docker容器进程,默认是10s后

     

  • 相关阅读:
    查找:顺序查找的实现以及相关优化
    统计信号处理基础 习题解答6-10
    公司里的VMware vSphere是用来干嘛的?—— vSphere服务器架构简单讲解
    Webpack性能优化 SplitChunksPlugin的使用详解
    【SQL】SQL语句执行顺序
    植物组织培养第五弹!worthington组织培养术语速速养成
    Ovalbumin-PEG-DMPE 鸡卵白蛋白-聚乙二醇-二肉豆蔻酰基磷脂酰乙醇胺,DMPE-OVA卵清蛋白
    CSDN每日一练 |『小桥流水人家』『争风吃醋的豚鼠』『寻因找祖』2023-10-17
    西门子PLC S7-1200如何实现远程上下载?
    组合总和 (递归回溯+剪枝)
  • 原文地址:https://blog.csdn.net/2301_81307988/article/details/138083555