首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

内核优化之PSI篇:快速发现性能瓶颈,提高资源利用率

欢迎关注【字节跳动 SYS Tech】公众号。字节跳动 SYS Tech 聚焦系统技术领域,与大家分享前沿技术动态、技术创新与实践、行业技术热点分析等内容。 背景介绍 了解操作系统原理的同学应该知道,业务进程的运行性能取决于多种系统资源的分配。比如进程需要等待某些 IO 的返回,需要从伙伴系统分配内存,可能会由于 memory cgroup 的限制或者系统内存的水线配置而进行内存回收,进程运行需要调度器分配 CPU 时间,可能由于 CPU cgroup 的 quota 配置或者系统负载较大而等待调度器的调度。 所以一个进程的运行过程实际上是一个不断等待不断执行的过程,过多的等待会对进程的吞吐和延时造成负面影响,是否有一种内核机制能够量化这些等待时间呢? PSI 通过 hook CPU 调度器和 hook 一些 IO 和 memory 的关键点,来得到一个线程开始等待某种资源和结束等待某种资源的时间点以及程序运行的时间,然后用移动平均算法算出一个表示 pressure stall information 的百分比来量化。 用途 PSI 监控机制给我们提供了一种实时量化指标,反映业务进程的吞吐和延时,是否有某种系统资源上的瓶颈。这可以帮助我们了解特定业务进程的资源需求,协助业务的部署密度。并且可以根据 PSI 指标,动态调节业务的部署和资源的分配,来保证特定业务的性能要求和系统的健康程度。 使用接口 监控接口 PSI 通过 /proc 文件系统导出了三个接口文件,用于反映实时的系统级别的 CPU,memory 和 IO 压力。 # cat /proc/pressure/cpu some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 # cat /proc/pressure/memory some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 # cat /proc/pressure/io some avg10=0.00 avg60=0.00 avg300=0.00 total=0 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 其中的 some 表示至少有一个线程有资源瓶颈的时间比例,full 表示所有线程都有资源瓶颈的时间比例。 full 状态相当于整个系统由于资源瓶颈没有执行任何 productive 的代码,白白浪费了 CPU 资源。而 some 则是某些线程有资源瓶颈,另外的线程还是在利用 CPU 资源执行 productive 的代码。 avg10,avg60,avg300 则是在 10s,60s,300s 的时间窗口计算的移动平均百分比,表示资源瓶颈状态的时间比例,可以给我们短期、中期和长期的量化了解。total 则是资源瓶颈状态的绝对时间积累,我们也可以对 total 的变化进行监控来发现延时抖动的情况。 trigger 接口 除了读取这些接口文件获取实时指标外,我们还可以写入这些接口文件向内核注册 trigger,通过select(),poll() 或 epoll() 等待 trigger 事件的发生。 # 150ms threshold for partial memory stall in 1sec time window echo "some 150000 1000000" > /proc/pressure/memory # 50ms threshold for full io stall measured within 1sec time window echo "full 50000 1000000" > /proc/pressure/io trigger 示例代码 #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <poll.h> #include <string.h> #include <unistd.h> /* * Monitor memory partial stall with 1s tracking window size * and 150ms threshold. */ int main() { const char trig[] = "some 150000 1000000"; struct pollfd fds; int n; fds.fd = open("/proc/pressure/memory", O_RDWR | O_NONBLOCK); if (fds.fd < 0) { printf("/proc/pressure/memory open error: %s\n", strerror(errno)); return 1; } fds.events = POLLPRI; if (write(fds.fd, trig, strlen(trig) + 1) < 0) { printf("/proc/pressure/memory write error: %s\n", strerror(errno)); return 1; } printf("waiting for events...\n"); while (1) { n = poll(&fds, 1, -1); if (n < 0) { printf("poll error: %s\n", strerror(errno)); return 1; } if (fds.revents & POLLERR) { printf("got POLLERR, event source is gone\n"); return 0; } if (fds.revents & POLLPRI) { printf("event triggered!\n"); } else { printf("unknown event received: 0x%x\n", fds.revents); return 1; } } return 0; } cgroup接口 使用cgroup-v2 时 PSI 还提供了 per-cgroup 的 pressure stall information 接口,用于监控和跟踪特定 cgroup 的资源瓶颈状态。 cgroupfs 的 mount 点的每个子目录都有三个文件接口:cpu.pressure,memory.pressure,io.pressure。读取文件内容的形式和 /proc/pressure 一样,同样也可以进行写入注册 trigger 事件。 性能优化 PSI 机制为我们提供了一种实时量化系统级别或 cgroup 级别是否存在资源瓶颈的指标,对于调度部署业务负载和资源分配有很好的指导作用,而且可以明确业务进程的吞吐和延时方面存在的资源瓶颈。 但是 PSI 机制不是没有开销的,它 hook 了调度器和 IO,memory 等热点路径,统计等待资源的时间并计算比例,这些都是有开销的。为了在生产环境常态化开启 PSI 特性,我们需要解决 PSI 的性能开销问题。 问题场景 我们在线上场景遇到的一起 PSI 性能问题的 perf top 热点,其中 psi_task_change() 热点比较高,对当时业务进程的吞吐和延时都有较大的负面影响。 代码分析 psi_task_change() 的热点开销问题可能有两个方面的原因:一个是它本身执行比较耗时,另一个是它被调用的频率太高。 psi_task_change()函数的作用通过名字可知,在 PSI 的所有 hook 点都会发生 task 状态的变化,比如开始等待 memory,结束等待 memory,开始等待 CPU,结束等待 CPU 等,因此该函数调用频率较高。 另外psi_task_change()内部实现不仅需要改变该 task 的状态,还要改变 task 所在每个 cgroup 的状态,改变前需要统计上个状态的时间。 详情参见以下代码片段: void psi_task_change(struct task_struct *task, int clear, int set) { int cpu = task_cpu(task); struct psi_group *group; bool wake_clock = true; void *iter = NULL; if (!task->pid) return; psi_flags_change(task, clear, set); /* * Periodic aggregation shuts off if there is a period of no * task changes, so we wake it back up if necessary. However, * don't do this if the task change is the aggregation worker * itself going to sleep, or we'll ping-pong forever. */ if (unlikely((clear & TSK_RUNNING) && (task->flags & PF_WQ_WORKER) && wq_worker_last_func(task) == psi_avgs_work)) wake_clock = false; while ((group = iterate_groups(task, &iter))) psi_group_change(group, cpu, clear, set, wake_clock); } 通过以上代码分析,我们发现有两个可以优化的方向:尽量减少psi_task_change()的调用,以及尽量减少psi_group_change()的调用。 代码优化 1. 利用共同的cgroup 我们需要知道的一个捷径是当task A切换到task B时,如果A和B存在共同的cgroup时,其实cgroup的状态是没有变化的,只是task A和task B的状态变化了。 所以根据这个事实我们可以优化发生频率比较高的task_switch hook,不再遍历改变task A的所有cgroup,然后再次遍历task B的所有cgroup,而是进行整合:只改变task A和task B的不同cgroup分支,直到相同的cgroup停止,减少psi_task_change()的调用开销。 2. 减少sleep导致的状态切换 sleep before: psi_dequeue() while ((group = iterate_groups(prev))) # all ancestors psi_group_change(prev, .clear=TSK_RUNNING|TSK_ONCPU) psi_task_switch() while ((group = iterate_groups(next))) # all ancestors psi_group_change(next, .set=TSK_ONCPU) sleep after: psi_dequeue() nop psi_task_switch() while ((group = iterate_groups(next))) # until (prev & next) psi_group_change(next, .set=TSK_ONCPU) while ((group = iterate_groups(prev))) # all ancestors psi_group_change(prev, .clear=common?TSK_RUNNING:TSK_RUNNING|TSK_ONCPU) 通过以上对比可知:优化掉了 psi_dequeue 触发的 psi_group_change() 调用,将状态的改变整合放到了psi_task_switch(),减少了 cgroup 的状态切换开销。 总结 PSI 的优化成果已经合入上游的主线内核,也合入了 veLinux 开源的 5.4 内核版本,现在部署的 5.4 内核都已经常态化开启了 PSI 机制,配合 cgroup-v2 的使用会更好地帮助我们发现业务性能的资源瓶颈,以及动态的自适应运维和资源分配。 社区也已经存在基于 PSI 机制的 OOMD(out of memory daemon)service,可以更好地应对系统 OOM 的场景,同时在字节内部也积极开发和应用基于 PSI 机制的动态资源管控程序,以在保证业务性能的同时,提高资源利用率。 veLinux 内核 GitHub 地址:https://github.com/bytedance/kernel

优秀的个人博客,低调大师

干货分享 | HZERO系列组件之数据分发组件(一),广播表快速入门

企业的信息化系统,通常会存在业务系统服务和HZERO系统服务相互独立,表数据也进行分库存储的情况,然而在众多业务系统服务中,存在很多场景需要用到HZERO平台的Iam_user(用户)表,因此我们需要将用户表分发到其他数据库里。 普通的解决方式是通过定时调度任务或者在代码中埋点,编写同步代码的方式让两个系统两个数据库实例的用户数据保持一致。 但设想一下,如果我们需要同步的不仅仅是用户,还有角色、用户权限、员工、组织、部门等等数据呢?编写代码的方式不仅会增加开发量,还可能会有数据延迟、程序BUG等影响。 所以这里要引入数据分发组件,在保障同步性能的同时,能大大降低数据分发的工作量。 数据分发组件概述 基于CloudCanal社区版,HZERO提供了一个集成组件,进行API和操作流程的封装,主要功能是实现全局表的数据分发功能,灵活设置可按服务分DB,该组件主要的使用场景包括需要用到全局表的情况,例如用户表等。 当然,不使用HZERO的操作入口,从CloudCanal官方提供的管理界面进行配置也能达到效果,不过在这我们还是建议使用HZERO进行统一的管理。 组件坐标 管理端组件在Hzero-Admin服务中依赖使用。 <dependency> <groupId>org.hzero.plugin</groupId> <artifactId>admin-datasync</artifactId></dependency> 组件配置说明 在Hzero-Admin服务中添加好依赖后,还需配置以下信息才能正常使用。 hzero: admin: cloudCanal: # 服务地址, 安装CloudCanal组件后,CloudCanal的访问地址 serverUrl: ${HZERO_CLOUDCANAL_SERVER_URL:http://cloudcanal.hzero.com} # 应用KEY,从CloudCanal的管理员用户账号信息中获取,与appSecret相对应,具体获取方式可参考`CloudCanal`的官方文档 appKey: ${HZERO_CLOUDCANAL_APP_KEY:ak**********************************} # 应用秘钥,从CloudCanal的管理员用户账号信息中获取,与appKey相对应,具体获取方式可参考`CloudCanal`的官方文档 appSecret: ${HZERO_CLOUDCANAL_APP_SECRET:sk*********************************} # 管理帐户,CloudCanal的管理员账户 account: ${HZERO_CLOUDCANAL_ACCOUNT:test@clougence.com} # 管理密码,CloudCanal的管理员账户的密码 password: ${HZERO_CLOUDCANAL_PASSWORD:********************} # 登录认证Cookie域,需要保证CloudCanal的访问地址要与hzero的界面前端在同一个域里,否则不能以无登录的方式直接跳转到CloudCanal的管理界面 domainUrl: ${HZERO_CLOUDCANAL_DOMAIN_URL:.hzero.com} 组件安装 安装教程 详细教程可参考以下路径:https://www.clougence.com/cc-doc/quick/quick_start/ 修改默认验证码 CloudCanal社区版为了体验便利,默认设置了777777验证码,但是我们希望提高数据安全性,降低数据泄露风险。CloudCanal也提供修改默认验证码的功能,我们按照以下步骤配置即可。 操作步骤: 1、进入CloudCanal社区版解压目录 /console_data/cloudcanal/console/conf; 2、编辑Business-output.properties文件和以下参数Console.config.product.trial.verify_code=777777; 3、重启Console容器。 准备数据库账号 CloudCanal在做MySQL源端或对端的数据迁移同步时,需要提供的账号有一些赋权,基于数据安全和规范的考虑,我们建议新建数据库账号,不要使用权限最大的账号。 MySQL源端 全量迁移:迁移库表的SELECT权限,Information_schema SELECT权限 增量同步:SELECT,REPLICATION SLAVE,REPLICATION CLIENT权限,Information_schema SELECT权限 MySQL对端 全量迁移/增量同步:迁移库表的 INSERT/UPDATE/DELETE/DDL权限,Information_schema SELECT权限 系统自动心跳(可选) 默认心跳语句:CREATE DATABASE权限 组件基础配置 新建MYSQL数据源 路径:平台层菜单平台治理>数据分发>CloudCanal 通过以上路径进入CloudCanal管理界面。 目前HZERO系统能方便管理的只有MySql类型,若要分发其他类型数据库,请参照官方文档直接在CloudCanal系统中配置 : 1、可以使用阿里云账号,也可以使用自建账号密码模式(一般习惯用账号密码模式,权限分配比较简单); 2、网络地址最好填写内网,避免网络延迟; 3、按步骤填写后点击测试链接。 创建来源表 路径:平台层菜单平台治理>数据分发>广播表通过以上路径进入广播表管理界面 点击广播表操作栏上的【新建】按钮进入来源表创建页面。依次选择集群,网关类型为公网,数据源为我的数据源,库为Hzero_platform,表为Iam_user,点击【确定】后完成来源表的创建。 创建目标表 选中刚创建的来源表,点击目标表操作栏上的 新建按钮进入目标表创建页面。依次选择网关类型为公网,数据源为我的数据源,库为Order_sys,表不做更改, 默认与来源表保持一致,为Iam_user,点击确定后完成目标表的创建。 重复以上操作,只是这次库选择Payment_sys。 等待片刻,分别进入数据库的Order_sys与Payment_sysDB,可以看到Iam_user数据已经同步过来,而且后续的其他操作也会同步到其他两个DB中的对应表里。 通过以上几步简单的配置,就能完成两个数据库实例间的数据同步,不仅避免定时任务同步、代码埋点同步带来的一系列问题,而且CloudCanal是通过监听MySQL的增量日志实现的增量同步,在不影响应用服务器性能的情况下,正常情况下延迟不会超过1秒。 下篇我们将讲述数据分发组件之ElasticSearch同步方案,敬请期待。 联系我们 产品试用请登录开放平台。请在 PC 端打开: https://open.hand-china.com/market-home/trial-center/ 产品详情请登录开放平台: https://open.hand-china.com/document-center/ 如有疑问登录开放平台提单反馈: https://open.hand-china.com/ ▲ 更多精彩内容,扫码关注“四海汉得”公众号​​​​​​​

优秀的个人博客,低调大师

微软Skype即将迎来重大升级:带来快速、有趣、愉悦和流畅的体验

微软今天发布预告,表示 Skype 目前正在积极开发中,新版本有望在未来几个月内和大家见面。随着最近面向消费者的 Microsoft Teams 的推出,大多数人认为微软将退出 Skype。不过微软今天透露了 Skype 的未来计划,目标是建立一个改进的、更快的、可靠的、看起来超级现代的Skype。 作为Skype 中重要的部分之一,微软称其为“call stage”(通话舞台)。新版在通话期间显示的网格将很快包含通话中的每个人,无论他们是否启用了视频。这将使所有参与者并排在一起,包括你自己在主界面上的视频。 微软还为这个视图添加了新的主题和布局,为Skype的主要通话界面提供了一些亟需的定制功能。你将能够在扬声器视图、网格视图、大型图库、共同模式,甚至是内容视图之间进行选择--可以选择只显示启用视频的人。 Skype 新的彩色主题很快就会出现,包括按钮梯度,移动端改进的侧板,以及整个应用程序的流畅设计图标。没有头像的 Skype 用户也将获得彩色渐变,以便更容易区分聊天内容。 在团队博文中写道:“虽然我们喜欢设计上的变化,但我们知道它们还不够我们需要专注于性能,以使体验令人愉悦”。微软声称,它在 Android 版本的“关键场景”中的性能提高了 2000% 以上,在桌面版本的 Skype 中提高了 30%。 微软还承诺在未来的 Skype 变革中支持所有浏览器。Skype团队说:“我们相信,无论你使用什么浏览器或设备,Skype的体验都应该是无缝的、可访问的和可靠的,所以我们正在增加对所有浏览器的支持。我们希望确保无论你使用哪种设备、平台或浏览器,Skype都能给你带来美好的体验”。 其中一些改进现在已经上线,而其他改进将在未来几个月内推出。自定义通知声音是近期新功能的一部分,而新的TwinCam功能让你在通话中添加手机摄像头,似乎会在以后推出。 微软肯定是在关注Skype的广泛改进。这是微软自2014年开始调整Skype以来的最新一次重新设计,随后在2017年进行了类似Snapchat的设计,在2018年进行了另一次重新设计,干掉了类似Snapchat的激进变化,此后又对桌面和移动应用进行了大量修改。 【责任编辑:未丽燕 TEL:(010)68476606】

优秀的个人博客,低调大师

快速体验鸿蒙Liteos-A:IMX6ULL的QEMU系统(Windows版本)

1. 简介 QEMU可以模拟x86,也可以模拟各种ARM板子,还可以模拟各种外设。百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,让用户可以更有真实感地使用QEMU来模拟IMX6ULL板子。 1.1 100ASK-QEMU特点: 模拟网卡 模拟LCD显示功能 模拟led灯、按键 模拟at24cxx i2c存储芯片,直接可以通过用户态操作看到效果 模拟触摸屏(单点触摸) 后续会逐渐增加更多的模拟硬件模块 1.2 已经移植的系统 Linux 鸿蒙Liteos-A 2. 使用QEMU 2.1 下载 下载本GIT仓库: git clone https://gitee.com/weidongshan/qemu_image_for_imx6ull.git 也可以直接到文末下载完整的资源包! 如果你下载的是zip包,解压后目录名太长,会导致GUI界面无法显示。 把目录名改短即可。 2.2 体验Linux 双击运行env.bat, 在里面执行linux.bat即可启动Linux,输入root登录。 1. 体验LCD和触摸屏 执行如下命令: [root@qemu_imx6ul:/]# myfb-test /dev/fb0 // 在屏幕上画同心圆 [root@qemu_imx6ul:/]# ts_test // 可在开发板的LCD界面使用鼠标点击、画线 [root@qemu_imx6ul:/]# // 按ctrl+shift+c退出程序 2. 体验LED 执行如下命令,观察开发板上第1个LED: [root@qemu_imx6ul:~]# insmod 100ask_led.ko [root@qemu_imx6ul:~]# ls /dev/100ask_led0 /dev/100ask_led0 [root@qemu_imx6ul:~]# ledtest /dev/100ask_led0 on [root@qemu_imx6ul:~]# ledtest /dev/100ask_led0 off 3. 体验按键 执行如下命令,并在"设备管理器"中点击"buttons"按钮显示出按键的操作界面 [root@qemu_imx6ul:~]# insmod 100ask_led.ko // 如果前面执行过,这里不需要再次执行 [root@qemu_imx6ul:~]# cd button_driver_qemu/ [root@qemu_imx6ul:~/button_driver_qemu]# insmod button_drv.ko [root@qemu_imx6ul:~/button_driver_qemu]# insmod board_100ask_qemu_imx6ull.ko [root@qemu_imx6ul:~/button_driver_qemu]# ./button_led_test 4. 读写I2C EEPROM AT24C02 首先在“设备管理器”中打开at24c02的界面,然后执行以下命令测试: // 0x50是AT24C02的I2C设备地址 [root@qemu_imx6ul:~]# i2c_usr_test /dev/i2c-0 0x50 r 0 // 读地址0 data: , 0, 0x00 [root@qemu_imx6ul:~]# i2c_usr_test /dev/i2c-0 0x50 w 1 0x58 // 写地址1,写入0x58 效果如下: 5. 通过ssh登录开发板 本GIT仓库中,env.bat启动的是终端软件ConEmu,它比Windows命令行稍微好用点。 但是它不支持键盘的箭头,可以通过ssh登录开发板。 linux.bat中设置了端口转换,如下: 可以使用其他ssh软件,比如MobaXterm通过23端口远程登录开发板,操作更方便。 2.3 体验鸿蒙Liteos-A 双击运行env.bat, 在里面执行harmony_liteos.bat即可启动、进入Liteos-A。 1. 执行shell命令 执行help命令,可以看到支持的SHELL命令,如下: 2. 执行数码相框GUI程序 注意:必须用“./bin/digitpic”,不能用绝对路径“/bin/digitpic”注意:这个GUI程序是我们自己写得,很丑,与鸿蒙无关。 3. 退出程序 执行task命令确定进程号,然后执行“kill -9 PID”杀掉进程,比如: 3. 常见问题 3.1 不能放在中文目录下 否则会提示无法加载文件,比如: 3.2 目录名不能有空格 否则有如下提示: 3.3 目录名太长 如果你下载的是zip包,解压后目录名太长,会导致GUI界面无法显示。 把目录名改短即可。 3.4 ConEmu无法运行 系统原因,错误提示如下: 可以尝试运行另一个程序: 如果ConEmu程序都无法执行,直接双击harmony_liteos.bat或linux.bat,它使用DOS命令行作为终端,有乱码。 3.5 退出程序 注意:ctrl+c是退出QEMU,也就是退出Linux或Liteos-A。 要退出Linux中的当前程序:使用 ctrl+shift+c。 Liteos-A中没有当前程序,只能使用kill命令杀死进程。 3.6 鼠标无法移出开发板界面 当你的鼠标点击QEMU的GUI界面时,鼠标将无法移出这个GUI界面。 这时可以通过快捷键“Ctrl+Alt+g”把鼠标从GUI界面中退出来。 文章后续内容和相关附件可以点击下面的原文链接前往学习 原文链接:https://harmonyos.51cto.com/posts/4507#bkwz 想了解更多关于鸿蒙的内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto.com/#bkwz

优秀的个人博客,低调大师

五分钟快速入门 实战 Docker,工作这些命令就够用了

现在很多公司项目部署都是采用K8S docker容器方式,出门面试被问的概率极大,如果被面试官问docker相关知识点直接懵逼,那么基本就是被pass了,除非其他方面技术过硬。所以这种相对前沿的技术,就算达不到精通的程度,起码还是要了解基础理论和操作 一.安装docker Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 uname -an查看当前系统版本 yum -y install docker下载安装docker service docker start启动docker服务 docker version检查docker是否安装成功 当看到下图的信息,就是表示本机docker已经安装成功,很简单 在这里插入图片描述 二.镜像操作 创建容器要以镜像为基础,所以先讲下docker镜像的操作 搜索镜像 docker images ll查看下本机的是否已经有了镜像 目前机器里还没有镜像,去Docker Hub下载(镜像还可自定义,这里就不细说了) docker search java,还能指定具体的版本进行下载, 例如:docker search Ubuntu:1.2.5.4,可以进行搜docker Hub 会列出很多镜像 在这里插入图片描述 下载镜像 docker pull docker.io/nginx进行下载 下载到本地的镜像要比docker Hub上搜索出来的要大,因为下载过程中自动解压了,在查看镜像列表就有了刚才下载的镜像 列表包含了仓库名,版本标签,镜像ID,创建时间以及所占用的空间 在这里插入图片描述 删除镜像 删除没用的镜像docker rmi 镜像id 在这里插入图片描述 三.容器的操作 前边我们已经下载好了Nginx的镜像,接下来我们就创建一个只有Nginx应用的容器 docker run -i -t/bin/bash -i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本 dockerrun-idt--namecontainer_nginx-p8080:80docker.io/nginx 启动一个使用镜像docker.io/nginx,名字container_nginx的容器,-p 8080:80表示将容器的80端口映射到主机的8080端口,这样我们只要访问主机的8080端口就可以访问到容器的服务了。 注意:name前面是两个-, 端口前面有-p,docker.io/nginx是镜像名,8080是主机的端口,80是Nginx应用的端口 主机上的一个端口只能映射一个容器端口,不可以多个容器端口对应一个主机端口(如果容器安装的centos类的系统,那么容器端口随便设定,但如果容器内只是单纯的应用,那么容器端口要是应用自身的端口) 在这里插入图片描述 这样我们就创建并启动了一个容器! exit退出容器 docker ps查看运行中的容器 docker ps -a查看运行中和非运行中的所有容器 docker exec -it container_nginx /bin/bash进入容器 如果容器还未启动 执行docker start container_nginx 进入容器后启动Nginx whereis nginx 找Nginx的启动目录 [root@iz2zehzeir87zi8q99krk1z~]#dockerstartcontainer_nginx container_nginx [root@iz2zehzeir87zi8q99krk1z~]#dockerexec-itcontainer_nginx/bin/bash root@84683e425116:/#whereisnginx nginx:/usr/sbin/nginx/usr/lib/nginx/etc/nginx/usr/share/nginx root@84683e425116:/#/usr/sbin/nginx 此时在浏览器访问 http://51.110.218.9:8080/ 就可以直接访问容器内的Nginx 在这里插入图片描述 如果访问不成功,可能是主机端口的防火墙开着,执行下边的命令关闭 /sbin/iptables-IINPUT-ptcp--dport8080-jACCEPT 由于我用的阿里云服务器,所以需要在阿里云把8080端口开放 在这里插入图片描述 删除容器 容器删除之前先将容器停止 docker stop container_nginx或者是容器的id docker rm -f container_nginx容器删除 docker start 与 docker run 的区别 docker start name启动一个已经创建的容器 docker run创建并启动一个容器 docker run命令其实是docker create和docker start的命令组合,先执行docker create创建一个容器 再接着docker start启动 主机和容器文件相互复制 从主机复制到容器sudodockercphost_pathcontainerID:container_path 从容器复制到主机sudodockercpcontainerID:container_pathhost_path 请注意,以上这两个命令都是在主机中执行的,不能再容器中执行 dockercpcontainer_nginx:/usr/local/xin.txt/usr/local/software/容器向主机复制文件 dockercp/usr/local/xinzhifu.txtcontainer_nginx:/usr/local/主机向容器复制文件 这样一个基础的docker容器就创建完了 。。。。。。。。。。。。 反过来大家再看一看docker的容器与镜像的区别https://www.cnblogs.com/linjiaxin/p/7381421.html 那么其实镜像与容器的本质区别并不大,那么镜像可以生成容器 ,容器是否可以做成镜像呢? docketcommitcontainer_nginximage_nginx:v1 在这里插入图片描述 container_nginx容器名 image_nginx:v1自己起一个镜像的名字:版本号 这样做有什么好处呢? 例如:A、B两台机器都想安装redis,A机器上创建容器并在容器中做好redis的一切配置,让后将这个容器docker commit 成镜像image_redis,B机器也想要安装redis,直接用镜像image_redis创建容器就行了,docker就是做这样一劳永逸的事情。 而且传统方式得在每台机器上安装配置redis非常麻烦 四.镜像的导入与导出 镜像压缩打包 (主机上进行操作),有两种方式docker save与docker load和docker export 与 docker import dockersavenginx|gzip>nginx_xin_image.tar.gz将现有的镜像压缩打包 dockerload-inginx_xin_image.tar.gz压缩的镜像解压 dockerimages进行查看 docker save是直接将镜像进行打包docker save <镜像名>或<镜像id> dockerexportcontainer_nginx>nginx_image.tar catnginx_image.tar|sudodockerimport-nginx_image:import docker export是直接将容器进行打包docker export <容器名>或<容器id> 需要注意两种方法配套的,切不可混用。虽然导入导出时没问题,但是在创建容器时候会报错 如果使用import导入save产生的文件,虽然导入不提示错误,但是启动容器时会提示失败, 会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。 类似,使用load载入export产生的文件,也会出现问题。 先写到这,文章略显粗糙,希望对您有一点用,学无止境加油! 整理了几百本各类技术电子书,有需要的同学公号[程序员内点事]内回复[666]自取。技术群快满了,想进的同学可以加我好友,和大佬们一起吹吹技术。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册