创建Docker镜像的两种方式---------------基于容器和基于Dockerfile

è¿éåå¾çæè¿°

1、基于容器制作镜像

1)获取一个基础镜像(docker pull)

2)根据此基础镜像启动一个docker容器(docker run)

3)然后在这个容器中进行定制化(安装、配置服务等)

4)执行docker commit命令创建一个镜像

5)查看镜像(docker images)

或者登录docker hub,并将该镜像push到docker仓库,成功之后,就可以登录docker页面,查看到刚刚制作的镜像了

关于基于容器制作镜像详细过程,这里就不讲了,大家可以参考官方文档或者网上资料

2、使用Dockerfile创建镜像(推荐)

1)创建Dockerfile文件

新建一个目录,在里面新建一个Dockerfile文件(新建一个的目录,主要是为了和以防和其它dockerfile混乱 )

$ mkdir static_web

$ cd static_web

$ touch Dockerfile

我们创建了一个名为static_web的目录用来保存Dockerfile,这个目录就是我们的构建环境,Docker则成此环境为上下文(context)或者构建上下文(build context)。Docker会在构建竟像时将构建上下文和改上下文中的文件和目录上传到Docker的守护进程。这样Docker守护进程就能直接访问用户想在镜像中存储的任何代码、文件或者其他数据。

Dockerfile示例:

# Version: 0.0.1

FROM centos:latest

MAINTAINER Gavin_Zhera "gavin_zhera@sina.com"

RUN apt-get update && apt-get install -y nginx

RUN echo 'Hi, I am in your container' \

          >/usr/share/nginx/html/index.html

EXPOSE 80

 

 

 

 

 

改Dockerfile由一系列指令和参数组成。每条指令,如FROM,都必须为大写字母,且后面要跟随一个参数:FROM centos:latest。Dockerfile中的指令会按顺序从上到下执行,所以应该根据需要合理安排指令的顺序。

文件解释:

   FROM: 必不可少的命令,从某个镜像作为基。如 FROM <image_name> ,或者 FROM <image_name>:<tag>. 如果不加tag,默认为latest。先从本地镜像仓库去搜索基镜像,如过本地没有,在去网上docker registry去寻找。

   MAINTAINER:标明该Dockerfile作者及联系方式,可忽略不写

   RUN:建立新的镜像时,可以执行在系统里的命令,如安装特定的软件以及设置环境变量。

   EXPOSE:开放容器内的端口,但不和宿主机进行映射。方便在宿主机上进行开发测试。(如需映射到宿主机端口,可在运行容器时使用 -p host_port:container_port)

其他指令:

           ENV:设置系统环境变量(注意:写在/etc/profile里的命令在dockerfile这里会不生效,所以为改成ENV的方式)

   CMD:设置执行的命令,经常用于容器启动时指定的某个操作。如执行自定义脚本服务,或者是执行系统命令。CMD 只能存在一条,如在Dockerfile中有多条CMD的话,只有最后一条CMD生效!

           ENTRYPOINT:与CMD类似

           WORKDIR:用来从镜像创建一个新容易时,

每条指令都会创建一个新的镜像层并对镜像进行提交。Docker大体上按照如下流程执行Dockerfile中的指令。

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

2)执行build 创建镜像

$ cd static_web

$ sudo docker build -t="server01/static_web" .

 

 

 

执行docker build命令时,Dockerfile中的所有指令都会被执行并且提交,并且在该命令成功结束后返回一个新镜像。

3、两种构建方式的区别:

  1. 容器镜像的构建者可以任意修改容器的文件系统后进行发布,这种修改对于镜像使用者来说是不透明的,镜像构建者一般也不会将对容器文件系统的每一步修改,记录进文档中,供镜像使用者参考。
  2. 容器镜像不能(更准确地说是不建议)通过修改,生成新的容器镜像
    从镜像运行容器,实际上是在镜像顶部上加了一层可写层,所有对容器文件系统的修改,都在这一层中进行,不影响已经存在的层。比如在容器中删除一个1G的文件,从用户的角度看,容器中该文件已经没有了,但从文件系统的角度看,文件其实还在,只不过在顶层中标记该文件已被删除,当然这个标记为已删除的文件还会占用镜像空间。从容器构建镜像,实际上是把容器的顶层固化到镜像中。
    也就是说, 对容器镜像进行修改后,生成新的容器镜像,会多一层,而且镜像的体积只会增大,不会减小。长此以往,镜像将变得越来越臃肿。Docker提供的 export 和 import 命令可以一定程度上处理该问题,但也并不是没有缺点。
  3. 容器镜像依赖的父镜像变化时,容器镜像必须进行重新构建。如果没有编写自动化构建脚本,而是手工构建的,那么又要重新修改容器的文件系统,再进行构建,这些重复劳动其实是没有价值的。
  4. Dockerfile镜像是完全透明的,所有用于构建镜像的指令都可以通过Dockerfile看到。甚至你还可以递归找到本镜像的任何父镜像的构建指令。也就是说,你可以完全了解一个镜像是如何从零开始,通过一条条指令构建出来的。
  5. Dockerfile镜像需要修改时,可以通过修改Dockerfile中的指令,再重新构建生成,没有任何问题。
  6. Dockerfile可以在GitHub等源码管理网站上进行托管,DockerHub自动关联源码进行构建。当你的Dockerfile变动,或者依赖的父镜像变动,都会触发镜像的自动构建,非常方便。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值