首页 文章 精选 留言 我的

精选列表

搜索[知识管理],共10000篇文章
优秀的个人博客,低调大师

DockerFile的编写和注意的一些知识点

CMD,RUN,ENTRYPOINT之类的差别。 VOLUMN和-V之间的差别。 EXPOSE和-P的对应等。 今天上午写了一个脚本,可以传参数进IMAGE,让启动的CONTAINER具有不同的行为。 另外是一些常用的方便命令: 删除所有正在运行的容器(先停止,再删除)。 docker stop $(docker ps -q) && docker rm $(docker ps -a -q) 启动镜像(包括端口映射,目录挂载-如果windows,那不是挂windows目录,是虚拟机目录,命令容器,传递参数) docker run -p 8889:80 -v /applog:/var/log/nginx --name testprism333 prism3 -e PRD ============================= 如果在Dockerfile中同时写了entrypoint和cmd,docker在build过程中会将cmd中指定的内容作为entrypoint的参数。 那么如果,我们希望每个容器都固定的执行一个config脚本,然后再运行特定的程序时,利用entrypoint和cmd可以如何做到呢?从上述分析可以很自然的想到,将entrypoint解析CMD参数,并以命令执行。 CMD命令的参数格式,一般写成 字符串数组的方式,如上面的例子。如: CMD ["echo","hello world"] 虽然也可写成CMD echo hello word 方式,但这样docker会在指定的命令前加 /bin/sh -c 执行,有时有可能会出问题。 所以推荐采用数据结构的方式来存放命令。 dockerfile 中的 ENTRYPOINT 和 CMD 看似一样,都是实现 container 启动命令,但是需要注意: 1、都有两种方式,数组方式,以及 shell 方式 ? 1 2 [ "sh" , "-c" , "echo hello" ] sh -c 'echo hello' 2、ENTRYPOINT 除了指定 container 入口之外,更重要的作用是: 通过它可以让一个 container 像一个 executable 一样。比如 ? 1 ENTRYPOINT ["/bin/sh"] 之后 build 出来的镜像就像一个 sh 程序文件一样,运行该 image,就像运行 sh 程序。 3、如果 ENTRYPOINT 指定了,并且采用了数组方式,即["exectable", "para1", "para2"],那么 CMD 指定的内容会被视为 ENTRYPOINT 数组中最后的一个参数 4、如果 ENTRYPOINT 使用 shell 方式,那么它会覆盖所有的 CMD 以及docker run后面指定的 command 5、docker run后面指定的 command 会取代 CMD 的内容 ============================= From nginx MAINTAINER Prism DevOps@pxx.com.cn WORKDIR /usr/local/nginx/html ENV NGINX_ROOT_DIR /usr/local/nginx/html VOLUME ["/applog", "/data"] RUN mkdir -p /var/devops/ COPY bootstart.sh /var/devops/bootstart.sh ENTRYPOINT ["/bin/bash", "/var/devops/bootstart.sh"] CMD ["-h"] #!/bin/bash # description: dockerfile function depend on CMD and ENTRYPOINT arg # author: chngjun855 # version alpha # date 2017-05-18 # get args while getopts "e:i:g:h" arg do case $arg in e) env=$OPTARG ;; i) ipaddr=$OPTARG ;; g) group=$OPTARG ;; h) echo "/bin/bash bootstart.sh -e [ENV] -i [ipaddress] -g [group]" ;; ?) echo "unknow argument, -e -i -g" exit 1 esac done echo "env is $env" echo "ipaddr is $ipaddr" echo "group is $group" # different function depend on different env arg case $env in FAT) echo "FAT html page" > /usr/share/nginx/html/test.html ;; UAT) echo "UAT html page" > /usr/share/nginx/html/test.html ;; PRD) echo "PRD html page" > /usr/share/nginx/html/test.html ;; esac nginx -g "daemon off;"

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

前端也应该了解点 docker 知识:docker 的理念与场景

我觉着你是看了题目点进来的。前端和 docker 这俩八竿子打不着的有毛关系?那接下来我们就扯一扯,看看能不能把它俩扯一块。 首先得达成共识,现在的前端已经不是以前的狭义的前端,如果指狭义的前端,那真是半毛钱关系都没有。但你我不可否认的是,现在是大前端的时代。什么是大前端,详细的应该大老板来给解释下,但是这里还是简单的去说一下: 前端有了 Node.js,扩展到了服务端的边界,未来有更多的可能。 前端现在也逐渐的正规化,工程化,编译,测试,发布逐渐完善。 我们是工程师,技术工种,抛开限定,多了解点技术岂不是更好。 看到这里,你可能心想,要是这么说,那确实可能是有那么一点关系。如果意识到这一点,我们已经成功拉近了 1/3 距离 。 其次,这篇(系列)文章还是定位 docker 的入门文章,即使不是前端的同学来看,也能对 docker 的架构,应用场景有个一定的了解,当你听其它基友讨论 docker 的时候,也能插上一嘴。 按照惯例,先来列个提纲或者叫先挖个坑: docker 的历史和发展(系列一) docker 的理念与场景 (系列一) mac 上安装 docker (系列二) docker 架构 (系列二) docker 重要命令简介 (系列三) docker 实战 (系列四) DokerFile 及最佳实践 docker-compose 等编排工具 网络 存储 集群 其它 1. docker 的历史和发展 回顾下历史及发展历程也算是国际惯例了,docker 的发展也充满着传奇色彩。 当时,这个公司的名称还是叫dotCloud, 提供 Pass 服务,docker 是他们公司的一个内部项目。 2013 年 3 月 docker 正式发布开源版本。 上图是 docker 的 GitHub commit 图,看看是多么的活跃。还有那 27000+ 的星星。 后来dotCloud一看 docker 这么火,于是把公司名也改成了 docker 了。 一家公司玩终究玩不出大花样来,而是一堆的国际巨头型的公司的介入,大批的开发者提交代码。 2013 年 11 月 RHEL 6.5 发布,集成了对 docker 的支持, 拉开了各大厂商竞相支持 docker 的大幕。 2014 年 4 月开始,亚马逊,谷歌,微软在他们的云产品中已经开始支持 docker。 2014 年 6 月,DockerCon 2014 召开,谷歌, IBM , 微软, Facebook, twitter 等公司参与。于此同时 docker 1.0 正式发布。 … 2015 年 4 月, docker 完成了 D 轮 $9500w 融资。 而在国内,也是火的一塌糊涂,各个云厂商,各种大会,都能看到 docker 的身影。 2. docker 的理念 理念,往往是为解决痛点而生,就像 KISS(Keep it sample and stupid)为复杂程序而生一样,docker 的理念是 build,ship, run。 2.1 build 好吧,作为前端这个单词不陌生吧,你的项目目录下面在几天之前可能还有一个 build 目录,现在接入ff进行云端 build,只是把 build 换了个地方。 按照前端的理解,build 就是编译,打包的意思,和其它静态语言如 c/c++ 之流一样,在保证应用能跑起来之前所做的一些列动作。 常规的 build 有什么问题呢?它不能打包环境。 如果你有打包 rpm 的经历,你可能清楚,你要区分系统的版本,cpu 的架构,从而打出特定平台和系统下的软件包。换句话讲,你 build 一次只能跑在一个特定地方。 如果做过 Java 的同学可能清楚当年为啥 Java 会火起来,编写一次,到处运行,就是因为 Java 有 JVM ,其实 docker 从某种角度看就属于 JVM 的角色。 前端能不能做到 build 一次,各端运行呢?就要出现一个运行时的东西,屏蔽各端差异,从这种角度考虑,react 可能勉强算一个。 回到正题,docker 的 build 做了什么工作呢? 我们来看一下 docker build 的描述文件DockerFile: FROM centos:centos6MAINTAINER yourname@example.comRUN yum -y update; yum clean allRUN yum -y install epel-release; yum clean allRUN yum -y install nodejs npm; yum clean all# copy 程序代码到容器的/src 下ADD . /srcRUN cd /src; npm installEXPOSE 8080CMD ["node", "/src/index.js"] 上面就是一个简单的 Node.js 应用的 build 描述文件,docker 根据这个描述文件来 build 出来一个镜像,一个可以到处运行的镜像。 我们看一下第一个关键字FROM, 它的意思是要从哪里作为基础镜像来制作你现有的镜像。拿我们淘宝来讲,我们假设有一个 Midway 的 docker 镜像,这里面已经做好了运行 Midway 应用的所有环境准备,那么,你在开发,测试,线上,都可以使用同一个Midway的镜像,如果你基于 Midway 的 4.0 版本,那你就FROM Midway: 4.0, 如果想用 5.0 就FROM Midway: 5.0。 那从上面 Midway 的例子来看,Midway 的镜像就是包含了 Midway 的环境,不管你是 windows,mac,linux,只要是能用 docker,都能保证你的开发,测试,部署的环境的一致。 这要是搁到以前呢?卧槽,Node.js 版本不对啊,环境变量不对啊,程序放的目录不对啊,诸如此类环境不一致带来的问题将一去不复返。 总结来讲,docker 具有的这种能够打包环境能力,是它能到处运行的关键。 2.2 ship 字面意思就是货船,搬运,发布的意思。 看看我们目前的发布机制,基本上是原理是,本机 git push 到 GitLab, 服务器上 git pull 。 从这点上来看和 docker 的异曲同工的。 把制作好的镜像 docker push 到 dockerhub ( 致敬 GitHub ?) 或者私有 registry(你可以理解为 git 对应的 GitLab ),用户通过 docker pull 到本地,同样一会 pull 差异性的部分。这也是 docker 进行版本控制的一种方式 。 docker 拥有 dockerhub ,相较于程序员拥有 GitHub 一样,是个大宝库,这也是 docker 生态中很重要的一环。 但差异点在哪里呢? 传统的发布只是把代码或者程序发布到线上,如果不涉及类似 Node.js 版本升级,npm 模块升级,环境变量更迭及其它代码之外的的变更,其实是凸显不出 docker 的优势的。 docker 不仅分发镜像,也可以分发镜像的描述文件DockerFile, 比如你想让测试在你的环境里面去测试和复现 bug,不用提供个头稍微大一些的镜像,给他一个文本文件就好了。 所以 docker 的官网上也明确的说明了受益人是需要做应用分发的开发者和运维同学。 2.3 run 很好理解,就是运行的意思。 先来看看当前的程序运行模式。 对于传统前端来讲,把静态文件放到 web 服务器的对应目录就可以了,不涉及其它动作。对于 Node.js 类应用来讲可能会复杂一点,不仅仅是把应用代码发布上去就能生效,可能涉及到应用关停等影响服务可用性的动作。 那么 docker 的优势体现在哪里? run anywhere , 也就是可以运行在任何可以运行 docker 容器的机器上。如果你的应用就是固定的两台设备,这体现不出 docker 的优势,但如果你的应用分布在不同的地方,甚至不同的云服务上,都可以保证正常的秒级启动。那这也给我们在突发流量的时候可以迅速实现扩容。 非常轻量,和传统的进程没太大差别,这也是相对于传统的 vm 非常大的一个优势。 资源隔离, 保证各个应用之间不相互影响,同时充分利用机器资源。 其它(各位可以自行补充) 2.4 总结 如果这么拆开了来分析其实对 docker 是不公平的,因为人家是 build, ship, run 提供的是一整套解决方案。 我们了解了 docker 的理念,反观我们当前的开发,应用部署模式,docker 的应用场景有哪些? 需要重复配置统一的环境 一个团队开发同一个程序,需要一致的开发环境,在之前你可能每个成员在自己电脑上配置一遍,但使用 docker 基本是配置一遍,其他同学共享就可以了 减少持续集成和测试的难度,我们清楚集成和测试的一大难点就是环境一致性问题 减少开发,测试,线上因为环境不一致而出现的问题的几率 世界上有很多知名和成熟的镜像,我们可以拿来用就可以了,提高效率 快速,高效利用当前资源 勤俭节约是中华民族的传统美德,有时候一个容器就能完成的事情,我们申请一台 vm,资源有些浪费。 生产一台 vm 是分钟级别的,而一台容器却是秒级的,这种优势在大规模需要迅速实现扩容才会凸显出来。 需要资源隔离的场景 比如一些多租户的环境里面,一个用户的失控比如程序把内存吃光,把带宽打满都是常有的事情,而 docker 就可以很好的在这些方面做好控制 需要快速动态的伸缩容量的场景 比如说大促,开始之前迅速扩容,结束之后迅速销毁 微服务 这也是当前一个很火的话题 docker 的场景不仅仅是这些,以上仅仅是结合淘宝前端的现状,YY 出来的一些可能的场景。 docker 不是银弹, 个人觉着就像我们对待 Node.js 一样,在合适的场景合理的利用。 下期预告 在下一期里面我们的小明将会出场,通过一些问答的方式来描述下 docker 的架构相关的概念和理解,如下: Q 1: 我的笔记本是 mac ,为什么我安装的时候还要装 virtualbox ? Q 2: 原来如此,怪不得第一步先让我 docker-machine 创建一个 vm 来跑 docker,那这个 docker-machine 是干什么的 ? Q 3: 你能解释下 docker run hello-world , 都发生了什么? 下下期预告 Q 4: 一个容器终归没什么意思,那么容器之间是怎么通信的? Q 5: 镜像是静态的,那我的代码怎么部署进去? Q 6: 每次启动都要 docker run 一次,有没有更快更方便的方式? Q 7: 据说我们有个 sandbox (淘宝内部的 Node.js 容器平台)项目,能介绍下吗 ? 转自淘宝前端:http://taobaofed.org/blog/2016/01/21/feders-should-kown-some-docker-2/ 作者:正寻

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册