2019-07 <Docker容器> 第十二、十七章 深入Dockerfile构建镜像和容器开发环境介绍

生成镜像的方法:

A . 从container生成

方法1.  # docker commit  <container>            这是把container的变更,提交给新image

方法2.  # docker export <container>  >  tarball   

     # cat tarball | docker import - <image>     同1

B. 从image生成

方法1.  # docker save -o tarball  registry/reposiry/image                这是从registry的db到本地FS文件

    modify the tarball

    docker load -i tarball                           这是从本地FS文件装在镜像,到本地image的db

C. 从Dockerfile生成

1.  和A,B比,优点: 可追踪image的定义,可升级image中软件版本、几乎不消耗存储、通过阅读Dockerfile代替docker inspect来检视镜像/container的内容

2. 命令: docker build -t <image_name>   [-f Dockerfile] <构建目录>  [options]    

        不指定-f选项时,在当前目录下自动搜索Dockerfile。 指定-f选项时,需要是构建目录的相对路径,且位于构建目录的子目录内

3. 原理: 

        docker build命令是传令官;

        构建目录(一般是当前目录 . )下所有内容是build镜像的素材, 由docker build传给docker daemon,存在/var/lib/docker下------

                如果要排除一些文件、目录不传给docker daemon,就把它们列入构建目录下的.dockerignore文件

        Dockerfile里每一行是docker daemon执行的指令;

        docker damon是真正执行build镜像的工人。

        这些被执行的命令是在build 镜像是执行的

        每执行一个Dockerfile的命令,生成一个中间镜像,和数据缓存;下次再docker build时,会重用最后一条没有改变过的指令的中间层容器,来节省时间------

                如果要不留中间层容器:docker build --force-rm=true

                如果要从头build不使用缓存和中间层:docker build --no-cache=true

4. 镜像的定制基于哪些素材:

        a. 基础镜像 -- 由FROM命令指定,本地有优先用本地的,没有就去registry拉取;强制拉取的选项是 --pull=true

            FROM        永远的底格指令

        b. 文件素材 -- 须位于构建目录之下

            ADD / COPY    不会使用docker build生成的临时层,而是检索docker build传给docker daemon的“文件系统”。

                ADD   <相对Dockerfile的目录路径>    <去往容器的文件的绝对路径>

        c. 通信接口 -- 端口

            EXPOSE        暴露容器内端口。这个端口可以用于容器连接,或者影射给主机的socket,映射关系可以由docker port察看,宿主机docker-proxy监听宿主机的映射端口(netstat -tupln)。

                    映射给主机指定的socket地址: docker run -p  <主机ip:主机端口>:<被暴露的容器端口>。 主机IP默认是0.0.0.0

                    映射给主机随机的随机的端口:  docker run -P    <被暴露的容器端口>

                    容器连接

        d. 修改基础镜像

            RUN        比如创建文件、安装软件

        e. 修改后续的build镜像的环境变量

            ENV  <key>=<value>        可以在docker run  时由选项-e <key>=<value> 覆盖

        f. 自定义键值,作为镜像的标签

            LABEL  <key>=<value>        可以一行定义多个,用空格分开,这样避免多个容器层被创建。

                    LABEL的key的定义没有限制,但推荐使用开发者可控域名的反向顺序的DNS格式:比如: LABEL net.linuxtoys.mylabel=xxx

                    容器的LABEL可以用docker inspect检视,也可以用docker ps -a --filter “label=<key>=<value>”来筛选容器

                    也可以用docker images --filter “label=<key>=<value>”来筛选镜像

        g. 景象启动时的默认命令

            ENTRYPOINT        默认的运行命令,可以在docker run  时由选项--entrypoint="xxx" 覆盖

            CMD                        默认的ENTRYPOINT的运行参数,可以在docker run时 由 最后的参数覆盖



基于Dockerfile设计容器的原则

1. 一个容器只干一件事

容器连接或K8S编排,实现共享服务

2. 让构建目录尽可能小,否则用.dockerignore文件排除不想包含的文件

目的是减少传递构建目录给docker daemon的时间,也节省/var/lib/docker的空间

3. 高效合理地组织Dockerfile的RUN命令

一行生成一个中间层。

所以,多命令在一行,可以节省空间。但是其中任何命令失败了,下次build还得全部build这一行,浪费时间。

其实合理组织RUN命令,是Docker镜像合理分层的手段。Docker镜像是一种特殊的FS:Union FS,是一系列中间层叠加在基础镜像(也是之前叠加产物)上的结果。docker pull 拉取的,实际是本地已有镜像之上的叠加层。所以Dockerfile的RUN命令,不仅影响开发,也影响拉取使用的效率。

4. ENTRYPOINT命令最先去做清理工作,比如删除上次kill/stop时僵死的进程.pid文件

5. 最佳实践

https://docs.docker.com/engine/reference/builder/                

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 


容器开发和运行环境的种类

1. 运行在VirtualBox、KVM上的虚拟机镜像Vagrant,它已经配置好了Docker、K8S等容器开发运行需要的软件(CDK3.9 )

https://developers.redhat.com/products/cdk/download 

https://access.redhat.com/downloads/content/293/ver=3.9/rhel---7/3.9/x86_64/product-software 

https://access.redhat.com/documentation/en-us/red_hat_container_development_kit/3.9/ 

2. 运行于Openshift之上 (K8S的包装)

1) 开发者专用的上游项目--容器内的Openshift-- Openshift Origin。 搭建

step1.  install redhat7

step2. install docker、kubernetes、etcd

step3. 配置K8S集群

step4. 禁用SELinux

step5. 信任docker registry

step6. 启动docker服务

step7. 拉取、运行Opeshift/origin容器

step8. 打开后台运行的Origin容器的Bash Shell

Step9. 纯Openshift操作,建立项目、app(也就是容器镜像)、pods(启动容器)

2)Ansible搭建的Openshift (NNIT ENET用的),即K8S集群

3)基于AWS、GCE的Openshift

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容