docker入门(三)自定义部署docker镜像

docker系列d​​​​​​​docker入门(一)安装及镜像命令_docker国内源-CSDN博客文章浏览阅读1.5k次,点赞44次,收藏12次。注意:是强依赖Linux环境,即便在windows上部署Docker其本质也都是先安装一个虚拟机,然后在虚拟出来的Linux上再安装并运行Docker。Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它使用 YAML 文件来定义整个应用程序的服务、网络和卷等,使得可以轻松地部署和扩展多个 Docker 容器。Docker 容器是 Docker 镜像的实例化运行时,它是一个分离的环境,包含了应用程序和其依赖项,能够独立运行于 Docker 主机上。这是由于环境不一致导致的。_docker国内源https://blog.csdn.net/LCL_18/article/details/142632245?spm=1001.2014.3001.5501

docker入门(二)之容器命令及私有仓库的部署(本地和harbor)_桌面docker怎么使用命令保存仓库-CSDN博客文章浏览阅读1.3k次,点赞21次,收藏10次。所以我们大致应该能明白守护进程是给需要在后台默默执行的程序。如redis,如果不添加守护进程,ctrl+c,前台进程结束,容器就停止了,显然不能接受。通过下图可以看到redis开始在正常运行在前台,假如说我要执行其他程序,然后我ctrl+c退出了一下,redis就自动退出了查看容器的状态,发现也是退出了但是添加-d后,它会直接在后台运行,不会在前台占用资源。_桌面docker怎么使用命令保存仓库https://blog.csdn.net/LCL_18/article/details/142869622?spm=1001.2014.3001.5501

基于docker commit 制作镜像

众所周知,centos 7 在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一时之间无法完全更新替换操作系统,因此对于yum源还是需要的。

所以我们docker pull centos:7的镜像也是无法使用yum的。

这里我们就自己制作一个含有yum的镜像。

有两种方式搭建,一种搭建本地yum,一种拉取国内开源镜像站(这里以阿里云举例)

其一:搭建本地yum

大家都知道我们使用虚拟机时必须有相应的映像文件

这里面的镜像文件一般存放在/dev/cdrom

这里我们的先将镜像挂载到一个目录,这里我先选择挂载到/media下

[root@localhost ~]# mount /dev/cdrom /media/mount: /dev/sr0 写保护,将以只读方式挂载

然后拉取centos:7的镜像

[root@localhost ~]# docker pull centos:77: Pulling from library/centosDigest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4Status: Downloaded newer image for centos:7docker.io/library/centos:7

这里我拉取的镜像太多了,所以我只显示cnetos:7的这行,方便观察

centos                             7         eeb6ee3f44bd   3 years ago     204MB

使用此镜像,创建容器,并添加数据卷映射

宿主机目录必须使用挂载映像文件的目录

[root@localhost ~]# docker run -it --privileged=true -v /media:/media/centos eeb6ee3f44bd /bin/bash[root@197a502a5c1b /]#

这个时候宿主机media下的文件已经映射到容器/media/centos下

[root@197a502a5c1b /]# ls /media/centos/CentOS_BuildTag  EFI  EULA  GPL  LiveOS  Packages  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL  images  isolinux  repodata

这个时候进去修改yum本地源的配置文件

[root@197a502a5c1b /]# cat /etc/yum.repos.d/CentOS-Media.repo[c7-media]name=CentOS-$releasever - Mediabaseurl=file:///media/centosgpgcheck=0enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

使网络源失效

[

root@197a502a5c1b ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

清除缓存,重新加载

[root@197a502a5c1b ~]# yum clean all   Loaded plugins: fastestmirror, ovlCleaning repos: c7-mediaCleaning up list of fastest mirrors[root@197a502a5c1b ~]# yum repolist    Loaded plugins: fastestmirror, ovlDetermining fastest mirrorsc7-media                                                                                                                                                              | 3.6 kB  00:00:00    (1/2): c7-media/group_gz                                                                                                                                              | 166 kB  00:00:00    (2/2): c7-media/primary_db                                                                                                                                            | 3.1 MB  00:00:00    repo id                                                                                repo name                                                                                       statusc7-media                                                                               CentOS-7 - Media                                                                                3971repolist: 3971

其二:配置阿里云源

这里就接着上面继续配置

安装wget

[root@197a502a5c1b ~]# yum install -y wget

把网路源名称改回来

[root@197a502a5c1b ~]# mv /etc/yum.repos.d/CentOS-Base.repo.bak /etc/yum.repos.d/CentOS-Base.repo

取网上找到阿里云开源镜像网站

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区

使用wget把它下载到指定位置

​
[root@197a502a5c1b ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo​

清除缓存,重新加载

[root@197a502a5c1b ~]# yum clean all[root@197a502a5c1b ~]# yum repolistrepo id                                                                         repo name                                                                                              statusbase/7/x86_64                                                                   CentOS-7 - Base - mirrors.aliyun.com                                                                   10072c7-media                                                                        CentOS-7 - Media                                                                                        3971extras/7/x86_64                                                                 CentOS-7 - Extras - mirrors.aliyun.com                                                                   526updates/7/x86_64                                                                CentOS-7 - Updates - mirrors.aliyun.com                                                                 6173repolist: 20742

退出容器,把容器制成镜像

docker commit 的参数

Options:-a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")#表示作者名-c, --change list      Apply Dockerfile instruction to the created image# 对创建的镜像使用dockerfile命令-m, --message string   Commit message#描述信息-p, --pause            Pause container during commit (default true)#暂停容器做镜像[root@localhost ~]# docker commit -a "xiaoluo" -m "my yum" -p 197a502a5c1b mycentos:1sha256:9bbe687a6e89fbf654ed06d1c9c18301e370b741474b008c5447d337ff2c3ae6

查看镜像,这个镜像比我们直接拉取的镜像,大很多,为什仫呢,因为它具有配置的源,自然而然会使镜像变大

[root@localhost ~]# docker imagesREPOSITORY                         TAG       IMAGE ID       CREATED          SIZEmycentos                           1         9bbe687a6e89   39 seconds ago   479MB

测试

使用该镜像创建容器

[root@localhost ~]# docker run -it mycentos:1 /bin/bash[root@7cf0ea61ad7a /]#

查看仓库

[root@7cf0ea61ad7a /]# yum repolistLoaded plugins: fastestmirror, ovlLoading mirror speeds from cached hostfile* base: mirrors.aliyun.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.comrepo id                                                                         repo name                                                                                              status!base/7/x86_64                                                                  CentOS-7 - Base - mirrors.aliyun.com                                                                   10072!c7-media                                                                       CentOS-7 - Media                                                                                        3971!extras/7/x86_64                                                                CentOS-7 - Extras - mirrors.aliyun.com                                                                   526!updates/7/x86_64                                                               CentOS-7 - Updates - mirrors.aliyun.com                                                                 6173repolist: 20742

基于dockerfile制作镜像

DockerFile是用来构建Docker镜像的文本文件,是一条条构建镜像所需要的指令和参数构成的脚本

构建步骤:

1、编写DockerFile文件

2、docker build 构建镜像

DockerFile内容基础知识

  1. 每条保留指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上向下,顺序执行
  3. #表示注释
  4. 每个指令都会创建一个新的镜像层并且对于镜像进行提交

Docker执行DockerFile的大致流程

  1. Docker从基础镜像运行一个容器
  2. 每执行一条指令就会对于容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. Docker再基于刚提交的镜像运行一个新的容器
  5. 执行DockeFile 中的下一条指令直到所有指令都执行完成

指令介绍(就相当于命令)

FROM

功能为指定基础镜像,并且必须是第一条指令。

如果不以任何镜像为基础,那么写法为:FROM scratch。

同时意味着接下来所写的指令将作为镜像的第一层开始

这里简单做个废话说明:

所谓基础镜像就是指通过docker pull拉取的或者docker commit创建的镜像。再强调一下由于现在2024年10月22日,centos7从2024年6月30号已经停止维护yum源,所以我们得先去给容器配置yum源再将其打包为镜像。

格式:

FROM 镜像名:版本号版本号为可选项,没有默认为最新版本号

LABLE

原来是MAINTAINER这个根据英文意思可知,维护者不就是指定作者吗,但新版docker改为使用LABLE指明

但原本的功能为给镜像指定标签

此命令可选择性使用

格式:

LABLE 名字

ADD

一个复制命令,把文件复制到镜像中。如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。可以进行远程连接的命令

格式:

ADD 本地路径/网络路径 容器创建好后存放的位置

COPY

也是一条复制的命令就相当于linux中的cp命令,它与ADD的区别就在于COPY只能复制本地文件

格式:

COPY 本地路径 容器创建好后存放的位置

EXPOSE

功能为暴漏容器运行时的监听端口给外部

EXPOSE并不会使容器访问主机的端口,但是主机可以访问到容器的端口,这是一个单方面的指向

如果想使得容器与主机的端口有映射关系,必须在容器启动(docker run)的时候加上 -p参数

格式:

EXPOSE 端口号 协议类型不指定协议,默认为tcp协议

ENV

功能为设置环境变量,同docker run -e一样,镜像定义所需的环境变量,并可被ENV指令后面的其它指令所调用。

使用docker run启动容器的时候加上 -e 的参数为定义的变量赋值,可以覆盖Dockerfile中ENV指令指定的变量

格式:

#第一种格式,不建议使用,只能定义一个变量,在定义又得另起一个指令,浪费资源ENV 变量名 本地路径/值#第二种格式,可往后定义多个变量ENV 变量名=本地路径/值 ……

RUN

用于指定docker build过程中运行的程序,可以是任何命令。

RUN指令后所执行的命令必须在FROM指令后的基础镜像中存在才会被执行。

一般是执行shell命令

格式:

RUN  shell命令

CMD

指定启动容器的默认要运行的程序,也就是PID为1的进程命令,且其运行结束后,容器也会终止。如果不指定,默认是bash。

CMD指令指定的默认程序会被docker run命令行指定的参数所覆盖。

Dockerfile中可以存在多个CMD指令,但仅最后一个生效。因为一个docker容器只能运行一个PID为1的进程。

类似于RUN指令,也可以运行任意命令或程序,但是两者的运行时间点不同

RUN指令运行在docker build的过程中,而CMD指令运行在基于新镜像启动容器(docker run)时。

格式:

CMD shell命令

ENTRYPOINT

类似CMD指令的功能,用于为容器指定默认运行程序。

Dockerfile中可以存在多个ENTRYPOINT指令,但仅最后一个生效

与CMD区别在于,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当做参数传递给ENTRYPOINT指令指定的程序。

不过,docker run的–entrypoint选项的参数可覆盖ENTRYPOINT指定的默认程序。

格式:

ENTRYPOINT shell命令

USER

用于指定docker build过程中执行任何指令所用的用户

默认情况下为root用户

格式:

USER 用户名/用户id

这里的用户id是指/etc/passwd中用户的有效UID,不能随便指定,不然可能导致docker run 运行时失败

HEALTHCHECK

根据英文意思可知,为健康检查,此指令的就是告诉docker检查容器是否正常工作,因为有的时候就算进程在运行,服务也不一定能够起来

检查肯定不是一次性的,要根据频率,进行指定检查

格式:

HEALTHCHECK --interval=间隔时间 --timeout=超时时间 –retries=重试次数 cmd 健康检测命令

CMD健康检测命令发出时,返回值有三种情况
0:成功
1:不健康
2:保留,无实际意义。

HEALTHCHECK NONE就是不做健康检查

SHELL

用来指定运行程序默认要使用的shell类型,一般来说不用指定

格式:

SHELL shell类型

STOPSLGNAL

指定发送使容器退出的系统调用信号,docker stop之所以能停止容器,就是发送了15的信号给容器内PID为1的进程。但是一般不会使用。

格式:

STOPSLGNAL 指定的信号值

ARG

ARG命令同EVN类似,也是指定一个变量,但不同的是,ENV指令配合-e参数可以在docker run过程中传参,而使用ARG指令配合–build-arg参数可以在docker build过程中传参,这方便了我们为不同场景构建不同镜像。

格式:

ARG 变量名=本地路径/值 ……

ONBULD

用于在Dockerfile中定义一个触发器。

ONBUILD后面指定的指令在docker build时是不会执行,构建完的镜像在被另一个Dockerfile文件中FROM指令所引用的时才会触发执行。

除了FROM指令和MAINTAINER指令不能成为触发器指令,其他均可以,一般多为RUN和ADD

格式:

ONBULD 其他指令

实例构建nginx镜像

创建一个文件夹,用于存放Dockerfile文件

[root@localhost ~]# mkdir /nginx

在该目录下编辑一个安装nginx的脚本

[root@localhost nginx]# vi install.shyum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-develcd /usr/local/srcwget 'http://nginx.org/download/nginx-1.14.2.tar.gz'tar -zxf nginx-1.14.2.tar.gzcd nginx-1.14.2./configure --prefix=/usr/local/nginx && make && make installrm -rf /usr/local/src/*

在编辑一个启动脚本

[root@localhost nginx]# vi nginx_start.sh#!/bin/bash/usr/local/nginx/sbin/nginx -g "daemon off;"

在编辑一个Dockerfile文件

[root@localhost nginx]# vi Dockerfile# 使用的是前面是前面docker commit 创建的镜像FROM mycentos:1COPY install.sh /tmp/install.shRUN sh /tmp/install.shCOPY nginx_start.sh /usr/bin/nginx_start.sh

docker build的参数

-f  --file

 指定 dockerfile 路径

不指定的话,默认会读取上下文路径(  .  )下的 dockerfile

-t,--tag

指定构建的镜像名和 tag

--add-host

可以使用一个或多个 --add-host 标志将其他主机添加到容器的 /etc/hosts 文件中

--network

在构建过程中为 RUN 指令设置网络模式

创建mycentos:nginx这个镜像,根据当前所在位置决定写路径,如果Dockerfile文件就在当前目录下,就可以写 ./

[root@localhost nginx]# docker build -t mycentos:nginx ./

查看镜像

[root@localhost nginx]# docker images                                                                                                                                                       REPOSITORY                         TAG       IMAGE ID       CREATED          SIZEmycentos                           nginx     15ef5a937045   19 seconds ago   856MB

使用该镜像启动容器,看看是否启动了nginx服务

[root@localhost nginx]# docker run -itd --name=mynginx mycentos:nginxc6ed62b2b1fc6e5a018683b678c9026c7ebe85e3c62f44a7227cc0a74e98caeb

查看容器

[root@localhost nginx]# docker run -itd --name mynginx mycentos:nginx70e6515c92df549ab0398b4d8a981292b7d98723684aefff3775a5a4c3682d88[root@localhost nginx]# docker ps -aCONTAINER ID   IMAGE                                COMMAND                   CREATED         STATUS                           PORTS                                   NAMES70e6515c92df   mycentos:nginx                       "/bin/bash"               9 seconds ago   Up 8 seconds                                                             mynginx

进入该容器

[root@localhost nginx]# docker exec -it mynginx /bin/bash

启动nginx

[root@70e6515c92df /]# cd /usr/local/nginx/[root@70e6515c92df nginx]# lsclient_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp[root@70e6515c92df nginx]# cd sbin[root@70e6515c92df sbin]# lsnginx[root@70e6515c92df sbin]# ./nginx

查看是否开启80端口

[root@70e6515c92df ~]# netstat -ntlpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      37/nginx: master pr

最后希望大家都能变得越来越好!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3.x和OCR构建车牌识别系统

本专题旨在展示 OCR 技术与 SpringBoot3.x 框架结合的广泛应用。我们会深入探讨它在医疗、金融、教育、交通、零售、公安等多个领域的现实应用。每个应用场景都会提供详细的实例、面临问题的分析与解决策略&#xff0c;以帮助您深入理解 OCR 技术在实践中的关键作用。让我们一同…

糖果——差分约束 + 正环判定及其优化(手搓栈 + 标记法)

题目 思考 这里转为判定负环可以是可以&#xff0c;但是不能用超级源点了&#xff08;改为把节点全部压入&#xff09;&#xff0c;因为按照题目条件&#xff0c;建立的应该是各个节点指向超级源点的有向边&#xff0c;这显然破坏了超级源点的功能 代码 #include <bits/st…

【数据结构与算法】Java中的基本数据结构:数组、链表、树、图、散列表等。

探索Java集合框架&#xff1a;数据结构的精髓与应用 摘要&#xff1a; 在本文中&#xff0c;我们将深入探讨Java集合框架中的核心数据结构&#xff0c;包括数组、链表、树、图、散列表、栈、队列、集合、映射和优先队列。通过分析每种数据结构的实现原理和特点&#xff0c;你将…

ArcGIS002:软件自定义设置

摘要&#xff1a;本文详细介绍安装arcgis10.2后软件自定义设置内容&#xff0c;包括工具条的启用、扩展模块的启用、如何加载项管理器、快捷键设置、样式管理器的使用以及软件常规设置。 一、工具条的启用 依次点击菜单栏【自定义】->【工具条】&#xff0c;根据工作需求勾…

某ai gpt的bug

某ai gpt的bug 背景 遇到了一个奇怪的现象&#xff1a; 输入内容 2024-10-21 10:09:31,052 ERROR o.a.j.t.JMeterThread: Test failed! java.lang.IllegalArgumentException:输出结果

使用 PyTorch 构建 LSTM 股票价格预测模型

目录 引言准备工作1. 训练模型&#xff08;train.py&#xff09;2. 模型定义&#xff08;model.py&#xff09;3. 测试模型和可视化&#xff08;test.py&#xff09;使用说明模型调整结论 引言 在金融领域&#xff0c;股票价格预测是一个重要且具有挑战性的任务。随着深度学习…

即时通讯增加Redis渠道

情况说明 在本地和服务器分别启动im服务&#xff0c;当本地发送消息时&#xff0c;会发现服务器上并没有收到消息 初版im只支持单机版&#xff0c;不支持分布式的情况。此次针对该情况对项目进行优化,文档中贴出的代码非完整代码&#xff0c;可自行查看参考资料[2] 代码结构调…

电机PWM控制中的定时器配置与信号极性对电机转向的影响分析

文章目录 摘要关键词1. 引言2. PWM控制与定时器配置3. 实验与问题描述3.1 定时器配置代码分析3.2 问题分析 4. 解决方案5. 实验结果6. 结论 电机PWM控制中的定时器配置与信号极性对电机转向的影响分析 摘要 PWM&#xff08;脉宽调制&#xff09;信号是控制电机速度与方向的常…

Docker安装ocserv教程(效果极佳)

本章教程,介绍如何在Debain系统上安装ocserv。安装方式是使用Docker方式部署。 一、安装Docker curl -sSL https://file.ewbang.com/docker/debian/install_docker.sh -o install_docker.sh && bash install_docker.sh二、拉取镜像 docker pull tommylau/ocserv

数据库-01MYSQL-002MySQL5.7错误连接未释放导致数据库连接失败

**报错信息&#xff1a;** 信息&#xff1a; 11276:无法创建数据库<NAMSE_89>的连接:jdbc:mysql://xx.xx.xx.xx:3306/v_report xxxx_user 23246:无法创建数据库<NAMSE_89>的连接:jdbc:mysql://xx.xx.xx.xx:3306/v_report xnzb_user null, message from server: &qu…

工作窃取(Work-Stealing)是什么?

工作窃取&#xff08;Work-Stealing&#xff09;是什么&#xff1f; 工作窃取是一种并行任务调度算法&#xff0c;用于最大化 CPU 资源利用率&#xff0c;特别适合任务分解递归式的并发场景。其核心思想是&#xff1a;当某个线程完成了自己分配的任务后&#xff0c;如果其他线…

wsl下将exfat/NTFS类型的硬盘准换为ext4

问题 wsl 直接读 windows 文件速度慢如果 wsl 挂载一个 ext4 的硬盘会快些 方法 查看物理盘号 首先&#xff0c;你需要获取外置硬盘的磁盘标识符。你可以使用 Windows 的 diskpart 工具来获取&#xff1a; 打开命令提示符&#xff08;以管理员身份运行&#xff09;。 输入…

Jsoup在Java中:解析京东网站数据

对于电商网站如京东来说&#xff0c;其页面上的数据包含了丰富的商业洞察。对于开发者而言&#xff0c;能够从这些网站中提取有价值的信息&#xff0c;进行分析和应用&#xff0c;无疑是一项重要的技能。本文将介绍如何使用Java中的Jsoup库来解析京东网站的数据。 Jsoup简介 …

银河麒麟(debian)下安装postgresql、postgis

1、安装postgresql、postgis sudo apt update sudo apt install postgresql postgresql-contrib sudo apt install postgis postgresql-12-postgis-32、创建一个使用postgis的数据库 sudo -i -u postgres #postgres管理员用户createdb gisdb #创建新的gisdb数据库 psql -d gi…

c++日常积累

在 C 中&#xff0c;可以直接将 int 类型的值赋值给 bool 类型。C 会自动进行类型转换&#xff0c;任何非零的 int 值都会被转换为 true&#xff0c;而 0 会被转换为 false。 QDialog 有一个 finished(int) 信号&#xff0c;该信号在对话框关闭时发出&#xff0c;并传递一个整…

Linux部署redis保姆级教程

一、版本说明 Redis版本号(本文的版本号是6.2.12)的第二位如果是偶数,代表稳定版本,如果是奇数,代表非稳定版本。 所有历史版本下载地址:Index of /releases/ 二、基于压缩包安装(推荐) 2.1安装依赖 2.1.1安装gcc: yum -y install gcc 2.1.2验证gcc是否安装成功:(…

Vue使用OnlyOffice预览文档方案

服务器安装OnlyOffice ~~ 找后台或运维OfficePreview.vue <template><div id"officePreview"></div> </template><script setup> import { onMounted } from "vue";const props defineProps({previewUrl: {type: String,d…

Linux--多路转接之epoll

上一篇:Linux–多路转接之select epoll epoll 是 Linux 下多路复用 I/O 接口 select/poll 的增强版本&#xff0c;它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率。它是 Linux 下多路复用 API 的一个选择&#xff0c;相比 select 和 poll&#xff0c…

通过梧桐数据库分析客户价值

在现代商业环境中&#xff0c;对客户价值的分析至关重要。通过分析客户的消费行为&#xff0c;企业可以更好地理解其客户群体&#xff0c;并据此制定更有效的市场策略。本文将介绍如何使用SQL查询来分析客户价值&#xff0c;包括计算每个客户的总消费金额&#xff0c;并根据这些…

DevExpress WPF v24.1新版亮点:PDF查看器、富文本编辑器功能升级

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…