docker 学习(一)镜像和镜像的构建Dockerfile

  • 诞生时间:2013年
  • 编写语言:go
  • 目标:实现轻量级操作系统虚拟化解决方案。
  • 基础是Linux容器(LXC)等技术。
  • 与传统虚拟化的区别:

Alt text Alt text

Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。

  • docker engine 基于虚拟化技术的轻量级并且功能强大的开源引擎管理工具。
  • docker hub 分享管理images尽享的SaaS服务

  • 快速交付应用程序

  • 部署快

  • 依赖少
  • 易迁移
  • 省资源
  • 快速构建轻松管理

  • docker 镜像又文件系统叠加而成,低端是一个引导文件系统bootfs,用户不会跟引导文件系统又交互,当容器启动后,就会被移到内存中,引导文件系统就会被卸载。

  • 第二层是rootfs,可以是操作系统。docker里rootfs永远是只读状态
  • 镜像存在只读层,不会改变
  • 父镜像:每个镜像都可能依赖有一个或多个下层组成的一个镜像,下层就是上层的父镜像
  • 基础镜像:没有父镜像的镜像就是基础景象
  • 镜像id:所有镜像都通过一个64位十六进制字符串内部是256bit的值来标识,为了简化使用,前12个字符组成短id。

docker pull命令从仓库获取镜像,默认仓库源是docker官方源,为了加快速度,可以使用其它源地址:

docker pull  http:

最常用的是更换docker默认源为国内源:
vim /etc/docker/daemon.json

{
      "<span class="hljs-attribute">registry-mirrors</span>": <span class="hljs-value">[
              <span class="hljs-string">"https://registry.docker-cn.com"</span>
                ]
</span>}

重启docker即可使用

docker images

<span class="hljs-title">REPOSITORY</span>                        TAG                 IMAGE ID            CREATED             SIZE
<span class="hljs-number">192.168.100.52:5000</span>/centos        latest              7a5530ef979d        <span class="hljs-number">5</span> days ago          <span class="hljs-number">4</span>.<span class="hljs-number">75</span> GB
centos                            lnmp2               7a5530ef979d        <span class="hljs-number">5</span> days ago          <span class="hljs-number">4</span>.<span class="hljs-number">75</span> GB
<span class="hljs-number">127.0.0.1:5000</span>/centos             latest              7a5530ef979d        <span class="hljs-number">5</span> days ago          <span class="hljs-number">4</span>.<span class="hljs-number">75</span> GB
<span class="hljs-number">192.168.100.52</span>/centos             latest              7a5530ef979d        <span class="hljs-number">5</span> days ago          <span class="hljs-number">4</span>.<span class="hljs-number">75</span> GB

id相同的镜像是同一个镜像
tag用来标记同意仓库的不同镜像
使用docker run 启动镜像的时候,如果不指定具体的tag。怎会启动最新latest

一般来说不是真正的创建新镜像,而是基于一个已有的基础镜像,如ubuntu,centos等构建新镜像而已。

先使用镜像启动容器,然后进入容器进行修改,修改完成后退出容器,用docke commit 命令进行提交更改后的容器副本,

docker commit

&#x9009;&#x9879;:
-<span class="ruby">a <span class="hljs-symbol">:</span>&#x63D0;&#x4EA4;&#x7684;&#x955C;&#x50CF;&#x4F5C;&#x8005;&#xFF1B;
</span>-<span class="ruby">c <span class="hljs-symbol">:</span>&#x4F7F;&#x7528;<span class="hljs-constant">Dockerfile</span>&#x6307;&#x4EE4;&#x6765;&#x521B;&#x5EFA;&#x955C;&#x50CF;&#xFF1B;
</span>-<span class="ruby">m <span class="hljs-symbol">:</span>&#x63D0;&#x4EA4;&#x65F6;&#x7684;&#x8BF4;&#x660E;&#x6587;&#x5B57;&#xFF1B;
</span>-<span class="ruby">p <span class="hljs-symbol">:</span>&#x5728;commit&#x65F6;&#xFF0C;&#x5C06;&#x5BB9;&#x5668;&#x6682;&#x505C;&#x3002;</span>
  • Dockerfile使用的是DSL语法。docker build基于Dockerfile里面的指定进行构建镜像。
  • 创建一个空目录,并新建Dockerfile文件
    mkdir -p /home/docker-web && cd /home/docker-web && touch Dockerfile
    vim Dockerfile

FROM ubuntu:<span class="hljs-number">14.04</span>
MAINTAINER
RUN
RUN yum -y install apache
&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;RUN&#x6307;&#x4EE4;&#x4F1A;&#x5728;<span class="hljs-built_in">shell</span>&#x91CC;&#x4F7F;&#x7528;&#x547D;&#x4EE4;&#x5305;&#x88C5;&#x5668;/bin/sh -c&#x6765;&#x6267;&#x884C;&#xFF0C;&#x4E0D;&#x652F;&#x6301;<span class="hljs-built_in">shell</span>&#x7528;exec&#x683C;&#x5F0F;&#x7684;RUN
RUN [ <span class="hljs-string">"yum"</span>,<span class="hljs-string">"-y"</span>,<span class="hljs-string">"install"</span>,<span class="hljs-string">"apache"</span>]
EXPOSE&#x6307;&#x5B9A;&#x9700;&#x8981;&#x6253;&#x5F00;&#x54EA;&#x4E9B;&#x7AEF;&#x53E3;

构建镜像
docker build -t="centos/apache:v1 ."
-t 选项为镜像指定仓库和镜像名字。
.指定在当前目录中指定Dockerfile
也可以指定一个git仓库源地址
构建每一步都会有id,如果构建出错,进入前一步骤的id进行调试,然后再次构建。
– Dockerfile和构建缓存
由于每步过程都会提交为镜像,最终镜像之前的镜像就可以看作是缓存,如果构建失败对某一步骤进行调试,前面几步没有改动,会在有修改的步骤开始进行构建。
不需要构建缓存时,用 --no-cache参数
– 基于缓存构建Dockerfile模板
构建缓存的好处是,可以实现简单的Dockerfile模板,,比如在Dockerfile文件顶部增加包仓库或者更新包,尽可能命中缓存。
– ENV指令为环境变量,由于镜像的层次文件系统,环境变量在后续的层次中被引用。当容器启动后,在容器可以通过env命令查看环境变量。
ENV DIR=/usr/local/
WORKDIR $DIR
ENV创建的环境变量会持久的保存到从此镜像创建的任何容器中,也可所以使用 docker run -e参数指定环境变量,只在启动时有效
– RUN命令是构建容器时所需要运行的命令
– CMD是在容器运行时,需要运行的命令,将要运行的命令放在一个数组结构中例如: CMD ["bin/bash"&#xFF0C;"ls"], 如果不加数组结构,docker会在命令前加上 /bin/sh -c
– 启动容器时docker run命令可以覆盖CMD
– Dockerfile中只能指定一个CMD命令。多个CMD只会执行最后一个
– ENTRYPOINT指令与CMD相似,区别:docker run会覆盖CMD命令,但是不能覆盖ENTRYPOINT命令。如需覆盖在启动时市容 docker run --entrypoint
– WORKDIR指令从镜像创建容器时,在容器内设置一个工作目录,指定ENTRYPOINT和/或者CMD、RUN、COPY、ADD指令的工作目录,如果不存在,就会创建。可以多次设置。在启动容器时,用 docker run -w参数进行覆盖。
– USER指令用来指定该镜像会议什么用户运行。启动时用 docker run -u参数进行覆盖。默认为root。

<span class="hljs-tag">USER</span> <span class="hljs-tag">user</span>
<span class="hljs-tag">USER</span> <span class="hljs-tag">user</span><span class="hljs-pseudo">:group</span>
<span class="hljs-tag">USER</span> <span class="hljs-tag">uid</span><span class="hljs-pseudo">:gid</span>
<span class="hljs-tag">USER</span> <span class="hljs-tag">uid</span><span class="hljs-pseudo">:group</span>
  • VOLUME指令基于镜像创建的容器添加卷, VOLUME ["/data/mysql","data"]
  • ADD指令将构建环境下的文件和目录复制到镜像中, ADD passwd /etc/passwd将本地构建目录下的passwd复制到镜像中/etc/passwd。可以是一个url,或者构建上下文文件或者目录,不能是构建目录意外的文件。docker通过末尾的/判断是目录还是文件。添加url示例: ADD http://www.baidu.com/123.zip /home/baidu.zip当ADD的文件是本地归档文件。会自动解包。 ADD baidu.zip /home/会自动解包,如果存在目标文件或目录,不会被覆盖,自动解压支支持本地归档文件,不支持url。如果目标路径不存在则会自动创建
  • COPY指令与ADD类似,区别是COPY只是在构建上下文中复制本地文件,不会提取和解压,本地文件与Dockerdile同一路径。目标位置必须是是容器内的一个绝对路径。任何由该指令创建的文件uid和gid都是0
  • ONBUILD指令是Dockerfile文件中的触发器,并不会在基于此Dockerfile构建镜像中生效,当基于此父镜像构建子镜像时,才会触发生效。孙子镜像不能触发,onbuild不能执行FROM、MAINTAINER、和ONBUILD本身
  • EXPOSE指令是告诉docker该容器内部的应用程序会使用容器的指定端口,

Original: https://www.cnblogs.com/lixuebin/p/10808460.html
Author: 李庆喜
Title: docker 学习(一)镜像和镜像的构建Dockerfile

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/534899/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球