当前位置:   article > 正文

偷偷学 Docker 系列 | 镜像分层概念 | 容器创建方法 - 基于已有镜像 - 基于本地模板 - 基于 Dockerfile(重点)_已有的镜像里面如何添加一层

已有的镜像里面如何添加一层

一、Docker 镜像分层

Dockerfile 由多条指令构成,随着深入研究 Dockerfile 与镜像的关系,很快大家就会发现,Dockerfile 中的每一条指令都会对应于 Docker 镜像中的一层。

继续以如下 Dockerfile 为例:

FROM ubuntu:14.04		#指定新镜像所基于的镜像,用于创建镜像
ADD run.sh /			#将脚本添加至该镜像中,启动容器后就可以使用了
VOLUME /data			#在容器中创建挂载点(-v)
CMD ["./run.sh"] 		#启动该脚本/命令
  • 1
  • 2
  • 3
  • 4

通过 docker build 以上 Dockerfile 的时候,会在 ubuntu:14.04 镜像基础上,添加三层独立的镜像,依次对应于三条不同的命令。镜像示意图如下:

mark

可以看出,镜像在生成的过程中是以分层的方式生成的:

  1. Dockerfile 中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
  2. 镜像层将被缓存和复用(后续的镜像层将基于前面的一层)
  3. 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)
  4. 某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就再成功,相当于地基)
  5. 容器的修改并不会影响镜像,如果在某一层中添加一个文件,如果在下一层中就会删除它,镜像中依然会包含该文件

二、Docker 容器创建方法

1.基于已有镜像创建

本创建方法实质上就是将一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像

命令格式:
docker commit [选项] 容器ID/名称 仓库名称:[标签]

常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行

例:
1.创建容器
[root@docker ~]# docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@docker ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       7         8652b9f0cb4c   4 months ago   204MB
[root@docker ~]# docker create -it centos:7 /bin/bash
22d3f62986f66088e6dd0e8bfbb34cd37c8b2cbd5b832ed022927820040a59e6
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS    PORTS     NAMES
22d3f62986f6   centos:7   "/bin/bash"   33 seconds ago   Created             agitated_keldysh

2.创建镜像
[root@docker ~]# docker commit -m "new" -a "xcf" 22d3f62986f6 centos:xcf
sha256:3209546adc6983fd92df497f71d27363a8b83c4bfcb5cb5177556b65f47123f1
[root@docker ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       xcf       3209546adc69   6 seconds ago   204MB
centos       7         8652b9f0cb4c   4 months ago    204MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

2.基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板也可以从 OPENVZ 开源项目下载,下载地址:https://wiki.openvz.org/Download/template/precreated

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

#下载时间较久!
#下载好后可通过以下命令将下载的debian模板压缩包导入为本地镜像

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:new
docker images
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.基于 Dockerfile 创建(重点)

①概述

Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取 Dockerfile 中的指令生成指定镜像

Dockerfile 结构大致分为四个部分:

  1. 基础镜像信息
  2. 维护着信息
  3. 镜像操作信息
  4. 容器启动时执行指令

Dockerfile 每行支持一条指令,每条指令可携带多个参数,支持以“#”为开头的注释

②操作指令

指令含义
FROM [镜像]指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER [名字]说明新镜像的维护人信息
RUN [命令]在所基于的镜像执行命令,并提交到新的镜像中
CMD [“要运行的程序”,“参数1”、“参数2”]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条
EXPOSE [端口号]指定新镜像加载到Docker时要开启的端口
ENV [环境变量] [变量值]设置一个环境变量的值,会被后面的RUN使用
ADD [源文件/目录] [目标文件/目录]将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL,若源文件是压缩包则会将其解压缩
COPY [源文件/目录] [目标文件/目录]将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME [“目录”]在容器中创建一个挂载点
USER [用户名/UID]指定运行容器时的用户
WORKDIR [路径]为后续的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的"CD",否则需要使用绝对路径
ONBUILD [命令]指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查

③示例

1.编写dockerfile文件
[root@docker ~]# mkdir apache
[root@docker ~]# cd apache/
[root@docker apache]# vim Dockerfile	#注意该文件格式,不要擅自更改!

#基础镜像
FROM centos:7

#作者信息
MAINTAINER xcf

#镜像执行命令,更新并下载apache
RUN yum install -y update
RUN yum install -y httpd

#开启80端口
EXPOSE 80

#复制网址首页文件,注意这里宿主机中源文件必须存在
ADD index.html /var/www/html/index.html
#复制脚本至容器,这里为相对路径,与Dockerfile处于同一文件下
ADD run.sh /run.sh

#赋予脚本执行权限
RUN chmod +x /run.sh

#启动容器时运行该脚本
CMD ["/run.sh"]


--
2.编写执行脚本与首页内容
[root@docker apache]# vim run.sh

#!/bin/bash

rm -rf /run/httpd/*
#清除缓存,安装完毕后有一些默认文件

exec /usr/sbin/apachectl -D FOREGROUND
#启动apache,-D表示守护进程


[root@docker apache]# echo "hello world" > index.html

--
3.生成镜像
[root@docker apache]# docker build -t httpd:centos .
#注意不要遗漏最后的"."
#生成过程中每层都会生成一个临时容器,该动态过程可新开一个终端,使用ps -a命令查看

[root@docker apache]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
httpd        centos    23ebf3b821dc   2 minutes ago    343MB
centos       xcf       3209546adc69   53 minutes ago   204MB
centos       7         8652b9f0cb4c   4 months ago     204MB

--
4.运行容器
[root@docker apache]# docker run -d -P httpd:centos
4c888053ecad5d5147c4f1e906492db07a66cca71af2be0b5a1a3004bb079ab9
[root@docker apache]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                     PORTS                   NAMES
4c888053ecad   httpd:centos   "/run.sh"                6 seconds ago    Up 5 seconds               0.0.0.0:49153->80/tcp   eager_mclaren

--
5.浏览网页验证
192.168.126.17:49153
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
mark
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/80742
推荐阅读
相关标签
  

闽ICP备14008679号