手机游戏出现这个MAINTENANCE-CLIENT手机出现hd什么意思思

LG电子为您提供各种各样的智能家用产品,LG智能家电产品让您的生活更轻松更舒适 | LG中国官网
To properly experience our LG.com website, you will need to use an alternate browser or upgrade to a newer version of Internet Explorer (IE9 or greater).
LG.com网站采用响应式网页设计来提供符合您设备屏幕大小的舒适体验。为了让您享受最好的体验,请按照以下说明进行调整。
如果您正在使用IE 8或者更早的版本,您将需要使用一个可替换浏览器,比如Firefox或者Chrome,也可以选择更新到新版IE(IE 9或者更高版本)。
如果您正在使用IE 9或者更高版本,请按照以下步骤关闭您IE浏览器的“兼容性视图设置”
右击浏览器顶部,确定“菜单栏”选项是勾选状态。
从菜单栏选择“工具”然后选择“兼容性视图设置”
在弹出的菜单中取消三个勾选框的选择然后点击“关闭”
您的浏览器窗口将会自动刷新,接下来就可以开
启您的LG之旅了.
LG.com不支持SSLv2,v3,IE 6浏览器需要更改TLS 1.0选项.
1)进入Internet选项
2)选择“高级”选项卡,勾选使用TLS 1.0
(或者使用TLS 1.1,1.2)
* 在更改选项后,如果您仍无法使用HTTPS访问
页面,请联系技术团队 或者第三方技术团队。
您的浏览器似乎在禁用JavaScript,请启用JavaScript 以充分利用从LG网站了解产品和服务。
从一台,到一张
LG PRIME UHD TV
色彩是电视不可或缺的重要元素,它能细腻呈现画面所想表达的深层情感
LG 双o门中门(R)
LG 门中门(R) 让您最爱的食物触手可及。革新冰箱门设计,给您带来便捷生活体验。多次开门取放您最爱的食物,制冷效果依然表现出众。
重新定义洗衣机TWINWash 双擎
滚筒/波轮同步分类2合1洗衣机颠覆传统的洗涤方式分类洗涤 | 同步洗涤 | 节省空间 | 节省时间
蒸汽除菌 健康呵护
蒸汽除菌99.9&#37 ● 蒸汽柔顺 ● 蒸汽清新通过深层渗透衣物的蒸汽,去除细菌和异味,减少褶皱。给婴儿和家人更多健康呵护。
激发你的创造力
独注细微,精益求精
绝美影音旗舰发现无边框之美
LG V30 | LG V30+的无边框合计和18:9的完美平衡比例,让您一手掌控影音旗舰。除了惊艳的外形设计,织纹状保护面让其达到IP68防水防尘等级,甚至通过了美国军事规格掉落测试(MILSTD-810G)
Smart ThinQLG智慧家电APP
LG客服热线
个人顾客 :400-819-9999(全国热线中心)商用顾客 :400-819-0011(电视/显示器商用顾客)周一至周日:08:00 ~ 20:00
周一至周日:08:00 ~ 20:00这段时间吃鸡游戏老是进不去.老是提示 这个东西_百度知道
这段时间吃鸡游戏老是进不去.老是提示 这个东西
我有更好的答案
you need to upgrade your game client你需要升级你的游戏客户端
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&https://pic1.zhimg.com/v2-037e272fa30e35c3d5d0_b.jpg& data-rawwidth=&2224& data-rawheight=&1668& class=&origin_image zh-lightbox-thumb& width=&2224& data-original=&https://pic1.zhimg.com/v2-037e272fa30e35c3d5d0_r.jpg&&&/figure&&p&我主要做后端开发,近期一直在使用 iPad Pro 做些编码之外的事情,在很大程度上提升了我的工作、学习效率,在这里分享下一些使用实践。&/p&&p&主题:&/p&&ol&&li&为什么要买 iPad Pro&/li&&li&使用场景&/li&&li&常用软件&/li&&/ol&&p&&br&&/p&&p&一、为什么要买 iPad Pro&/p&&p&主要有两方面的需求:&/p&&ul&&li&需要阅读大量文档&/li&&li&需要对文档深入理解&/li&&/ul&&p&我当前的工作主要集中在「容器云」领域的开发,这个领域发展很迅速,市面上的书籍跟不上当前的进展,需要通过诸如 github、blog 等途径获取资料来提升。面对电脑,即使是 Retina 屏的 Mac,长时间阅读文档的效率也比较低,眼睛会很酸疼。前段时间左眼患了结膜炎,让我对保护眼睛更加重视。&/p&&p&同时,除了坐在电脑面前,我还有很多时间在交通工具、外出等,阅读的场合比较多样化。&/p&&p&虽然有 Kindle,但几年下来感觉用 Kindle 更适合阅读非工作相关、个人感兴趣的书籍,如各类文学书、心理学书籍等。缺乏便利的标注、笔记、检索等功能,使得 Kindle 阅读与工作相关的书的场景很少。&/p&&p&iPad Pro 这时进入了我的视线,尤其是和 Apple Pencil 结合,正好可以满足我上述的需求。价格虽然有些小贵,但考虑到它未来给我带来的价值,还是需要买的。&/p&&p&&br&&/p&&p&二、使用场景&/p&&p&我目前主要有三类使用场景:&/p&&ul&&li&阅读 github 上的文档&/li&&li&阅读 paper&/li&&li&阅读 blog&/li&&/ul&&p&我会花大量时间阅读 k8s 的设计文档,如下图的效果:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c7bee66a835a87f4dde7a9_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1668& data-rawheight=&2224& class=&origin_image zh-lightbox-thumb& width=&1668& data-original=&https://pic4.zhimg.com/v2-c7bee66a835a87f4dde7a9_r.jpg&&&/figure&&p&竖屏阅读的效果就像在看一本杂志,注意力比较集中。&/p&&p&我常会把这些文档通过 Safari 转成 pdf 格式分享到 Notability 这个 APP 中,边阅读边标记:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-21406cedbf4dbbefa8e554_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1668& data-rawheight=&2224& class=&origin_image zh-lightbox-thumb& width=&1668& data-original=&https://pic2.zhimg.com/v2-21406cedbf4dbbefa8e554_r.jpg&&&/figure&&p&请忽略放荡不羁爱自由的字体……电脑时代还是要练好字的。&/p&&p&&br&&/p&&p&阅读 paper 和 blog 时,我也会采用这种方式,先导到 Notability 中,然后边阅读边标记。&/p&&p&这里要提到一点儿,要最大化 Notability 功能,或者说「标注/笔记」功能,需要 Apple Pencil 的,拿个笔写写画画。&/p&&p&&br&&/p&&p&对于写文档,目前体验下来 Google Docs 更舒服些,比如现在这篇文档就是在 Google Docs 上写的,配上 iOS 11 的分屏功能,右边开着 MindNode 总结文档思路,左边写文档:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-eeb51c77ccaa80f879b87c5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2224& data-rawheight=&1668& class=&origin_image zh-lightbox-thumb& width=&2224& data-original=&https://pic3.zhimg.com/v2-eeb51c77ccaa80f879b87c5_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&三、常用软件&/p&&p&知乎上有很多类似的问题可以参考,这里仅从个人的特点上列出常用的软件。&/p&&p&我在娱乐方面需求单一,听听歌、看看动漫或视频就好,但对办公软件、效率软件的需求大,常用的有这些:&/p&&ul&&li&笔记/文档相关&/li&&ul&&li&Notability&/li&&li&Google 办公软件系列&/li&&ul&&li&Docs&/li&&li&Sheets&/li&&li&Slides&/li&&/ul&&/ul&&li&个人云存储相关&/li&&ul&&li&Google Drive&/li&&/ul&&li&效率工具&/li&&ul&&li&OmniFocus&/li&&li&MindNode&/li&&li&1Password&/li&&li&SsrConnectPro&/li&&/ul&&li&通讯工具&/li&&ul&&li&Gmail&/li&&li&Slack&/li&&/ul&&li&娱乐相关&/li&&ul&&li&QQ 音乐&/li&&li&优酷视频&/li&&/ul&&li&其他&/li&&ul&&li&欧路词典&/li&&li&百度输入法&/li&&/ul&&/ul&&p&&br&&/p&&p&小结&/p&&p&这段时间 iPad Pro + Apple Pencil 在「阅读效率」「阅读质量」「保护眼睛」方面给我带来的帮助很大。由于我更喜欢对着大屏幕、用手感更好的键盘编码或长时间打字,暂时没买配套的键盘,不过短时、高频写文字的场景下考虑配套键盘可能会进一步提升效率。&/p&
我主要做后端开发,近期一直在使用 iPad Pro 做些编码之外的事情,在很大程度上提升了我的工作、学习效率,在这里分享下一些使用实践。主题:为什么要买 iPad Pro使用场景常用软件 一、为什么要买 iPad Pro主要有两方面的需求:需要阅读大量文档需要对文档…
&figure&&img src=&https://pic1.zhimg.com/v2-e56df3f93aeabfc28f69a81_b.jpg& data-rawwidth=&1000& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic1.zhimg.com/v2-e56df3f93aeabfc28f69a81_r.jpg&&&/figure&&p&全文较长,大致需要半小时左右时间阅读,若你已经有所基础,可以根据自己的了解程度选择从何处看起。&/p&&p&本文记录的是作为一个新手,从了解 Docker 是什么、Docker 技术包含哪些概念到上手使用、安装以及发布 Docker 镜像的整个过程。作者在学习过程中参阅了诸多文档和教程,在此一并感谢,与此同时本文结尾也列出了参考文献的链接,供读者进一步参考。遵循简介、入门、上手到深入的顺序,本文根据个人学习实践过程进行书写,结构如下:&/p&&ul&&li&一、Docker 简介&/li&&ul&&li&1.1 Docker 概念扫盲:什么是 Docker?&/li&&li&1.2 Docker 和虚拟机的区别与特点&/li&&/ul&&li&二、Docker 基本概念&/li&&ul&&li&2.1 核心概念:镜像、容器与仓库&/li&&li&2.2 Docker 三剑客&/li&&/ul&&li&三、Docker 安装与使用&/li&&ul&&li&3.1 Docker 安装、运行与加速&/li&&li&3.2 Hello World&/li&&/ul&&li&四、镜像使用与发布&/li&&ul&&li&4.1 镜像的获取与使用&/li&&li&4.2 通过 commit 命令理解镜像构成&/li&&li&4.3 利用 Dockerfile 定制镜像&/li&&/ul&&li&五、总结&/li&&li&六、参考&/li&&/ul&&p&其中第一章与第二章非常详细地介绍了 Docker 的相关概念与基本组成,主要是概论介绍等文字描述,第三章与第四章偏重于上手实践,从 Docker 环境安装、运行加速、镜像使用、镜像构成到镜像定制与发布,分解了各步骤的流程,通过教程加注解的形式加深读者印象。其中建立镜像的示例代码可以从 &a href=&https://link.zhihu.com/?target=https%3A//github.com/hijiangtao/friendlyhello-docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub&/a& 打包下载。&/p&&p&由于软硬件环境变化日新月异,除概念介绍与解读部分,在运行本文代码之前请确保运行环境以及 Docker 自身版本。本文代码均运行于 macOS 环境(macOS Sierra 10.12.5),所使用 Docker 版本为 18.03.0-ce。&/p&&p&如果文中有描述不清楚的地方,请评论告知;文中难免存在错误与疏漏的地方,也请多多指教。以下开始正文。&/p&&hr&&h2&一、Docker 简介&/h2&&p&谈到 Docker,不论我们是否实践过,都应该对它或多或少有一个印象,即“环境一次创建,多端一致性运行”,因为它正解决了曾经困扰我们已久“这段代码在我电脑上运行没问题啊”的烦恼。首先,简单介绍一下 Docker 技术是什么。&/p&&h2&1.1 Docker 概念扫盲:什么是 Docker?&/h2&&p&Docker 是一个开放源代码软件项目,项目主要代码在2013年开源于 &a href=&https://link.zhihu.com/?target=https%3A//github.com/moby/moby& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub&/a&。它是云服务技术上的一次创新,让应用程序布署在软件容器下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。&/p&&p&Docker 利用 Linux 核心中的资源分脱机制,例如 cgroups,以及 Linux 核心名字空间(name space),来创建独立的软件容器(containers),属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker 在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得其比虚拟机技术更为轻便、快捷。Docker 可以在单一 Linux 实体下运作,避免因为创建一个虚拟机而造成的额外负担。&/p&&h2&1.2 Docker 和虚拟机的区别与特点&/h2&&p&对于新手来说,第一个觉得困惑的地方可能就是不清楚 Docker 和虚拟机之间到底是什么关系。以下两张图分别介绍了虚拟机与 Docker 容器的结构。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bfc621cec1c2e321cf2724093bdc8ae5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&692& data-rawheight=&261& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic1.zhimg.com/v2-bfc621cec1c2e321cf2724093bdc8ae5_r.jpg&&&/figure&&p&对于虚拟机技术来说,传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给他的资源将全部被占用。每一个虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ea4441bdece_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&689& data-rawheight=&195& class=&origin_image zh-lightbox-thumb& width=&689& data-original=&https://pic1.zhimg.com/v2-ea4441bdece_r.jpg&&&/figure&&p&容器技术和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。容器内没有自己的内核,也没有进行硬件虚拟。&/p&&p&具体来说与虚拟机技术对比,Docker 容器存在以下几个特点:&/p&&ol&&li&&b&更快的启动速度&/b&:因为 Docker 直接运行于宿主内核,无需启动完整的操作系统,因此启动速度属于秒级别,而虚拟机通常需要几分钟去启动。&/li&&li&&b&更高效的资源利用率&/b&:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。&/li&&li&&b&更高的系统支持量&/b&:Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。&/li&&li&&b&持续交付与部署&/b&:对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至进行自动部署。&/li&&li&&b&更轻松的迁移&/b&:由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。&/li&&li&&b&更轻松的维护与扩展&/b&:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。&/li&&li&&b&更弱的隔离性&/b&:Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。&/li&&li&&b&更弱的安全性&/b&:Docker 的租户 root 和宿主机 root 等同,一旦容器内的用户从普通用户权限提升为 root 权限,它就直接具备了宿主机的 root 权限,进而可进行无限制的操作。虚拟机租户 root 权限和宿主机的 root 虚拟机权限是分离的,并且利用硬件隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。&/li&&/ol&&h2&二、Docker 基本概念&/h2&&h2&2.1 核心概念:镜像、容器与仓库&/h2&&p&Docker 主要包含三个基本概念,分别是镜像、容器和仓库,理解了这三个概念,就理解了 Docker 的整个生命周期。以下简要总结一下这三点,详细介绍可以移步&a href=&https://link.zhihu.com/?target=https%3A//yeasy.gitbooks.io/docker_practice/content/basic_concept/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker 从入门到实践&/a&对应章节。&/p&&ul&&li&&b&镜像&/b&:Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。&/li&&li&&b&容器&/b&:容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间容器可以被。创建、启动、停止、删除和暂停等等,说到镜像与容器之间的关系,可以类比面向对象程序设计中的类和实例。&/li&&li&&b&仓库&/b&:镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库;每个仓库可以包含多个标签;每个标签对应一个镜像,其中标签可以理解为镜像的版本号。&/li&&/ul&&h2&2.2 Docker 三剑客&/h2&&p&&b&docker-compose&/b&:Docker 镜像在创建之后,往往需要自己手动 pull 来获取镜像,然后执行 run 命令来运行。当服务需要用到多种容器,容器之间又产生了各种依赖和连接的时候,部署一个服务的手动操作是令人感到十分厌烦的。&/p&&p&dcoker-compose 技术,就是通过一个 &code&.yml&/code& 配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行 &code&docker-compose up&/code& 命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。&/p&&p&&b&docker-machine&/b&:Docker 技术是基于 Linux 内核的 cgroup 技术实现的,那么问题来了,在非 Linux 平台上是否就不能使用 docker 技术了呢?答案是可以的,不过显然需要借助虚拟机去模拟出 Linux 环境来。&/p&&p&docker-machine 就是 docker 公司官方提出的,用于在各种平台上快速创建具有 docker 服务的虚拟机的技术,甚至可以通过指定 driver 来定制虚拟机的实现原理(一般是 virtualbox)。&/p&&p&&b&docker-swarm&/b&:swarm 是基于 docker 平台实现的集群技术,他可以通过几条简单的指令快速的创建一个 docker 集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。&/p&&h2&三、Docker 安装与使用&/h2&&p&Docker 按版本划分,可以区分为 CE 和 EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。&/p&&h2&3.1 Docker 安装、运行与加速&/h2&&p&本部分只介绍 macOS 上的安装,其余操作系统上的使用方法可以参见&a href=&https://link.zhihu.com/?target=https%3A//docs.docker.com/install/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&官网&/a&。&/p&&p&Docker for Mac 要求系统最低为 macOS 10.10.3 Yosemite。如果系统不满足需求,可以安装 Docker Toolbox。&/p&&p&安装方法有两种:homebrew 和手动下载安装。Homebrew-Cask 已经支持 Docker for Mac,如果使用该方式,你只需要运行如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&brew cask install docker
&/code&&/pre&&/div&&p&若是手动下载,也很容易。从&a href=&https://link.zhihu.com/?target=https%3A//docs.docker.com/docker-for-mac/install/%23install-and-run-docker-for-mac& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&选择合适你的版本下载 dmg 文件,然后拖进应用中即可。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d01f34a25bcd7500d8ccd22a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&832& data-rawheight=&452& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&https://pic2.zhimg.com/v2-d01f34a25bcd7500d8ccd22a_r.jpg&&&/figure&&p&启动应用之后,你可以在命令行查看 Docker 版本(Docker 不同技术对应的版本用不同命令进行查看):&/p&&div class=&highlight&&&pre&&code class=&language-bash&&&span&&/span&docker --version
& Docker version 18.03.0-ce, build 0520e24
docker-compose --version
& docker-compose version 1.20.1, build 5d8c71b
docker-machine --version
& docker-machine version 0.14.0, build 89b8332
&/code&&/pre&&/div&&p&当然了,由于某些原因,国内从 Docker Hub 上拉取内容会非常缓慢,这个时候就可以配置一个镜像加速器环境。详情说明可以移步 &a href=&https://link.zhihu.com/?target=https%3A//www.docker-cn.com/registry-mirror& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker 中国官方镜像加速&/a&,对于 macOS 用户,在任务栏点击应用图标 -& Perferences... -& Daemon -& Registry mirrors,在列表中填写加速器地址 &code&https://registry.docker-cn.com&/code& 即可。修改完成之后,点击 Apply & Restart 即可。&/p&&p&为了检测加速器是否生效,可以在命令行输入以下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker info
# 如果查看到如下 registry mirrors 信息则表示修改生效
Registry Mirrors:
https://registry.docker-cn.com/
&/code&&/pre&&/div&&h2&3.2 Hello World&/h2&&p&大多数编程语言以及一些软件的第一个示例都是 Hello Wolrd,Docker 也不例外,运行 &code&docker run hello-world&/code& 验证一下吧(该命令下 Docker 会在本地查找镜像是否存在,但因为环境刚装上所以肯定不存在,之后 Docker 会去远程 Docker registry server 下载这个镜像),以下为运行信息。&/p&&div class=&highlight&&&pre&&code class=&language-console&&&span&&/span&&span class=&go&&Unable to find image 'hello-world:latest' locally&/span&
&span class=&go&&latest: Pulling from library/hello-world&/span&
&span class=&go&&9bb5a5d4561a: Pull complete&/span&
&span class=&go&&Digest: sha256:f6fdcebde73361e77&/span&
&span class=&go&&Status: Downloaded newer image for hello-world:latest&/span&
&span class=&go&&Hello from Docker!&/span&
&span class=&go&&This message shows that your installation appears to be working correctly.&/span&
&span class=&go&&To generate this message, Docker took the following steps:&/span&
&span class=&go&& 1. The Docker client contacted the Docker daemon.&/span&
&span class=&go&& 2. The Docker daemon pulled the &hello-world& image from the Docker Hub.&/span&
&span class=&go&&
(amd64)&/span&
&span class=&go&& 3. The Docker daemon created a new container from that image which runs the&/span&
&span class=&go&&
executable that produces the output you are currently reading.&/span&
&span class=&go&& 4. The Docker daemon streamed that output to the Docker client, which sent it&/span&
&span class=&go&&
to your terminal.&/span&
&span class=&go&&To try something more ambitious, you can run an Ubuntu container with:&/span&
&span class=&gp&& $&/span& docker run -it ubuntu bash
&span class=&go&&Share images, automate workflows, and more with a free Docker ID:&/span&
&span class=&go&& https://hub.docker.com/&/span&
&span class=&go&&For more examples and ideas, visit:&/span&
&span class=&go&& https://docs.docker.com/engine/userguide/&/span&
&/code&&/pre&&/div&&p&网上有不少文章说到 macOS 的特殊配制,即由于 Docker 引擎使用了特定于 Linux 内核的特性,需要安装一个轻量级的虚拟机(如 VirtualBox)来保证在 macOS 上正常运行 Docker。于是建议下载官方提供的 &a href=&https://link.zhihu.com/?target=https%3A//github.com/boot2docker/boot2docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Boot2Docker&/a& 来运行 Docker 守护进程。但是查看了项目动态后发现,由于 Docker for Mac 和 Docker for Windows 的发布,这一操作已不被推荐,即两个客户端环境中已经继承了该功能。&/p&&blockquote&&i&Boot2Docker is officialy in maintenance mode -- it is recommended that users transition from Boot2Docker over to Docker for Mac or Docker for Windows instead. From &a href=&https://link.zhihu.com/?target=https%3A//github.com/boot2docker/boot2docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&boot2docker/boot2docker&/a&&/i&&/blockquote&&p&所以在看到任何教程准备上手之前,最好看看教程本身依赖的环境版本以及软件最新的发布动态,这个习惯对于本文的作者来说也不例外。&/p&&h2&四、镜像使用与发布&/h2&&h2&4.1 镜像的获取与使用&/h2&&p&之前提到 Docker Hub 上有大量优秀的镜像,下面先来说说如何获取镜像。和 git 类似,docker 也使用 pull 命令,其格式如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
&/code&&/pre&&/div&&p&其中 Docker 镜像仓库地址若不写则默认为 Docker Hub,而仓库名是两段式名称,即 &code&&用户名&/&软件名&&/code&。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。我们拉取一个 ubuntu 16.04 镜像试试:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker pull ubuntu:16.04
# 输出信息
16.04: Pulling from library/ubuntu
dc: Pull complete
a9b30c108bda: Pull complete
67de21feec18: Pull complete
817da545be2b: Pull complete
d967c497ce23: Pull complete
Digest: sha256:9ee3b83bcaa383e5e3b657f042f4034c92cdd50c03fceaea9ba7c
Status: Downloaded newer image for ubuntu:16.04
&/code&&/pre&&/div&&p&上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 &code&ubuntu:16.04&/code&,因此将会获取官方镜像 &code&library/ubuntu&/code& 仓库中标签为 &code&16.04&/code& 的镜像。这里需要说明的是,由于 Docker for Mac 的支持即前文所述的原因,在 Docker 容器中使用的操作系统不必与主机操作系统相匹配。比如,你可以在 CentOS 主机中运行 Ubuntu,反之亦然。好了,下载完毕我们通过如下命令运行一个容器:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run -it --rm \
ubuntu:16.04 \
&/code&&/pre&&/div&&p&运行完成后你便可以使用诸多命令来测试环境了,比如再来一遍 Hello Wolrd:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&echo &Hello World&
&/code&&/pre&&/div&&p&或者查看系统信息:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cat /etc/os-release
# 输出信息
AME=&Ubuntu&
VERSION=&16.04.4 LTS (Xenial Xerus)&
ID_LIKE=debian
PRETTY_NAME=&Ubuntu 16.04.4 LTS&
VERSION_ID=&16.04&
HOME_URL=&http://www.ubuntu.com/&
SUPPORT_URL=&http://help.ubuntu.com/&
BUG_REPORT_URL=&http://bugs.launchpad.net/ubuntu/&
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
&/code&&/pre&&/div&&p&&code&docker run&/code& 就是运行容器的命令,这里简要的说明一下上面用到的参数,详细用法可以查看 help。&/p&&ul&&li&&code&-it&/code&:这是两个参数,一个是 &code&-i&/code& 表示交互式操作,一个是 &code&-t&/code& 为终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。&/li&&li&&code&--rm&/code&:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 &code&docker rm&/code&。&/li&&li&&code&ubuntu:16.04&/code&:这是指用 &code&ubuntu:16.04&/code& 镜像为基础来启动容器。&/li&&li&&code&bash&/code&:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用 bash。&/li&&/ul&&p&Docker 镜像还有一些常用操作,比如:&/p&&ul&&li&&code&docker image ls&/code& - 列出本地已下载镜像&/li&&li&&code&docker image rm [选项] &镜像1& [&镜像2& ...]&/code& - 删除镜像&/li&&li&&code&docker logs &id/container_name&&/code& - 查看容器日志&/li&&li&&code&docker ps&/code& - 列出当前所有正在运行的容器&/li&&li&&code&docker ps -l&/code& - 列出最近一次启动的容器&/li&&li&&code&docker search image_name&/code& - 从 Docker Hub 检索镜像&/li&&li&&code&docker history image_name&/code& - 显示镜像历史&/li&&li&&code&docker push new_image_name&/code& - 发布镜像&/li&&/ul&&h2&4.2 通过 commit 命令理解镜像构成&/h2&&blockquote&&code&docker commit&/code& 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 &code&docker commit&/code& 定制镜像,定制镜像应该使用 Dockerfile 来完成。&/blockquote&&p&以下通过定制化一个 web 服务器,来说明镜像的构成。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run --name webserver -d -p 4000:80 nginx
&/code&&/pre&&/div&&p&首先,以上命令会用 &code&nginx&/code& 镜像启动一个容器,命名为 webserver,并映射在 4000 端口,接下来我们用浏览器去访问它,效果如下所示。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ee3f6208a86bfc72198e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1834& data-rawheight=&1014& class=&origin_image zh-lightbox-thumb& width=&1834& data-original=&https://pic4.zhimg.com/v2-ee3f6208a86bfc72198e_r.jpg&&&/figure&&p&&i&注:如果使用的是 Docker Toolbox,或者是在虚拟机、云服务器上安装的 Docker,则需要将 localhost 换为虚拟机地址或者实际云服务器地址。&/i&&/p&&p&现在,假设我们非常不喜欢这个欢迎页面,我们希望改成欢迎 Docker 的文字,我们可以使用 &code&docker exec&/code& 命令进入容器,修改其内容。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker exec -it webserver bash
root@e:/# echo '&h1&Hello, Docker!&/h1&' & /usr/share/nginx/html/index.html
root@2e:/# exit
&/code&&/pre&&/div&&p&这时刷新浏览器,我们发现效果变了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e22a1c413ec38ab9c05a7ea4ff2dbf22_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1834& data-rawheight=&1014& class=&origin_image zh-lightbox-thumb& width=&1834& data-original=&https://pic4.zhimg.com/v2-e22a1c413ec38ab9c05a7ea4ff2dbf22_r.jpg&&&/figure&&p&我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 &code&docker diff&/code& 命令看到具体的改动。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker diff webserver
A /root/.bash_history
A /run/nginx.pid
C /usr/share/nginx/html/index.html
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
&/code&&/pre&&/div&&p&当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 &code&docker commit&/code& 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。&/p&&p&假设以上操作已经符合我们的定制了,接下来就将它保存下来。commit 语法格式如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker commit [选项] &容器ID或容器名& [&仓库名&[:&标签&]]
&/code&&/pre&&/div&&p&我们在命令行输入(其中 author、message 等信息可以省略):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker commit \
--author &Joe Jiang &&& \
--message &modify: Nginx default page to Hello Docker& \
webserver \
# 输出结果
sha256:48bcb7b903a21dd86b45befa4a8d3f9b
&/code&&/pre&&/div&&p&接下来我们可以在本地镜像列表中看到这个新镜像:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker image ls
REPOSITORY
48bcb7b903a4
About a minute ago
4 days ago
hello-world
e38bc07ac18e
5 days ago
b175e7467d66
6 days ago
&/code&&/pre&&/div&&p&也可以查看这个镜像最新版的历史记录:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker history nginx:v2
CREATED BY
48bcb7b903a4
3 minutes ago
modify: Nginx default page to Hello Docker
b175e7467d66
6 days ago
/bin/sh -c #(nop)
CMD [&nginx& &-g& &daemon…
6 days ago
/bin/sh -c #(nop)
STOPSIGNAL [SIGTERM]
&/code&&/pre&&/div&&p&当然也可以查看当前主机的所有容器,并终止我们启动的 webserver:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# 查看所有容器
$ docker container ls -a
CONTAINER ID
&nginx -g 'daemon of…&
18 minutes ago
Up 18 minutes
0.0.0.0:4000-&80/tcp
fdb4b0c9a5e1
hello-world
2 hours ago
Exited (0) 2 hours ago
angry_bhabha
# 终止 webserver
$ docker container stop webserver
# 再次查看所有容器,确保 webserver 终止
$ docker container ls -a
CONTAINER ID
&nginx -g 'daemon of…&
21 minutes ago
Exited (0) 27 seconds ago
fdb4b0c9a5e1
hello-world
2 hours ago
Exited (0) 2 hours ago
angry_bhabha
&/code&&/pre&&/div&&p&接下来我们运行这个新镜像,记得浏览器访问应该打开 &a href=&https://link.zhihu.com/?target=http%3A//localhost%3A4001/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://localhost:4001&/a&:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run --name web2 -d -p 4001:80 nginx:v2
190e998ff582aac8a3dd270ef54c456d450fc06950
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-72fb32a79ecbe935df889174_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1834& data-rawheight=&1014& class=&origin_image zh-lightbox-thumb& width=&1834& data-original=&https://pic3.zhimg.com/v2-72fb32a79ecbe935df889174_r.jpg&&&/figure&&p&但是实际环境中并不推荐如上所示的 commit 用法,具体可以查看《Docker 从入门到实践》中的描述,总结下来为三点:&/p&&ol&&li&由于 commit 命令的执行,有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。&/li&&li&使用 commit 生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。&/li&&li&不符合分层存储的概念,即除当前层外,之前的每一层都是不会发生改变的。&/li&&/ol&&p&本节最后再说一点,细心的读者肯定观察到我们启动 webserver 的时候 &code&docker run&/code& 命令用到了 &code&-d&/code& 参数,那么不用这个命令会有什么效果呢?我们来试一下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run ubuntu:16.04 /bin/sh -c & sleep 1; done&
hello world
hello world
hello world
hello world
&/code&&/pre&&/div&&p&容器会把输出的结果 (STDOUT) 打印到宿主机上面。是的,这个参数的作用就是让 Docker 容器在后台以守护态(Daemonized)形式运行,即后台运行。&/p&&blockquote&-d Run container in background and print container ID&/blockquote&&p&如果我们在如上命令中加入 &code&-d&/code& 命令,那么这些 hello world 信息就需要通过如下命令来查看了,其中 ID 是容器的名称:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker logs ID
&/code&&/pre&&/div&&h2&4.3 利用 Dockerfile 定制镜像&/h2&&p&利用 Dockerfile,之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。&/p&&p&在本机上登陆你的 Docker 账户,以便之后发布使用,如果没有请到 &a href=&https://link.zhihu.com/?target=https%3A//cloud.docker.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cloud.docker.com&/a& 注册一个。本机登陆命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker login
&/code&&/pre&&/div&&p&所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。本部分以一个简单的 web 服务器为例,记录定制镜像的操作步骤。首先,新建一个文件夹 newdocker 并进入:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&mkdir newdocker && cd newdocker
&/code&&/pre&&/div&&p&然后在当前目录新建一个 Dockerfile 文件,内容如下所示:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# Dockerfile
# 使用 Python 运行时作为基础镜像
FROM python:2.7-slim
# 设置 /app 为工作路径
WORKDIR /app
# 将当前目录所有内容复制到容器的 /app 目录下
ADD . /app
# 安装 requirements.txt 中指定的包
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 对容器外开放80端口
# 定义环境变量
ENV NAME World
# 当容器启动时运行 app.py
CMD [&python&, &app.py&]
&/code&&/pre&&/div&&p&以上内容中,我们用 &code&FROM&/code& 指定基础镜像,在 Docker Store 上有非常多的高质量的官方镜像,服务类镜像如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;各种语言应用镜像如 node、openjdk、python、ruby、golang 等;操作系统镜像如 ubuntu、debian、centos、fedora、alpine。除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch。直接 &code&FROM scratch&/code& 会让镜像体积更加小巧。&/p&&p&&code&RUN&/code& 指令是用来执行命令行命令的。由于我们的例子中只有一行 RUN 代码,我们来看看多行 RUN 的情况,如下代码所示:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget -O redis.tar.gz &http://download.redis.io/releases/redis-3.2.5.tar.gz&
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
&/code&&/pre&&/div&&blockquote&Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。&br&而上面的这种写法,创建了 7 层镜像。这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学 Docker 的人常犯的一个错误。&/blockquote&&p&正确的写法应该这样:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz &http://download.redis.io/releases/redis-3.2.5.tar.gz& \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
&/code&&/pre&&/div&&p&值得注意的是最后添加了清理工作的命令,删除了为了编译构建所需要的软件,清理了所有下载、展开的文件,并且还清理了 apt 缓存文件。&/p&&p&好了,以上内容走的有些远,我们回到 Dockerfile。由于以上代码用到了 app.py 和 requirements.txt 两个文件,接下来我们来进一步完善,requirements.txt 内容如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Flask
&/code&&/pre&&/div&&p&app.py 内容如下:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&from&/span& &span class=&nn&&flask&/span& &span class=&kn&&import&/span& &span class=&n&&Flask&/span&
&span class=&kn&&from&/span& &span class=&nn&&redis&/span& &span class=&kn&&import&/span& &span class=&n&&Redis&/span&&span class=&p&&,&/span& &span class=&n&&RedisError&/span&
&span class=&kn&&import&/span& &span class=&nn&&os&/span&
&span class=&kn&&import&/span& &span class=&nn&&socket&/span&
&span class=&c1&&# Connect to Redis&/span&
&span class=&n&&redis&/span& &span class=&o&&=&/span& &span class=&n&&Redis&/span&&span class=&p&&(&/span&&span class=&n&&host&/span&&span class=&o&&=&/span&&span class=&s2&&&redis&&/span&&span class=&p&&,&/span& &span class=&n&&db&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&socket_connect_timeout&/span&&span class=&o&&=&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&socket_timeout&/span&&span class=&o&&=&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span&
&span class=&n&&app&/span& &span class=&o&&=&/span& &span class=&n&&Flask&/span&&span class=&p&&(&/span&&span class=&n&&__name__&/span&&span class=&p&&)&/span&
&span class=&nd&&@app.route&/span&&span class=&p&&(&/span&&span class=&s2&&&/&&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&hello&/span&&span class=&p&&():&/span&
&span class=&k&&try&/span&&span class=&p&&:&/span&
&span class=&n&&visits&/span& &span class=&o&&=&/span& &span class=&n&&redis&/span&&span class=&o&&.&/span&&span class=&n&&incr&/span&&span class=&p&&(&/span&&span class=&s2&&&counter&&/span&&span class=&p&&)&/span&
&span class=&k&&except&/span& &span class=&n&&RedisError&/span&&span class=&p&&:&/span&
&span class=&n&&visits&/span& &span class=&o&&=&/span& &span class=&s2&&&&i&cannot connect to Redis, counter disabled&/i&&&/span&
&span class=&n&&html&/span& &span class=&o&&=&/span& &span class=&s2&&&&h3&Hello {name}!&/h3&&&/span& \
&span class=&s2&&&&b&Hostname:&/b& {hostname}&br/&&&/span& \
&span class=&s2&&&&b&Visits:&/b& {visits}&&/span&
&span class=&k&&return&/span& &span class=&n&&html&/span&&span class=&o&&.&/span&&span class=&n&&format&/span&&span class=&p&&(&/span&&span class=&n&&name&/span&&span class=&o&&=&/span&&span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&getenv&/span&&span class=&p&&(&/span&&span class=&s2&&&NAME&&/span&&span class=&p&&,&/span& &span class=&s2&&&world&&/span&&span class=&p&&),&/span& &span class=&n&&hostname&/span&&span class=&o&&=&/span&&span class=&n&&socket&/span&&span class=&o&&.&/span&&span class=&n&&gethostname&/span&&span class=&p&&(),&/span& &span class=&n&&visits&/span&&span class=&o&&=&/span&&span class=&n&&visits&/span&&span class=&p&&)&/span&
&span class=&k&&if&/span& &span class=&n&&__name__&/span& &span class=&o&&==&/span& &span class=&s2&&&__main__&&/span&&span class=&p&&:&/span&
&span class=&n&&app&/span&&span class=&o&&.&/span&&span class=&n&&run&/span&&span class=&p&&(&/span&&span class=&n&&host&/span&&span class=&o&&=&/span&&span class=&s1&&'0.0.0.0'&/span&&span class=&p&&,&/span& &span class=&n&&port&/span&&span class=&o&&=&/span&&span class=&mi&&80&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&我们不探讨以上代码具体的实现,其实简单来看我们可以知道这是用 python 写的一个简单的 web 服务器。其中需要注意的地方是由于没有运行 Redis (我们只安装了 Python 库,而不是 Redis 本身),所以在运行镜像时应该期望在这部分产生错误消息(见下文图)。到这里,当前目录应该是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ls
Dockerfile
requirements.txt
&/code&&/pre&&/div&&p&接着,我们在当前目录开始构建这个镜像吧。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# -t 可以给这个镜像取一个名字(tag)
docker build -t friendlyhello .
&/code&&/pre&&/div&&p&以上代码用到了 &code&docker build&/code& 命令,其格式如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker build [选项] &上下文路径/URL/-&
&/code&&/pre&&/div&&p&值得注意的是上下文路径这个概念。在本例中我们用 &code&.&/code& 定义,那么什么是上下文环境呢?这里我们需要了解整个 build 的工作原理。&/p&&blockquote&Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。&/blockquote&&p&&code&docker build&/code& 得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。当我们代码中使用到了诸如 &code&COPY&/code&等指令时,服务端会根据该指令复制调用相应的文件。但由于整个文件中&/p&&p&构建完毕,新镜像放在哪里呢?&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker image ls
REPOSITORY
friendlyhello
73ff8ff81235
5 minutes ago
48bcb7b903a4
About an hour ago
4 days ago
hello-world
e38bc07ac18e
5 days ago
b175e7467d66
6 days ago
b16fde09c92c
3 weeks ago
&/code&&/pre&&/div&&p&接下来,我们运行它(若是要后台运行则记得加上 &code&-d&/code& 参数):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run -p 4000:80 friendlyhello
&/code&&/pre&&/div&&figure&&img src=&https://pic3.zhimg.com/v2-70f818f99a497e0e67f7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1834& data-rawheight=&1014& class=&origin_image zh-lightbox-thumb& width=&1834& data-original=&https://pic3.zhimg.com/v2-70f818f99a497e0e67f7_r.jpg&&&/figure&&p&你可以通过浏览器查看效果,也可以通过 &code&curl&/code& 命令获得相同的内容:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&curl http://localhost:4000
# 输出结果
&h3&Hello World!&/h3&&b&Hostname:&/b& &br/&&b&Visits:&/b& &i&cannot connect to Redis, counter disabled&/i&
&/code&&/pre&&/div&&p&接下来我们发布这个镜像到 Docker Hub。首先,你可以给这个镜像打上一个 tag(可选项):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# tag 格式
docker tag image username/repository:tag
# 本例中的运行命令
docker tag friendlyhello hijiangtao/friendlyhello:v1
&/code&&/pre&&/div&&p&接着将它发布:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# push 格式
docker push username/repository:tag
# 本例中的运行命令
docker push hijiangtao/friendlyhello:v1
&/code&&/pre&&/div&&p&至此,大功告成。现在你可以在任意一台配有 docker 环境的机器上运行该镜像了。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&docker run -p 4000:80 hijiangtao/friendlyhello:v1
&/code&&/pre&&/div&&p&如果我们经常更新镜像,可以尝试使用自动创建(Automated Builds)功能来简化我们的流程,这一块可以结合 GitHub 一起操作,对于需要经常升级镜像内程序来说,这会十分方便。本文中所述的镜像就托管在 &a href=&https://link.zhihu.com/?target=https%3A//github.com/hijiangtao/friendlyhello-docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub&/a&。&/p&&p&使用自动构建前,首先要要将 GitHub 或 Bitbucket 帐号连接到 Docker Hub。如果你使用了这种方式,那么每次你 &code&git commit&/code& 之后都应该可以在你的 docker cloud 上看到类似下方的镜像构建状态。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-13b74aca6c8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2152& data-rawheight=&494& class=&origin_image zh-lightbox-thumb& width=&2152& data-original=&https://pic2.zhimg.com/v2-13b74aca6c8_r.jpg&&&/figure&&h2&五、总结&/h2&&p&整体来说,Docker 是一个越看越有意思的概念,值得我们深入了解。但是其中也存在很多技巧,比如就 Docker 技术三剑客来说,这些是官方插件,简化了 Docker在多服务和多机器环境下的功能配置,但若没有弄懂 Docker 之前就去了解反而会让自己越看越绕。另一方面则是随着时间的推移,很多曾经 Docker 推荐的方式正在被淘汰,比如在非 Linux 环境下的 Boot2Docker,这也需要我们学习者在了解的过程中对做好区分,否则也会事倍功半。&/p&&p&本文着重总结了 Docker 的概念与简单的上手实践,对于 Docker 的广泛运用场景没有做过多介绍,但其实我们可以利用 Docker 做很多有意思的事情,作为一个可以用于流水线管理、能够应用隔离、具有快速高效部署等诸多特点的技术,往好的方面想可以允许我们快速实现应用在线上部署的表现一致化,远离“这段代码在我电脑上运行没问题啊”的烦恼并减轻硬件服务器负担,往不好的方面想可以通过服务器超售大赚一笔...&/p&&h2&六、参考&/h2&&ul&&li&&i&&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Docker_%28software%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker&/a&&/i&&/li&&li&&i&&a href=&https://link.zhihu.com/?target=https%3A//legacy.gitbook.com/book/yeasy/docker_practice& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker 从入门到实践&/a&&/i&&/li&&li&&i&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/pangguoping/articles/5515286.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker容器与虚拟机区别&/a&&/i&&/li&&li&&i&&a href=&https://link.zhihu.com/?target=http%3A//marklux.cn/blog/55& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker三剑客实践之部署集群&/a&&/i&&/li&&li&&i&&a href=&https://link.zhihu.com/?target=https%3A//docs.docker.com/get-started/part2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Get Started with Docker&/a&&/i& &/li&&/ul&&hr&&blockquote&&i&原文链接 &a href=&https://link.zhihu.com/?target=https%3A//github.com/hijiangtao/friendlyhello-docker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Docker 学习新手笔记:从入门到放弃&/a&&/i&&/blockquote&&p&个人公众号,微信搜索「&b&黯晓&/b&」或者扫描 &b&&a href=&https://link.zhihu.com/?target=https%3A//hijiangtao.github.io/assets/pic/qrcode_for_gh_4e090cdcbcc5_258.jpg& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&二维码&/a&&/b& 关注,会同步我在&b&&a href=&https://zhuanlan.zhihu.com/makewebgreatagain& class=&internal&&知乎&/a&&/b&及&b&&a href=&https://link.zhihu.com/?target=https%3A//hijiangtao.github.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&个人博客&/a&&/b&上发表的文章,谈谈前端技术与日常有趣事。使用知乎的同学可以关注我的专栏&b&&a href=&https://zhuanlan.zhihu.com/makewebgreatagain& class=&internal&&初级前端工程师&/a&&/b&。&/p&&p&生活中难免犯错,请多多指教!&/p&
全文较长,大致需要半小时左右时间阅读,若你已经有所基础,可以根据自己的了解程度选择从何处看起。本文记录的是作为一个新手,从了解 Docker 是什么、Docker 技术包含哪些概念到上手使用、安装以及发布 Docker 镜像的整个过程。作者在学习过程中参阅了诸…
&figure&&img src=&https://pic4.zhimg.com/v2-bbb537eed5ffcfc4656cce04d67fb645_b.jpg& data-rawwidth=&562& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&562& data-original=&https://pic4.zhimg.com/v2-bbb537eed5ffcfc4656cce04d67fb645_r.jpg&&&/figure&&blockquote&作者:lufficc&br&链接:&a href=&https://link.zhihu.com/?target=https%3A//lufficc.com/blog/useful-online-tools& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&lufficc.com/blog/useful&/span&&span class=&invisible&&-online-tools&/span&&span class=&ellipsis&&&/span&&/a&&br&码农有道作了部分修改&/blockquote&&h2&&b&&i&一、regex101&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=https%3A//regex101.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&regex101.com/&/span&&span class=&invisible&&&/span&&/a&&/b&&/p&&p&强大的正则表达式工具,你可以实时查看匹配信息,并且会用不同的颜色将 Group 标记出来。而且有 Quick Reference 来帮助你记忆正则表达式的规则和 Explanation 对你的正则表达式进行解释。重要的是,支持直接生成多种语言的代码。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-aa628b2c91f37aebae5bd3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&444& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-aa628b2c91f37aebae5bd3_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-eec76ec1c9a68d778fda_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&621& data-rawheight=&296& class=&origin_image zh-lightbox-thumb& width=&621& data-original=&https://pic4.zhimg.com/v2-eec76ec1c9a68d778fda_r.jpg&&&/figure&&h2&&b&&i&二、visualgo&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=https%3A//visualgo.net/en& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&visualgo.net/en&/span&&span class=&invisible&&&/span&&/a&&/b&&/p&&p&各种算法可视化,网上很多算法的动态图片就是用它做的。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-44b7d4bcec74b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&248& data-thumbnail=&https://pic4.zhimg.com/v2-44b7d4bcec74b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/v2-44b7d4bcec74b_r.jpg&&&/figure&&h2&&b&&i&三、math&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=https%3A//webdemo.myscript.com/views/math.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&webdemo.myscript.com/vi&/span&&span class=&invisible&&ews/math.html&/span&&span class=&ellipsis&&&/span&&/a&&/b&&/p&&p&在线计算器,可以识别手写的复杂表达式,而且画出函数图像,支持导出为Latex、MathML、SymbolTree等格式。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-6b6d8a76bc9e637c7ef2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&639& data-rawheight=&325& data-thumbnail=&https://pic2.zhimg.com/v2-6b6d8a76bc9e637c7ef2_b.jpg& class=&origin_image zh-lightbox-thumb& width=&639& data-original=&https://pic2.zhimg.com/v2-6b6d8a76bc9e637c7ef2_r.jpg&&&/figure&&h2&&b&&i&四、mathcha&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=https%3A//www.mathcha.io/editor& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&mathcha.io/editor&/span&&span class=&invisible&&&/span&&/a&&/b&&/p&&p&强大的数学表达式在线编辑工具,可以导出为PDF、Latex等格式。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-64aeb2cb61fc364b6e12_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&983& data-rawheight=&940& class=&origin_image zh-lightbox-thumb& width=&983& data-original=&https://pic3.zhimg.com/v2-64aeb2cb61fc364b6e12_r.jpg&&&/figure&&h2&&b&&i&五、desmos Graphing Calculator&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=https%3A//www.desmos.com/calculator& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&desmos.com/calculator&/span&&span class=&invisible&&&/span&&/a&&/b&&/p&&p&非常强大的在线作图工具,而且支持动画(支持函数动态变化),界面也非常简洁耐看。 &/p&&figure&&img src=&https://pic2.zhimg.com/v2-16ac318de81b79b301e89f0f04914ef4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-16ac318de81b79b301e89f0f04914ef4_r.jpg&&&/figure&&h2&&b&&i&六、asciiflow&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=http%3A//asciiflow.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asciiflow.com/&/span&&span class=&invisible&&&/span&&/a&&/b&&/p&&p&Ascii 作图工具,很强大。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bd4de96b5f6bd029f1dd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&496& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&496& data-original=&https://pic4.zhimg.com/v2-bd4de96b5f6bd029f1dd_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-caae9dc87bcb29e6e3c8e6a709e1a9bb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-caae9dc87bcb29e6e3c8e6a709e1a9bb_r.jpg&&&/figure&&h2&&b&&i&七、cloudconvert&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=https%3A//cloudconvert.com/formats& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&cloudconvert.com/format&/span&&span class=&invisible&&s&/span&&span class=&ellipsis&&&/span&&/a&&/b&&/p&&p&一个格式转换网站,太强大了,你能想到的格式转换几乎都有。 &/p&&figure&&img src=&https://pic2.zhimg.com/v2-6cbec12e8fd1af82230c9a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-6cbec12e8fd1af82230c9a_r.jpg&&&/figure&&h2&&b&&i&八、latex2png&/i&&/b&&/h2&&p&&b&官方网站:&a href=&https://link.zhihu.com/?target=http%3A//latex2png.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&latex2png.com/&/span&&span class=&invisible&&&/span&&/a&&/b&&/p&&p&将 Latex 表达式转换为漂亮的、透明的 PNG 图片,很实用的网站。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-262edd812c968a4cf9edeb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&493& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-262edd812c968a4cf9edeb_r.jpg&&&/figure&&p&&/p&
作者:lufficc 链接: 码农有道作了部分修改一、regex101官方网站:强大的正则表达式工具,你可以实时查看匹配信息,并且会用不同的颜色将 Group 标记出来。而且有 Quick Reference 来帮助你记忆正则表达式的规则和…
64种。理由如下:&br&对其进行分类:&br&取整方式:向下取整 向上取整 (共2种)&br&区间开闭:闭区间 左闭右开区间 左开右闭区间 开区间 (共4种)&br&问题类型:&br&对于不下降序列a,求最小的i,使得a[i] = key&br&对于不下降序列a,求最大的i,使得a[i] = key&br&对于不下降序列a,求最小的i,使得a[i] & key&br&对于不下降序列a,求最大的i,使得a[i] & key&br&对于不上升序列a,求最小的i,使得a[i] = key&br&对于不上升序列a,求最大的i,使得a[i] = key&br&对于不上升序列a,求最小的i,使得a[i] & key&br&对于不上升序列a,求最大的i,使得a[i] & key&br&(共8种)&br&综上所述,二分查找共有 &img src=&//www.zhihu.com/equation?tex=2%5Ctimes+4%5Ctimes+8%3D64& alt=&2\times 4\times 8=64& eeimg=&1&& 种写法。&br&&br&算法的目的是解决问题,下面以针对不下降序列a的4个问题为例,给出我认为效率较高,较为简洁的代码。&br&对于不下降序列a,n为序列a元素的个数,key为关键字:&br&1.求最小的i,使得a[i] = key,若不存在,则返回-1&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&nf&&binary_search_1&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&a&/span&&span class=&p&&[],&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&key&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&m&/span&&span class=&p&&,&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&n&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&&span class=&c1&&//闭区间[0, n - 1]&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&n&&l&/span& &span class=&o&&&&/span& &span class=&n&&r&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&l&/span& &span class=&o&&+&/span& &span class=&p&&((&/span&&span class=&n&&r&/span& &span class=&o&&-&/span& &span class=&n&&l&/span&&span class=&p&&)&/span& &span class=&o&&&&&/span& &span class=&mi&&1&/span&&span class=&p&&);&/span&&span class=&c1&&//向下取整&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&m&/span&&span class=&p&&]&/span& &span class=&o&&&&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&n&&m&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&k&&else&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&m&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&r&/span&&span class=&p&&]&/span& &span class=&o&&==&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&n&&r&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&2.求最大的i,使得a[i] = key,若不存在,则返回-1&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&nf&&binary_search_2&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&a&/span&&span class=&p&&[],&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&key&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&m&/span&&span class=&p&&,&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&n&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&&span class=&c1&&//闭区间[0, n - 1]&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&n&&l&/span& &span class=&o&&&&/span& &span class=&n&&r&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&l&/span& &span class=&o&&+&/span& &span class=&p&&((&/span&&span class=&n&&r&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span& &span class=&o&&-&/span& &span class=&n&&l&/span&&span class=&p&&)&/span& &span class=&o&&&&&/span& &span class=&mi&&1&/span&&span class=&p&&);&/span&&span class=&c1&&//向上取整&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&m&/span&&span class=&p&&]&/span& &span class=&o&&&=&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&n&&m&/span&&span class=&p&&;&/span&
&span class=&k&&else&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&m&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&]&/span& &span class=&o&&==&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&n&&l&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&3.求最小的i,使得a[i] & key,若不存在,则返回-1&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&nf&&binary_search_3&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&a&/span&&span class=&p&&[],&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&key&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&m&/span&&span class=&p&&,&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&n&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&&span class=&c1&&//闭区间[0, n - 1]&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&n&&l&/span& &span class=&o&&&&/span& &span class=&n&&r&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&l&/span& &span class=&o&&+&/span& &span class=&p&&((&/span&&span class=&n&&r&/span& &span class=&o&&-&/span& &span class=&n&&l&/span&&span class=&p&&)&/span& &span class=&o&&&&&/span& &span class=&mi&&1&/span&&span class=&p&&);&/span&&span class=&c1&&//向下取整&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&m&/span&&span class=&p&&]&/span& &span class=&o&&&=&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&n&&m&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&k&&else&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&m&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&r&/span&&span class=&p&&]&/span& &span class=&o&&&&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&n&&r&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&4.求最大的i,使得a[i] & key,若不存在,则返回-1&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&nf&&binary_search_4&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&a&/span&&span class=&p&&[],&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&key&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&m&/span&&span class=&p&&,&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&n&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&&span class=&c1&&//闭区间[0, n - 1]&/span&
&span class=&k&&while&/span& &span class=&p&&(&/span&&span class=&n&&l&/span& &span class=&o&&&&/span& &span class=&n&&r&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&m&/span& &span class=&o&&=&/span& &span class=&n&&l&/span& &span class=&o&&+&/span& &span class=&p&&((&/span&&span class=&n&&r&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span& &span class=&o&&-&/span& &span class=&n&&l&/span&&span class=&p&&)&/span& &span class=&o&&&&&/span& &span class=&mi&&1&/span&&span class=&p&&);&/span&&span class=&c1&&//向上取整&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&m&/span&&span class=&p&&]&/span& &span class=&o&&&&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&n&&l&/span& &span class=&o&&=&/span& &span class=&n&&m&/span&&span class=&p&&;&/span&
&span class=&k&&else&/span& &span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&m&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&]&/span& &span class=&o&&&&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&n&&l&/span&&span class=&p&&;&/span&
&span class=&k&&return&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&实际上,对于3、4,也可以先判断解是否存在,再进行二分查找。&br&&br&显然,上面的代码还不够简洁。下面给出我认为最简洁的代码:&br&1.&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&lower_bound&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&o&&-&/span& &span class=&n&&a&/span&&span class=&p&&;&/span&
&span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&n&&ans&/span& &span class=&o&&==&/span& &span class=&n&&n&/span& &span class=&o&&||&/span& &span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&ans&/span&&span class=&p&&]&/span& &span class=&o&&!=&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&o&&?&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span& &span class=&o&&:&/span& &span class=&n&&ans&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&2.&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&upper_bound&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&o&&-&/span& &span class=&n&&a&/span&&span class=&p&&;&/span&
&span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&n&&ans&/span& &span class=&o&&==&/span& &span class=&mi&&0&/span& &span class=&o&&||&/span& &span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&n&&ans&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&o&&!=&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&o&&?&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span& &span class=&o&&:&/span& &span class=&n&&ans&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&3.&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&upper_bound&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&o&&-&/span& &span class=&n&&a&/span&&span class=&p&&;&/span&
&span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&n&&ans&/span& &span class=&o&&==&/span& &span class=&n&&n&/span&&span class=&p&&)&/span& &span class=&o&&?&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span& &span class=&o&&:&/span& &span class=&n&&ans&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&4.&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&lower_bound&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span& &span class=&n&&a&/span& &span class=&o&&+&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&key&/span&&span class=&p&&)&/span& &span class=&o&&-&/span& &span class=&n&&a&/span&&span class=&p&&;&/span&
&span class=&n&&ans&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&n&&ans&/span& &span class=&o&&==&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span& &span class=&o&&?&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span& &span class=&o&&:&/span& &span class=&n&&ans&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&br&(逃
64种。理由如下: 对其进行分类: 取整方式:向下取整 向上取整 (共2种}

我要回帖

更多关于 空调出现e1是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信