Docker容器---dockerfile简介

  • 一、dockerfile概念
    • 1、dockerfile介绍
    • 2、基于dockerfile创建
    • 3、docker镜像加载原理
  • 二、镜像的创建
    • 1、基于现有镜像创建
    • 2、基于本地模板创建
    • 3、基于dockerfile创建
  • 三、Dockerfile编写
    • 1、dockerfile操作指令
      • (1)FROM 镜像
      • (2)MAINTAINER 名字
      • (3)RUN 命令
      • (4)ENTRYPOINT ["要运行的程序", "参数 1", "参数 2"]
      • (5)CMD ["要运行的程序", "参数1", "参数2"]
      • (6)EXPOSE 端口号
      • (7)ENV 环境变量 变量值
      • (8)ADD 源文件/目录 目标文件/目录
      • (9)COPY 源文件/目录 目标文件/目录
      • (10)VOLUME [“目录”]
      • (11)USER 用户名/UID
      • (12)WORKDIR 路径
      • (13)ONBUILD 命令
      • (14)HEALTHCHECK
    • 2、ADD和copy区别
  • 四、镜像分层原理
    • 1、docker镜像分层
    • 2、bootfs (boot file system) 内核空间
  • 五、dockerfile构建镜像实例
    • 1、构建镜像tomcat实例
    • 2、构建镜像httpd实例
    • 3、构建镜像nginx实例

一、dockerfile概念

1、dockerfile介绍

dockerfile是自定义镜像的一套规则,dockerfie由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

dockerfile的原理就是镜像分层:

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

2、基于dockerfile创建

联合文件系统(UnionFS)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS OverlayFS 及 Devicemapper 都是一种 UnionFS。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。我们下载的时候看到的一层层的就是联合文件系统。

3、docker镜像加载原理

(1)Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

(2)bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。

(3)在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

(4)rootfs,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

(5)我们可以理解成一开始内核里什么都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

为什么docker的centos镜像只有200M多一点
因为docker镜像只有rootfs和其他镜像层,共用宿主机的linux内核(bootfs),因此很小。

bootfs + rootfs :作用是加载、引导内核程序 + 挂载使用linux 操作系统(centos ubantu)等等一些关键的目录文件就是说bootsfs用内核的,rootfs用自己的。

对于一个精简的os,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Rost的kernel,自己只需要提供rootfs就行了。所以对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,所以不同的发行版可以公用bootfs。

二、镜像的创建

镜像的创建有三种方法

  • 基于已有镜像创建

  • 基于本地模板创建

  • 基于Dockerfile创建(重点)

1、基于现有镜像创建

首先启动一个镜像,在容器里做修改

[root@localhost ~]#docker create  -it centos:7 /bin/bash[root@localhost ~]#docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS                        PORTS     NAMES
49393ec48839   centos:7   "/bin/bash"   6 seconds ago   Created                                 modest_leakey
f03cadbb1068   centos:7   "/bin/bash"   21 hours ago    Exited (137) 11 minutes ago             web2
bd1810514f76   centos:7   "/bin/bash"   21 hours ago    Exited (0) 21 hours ago                 test2
40f6b40309af   centos:7   "/bin/bash"   21 hours ago    Exited (0) 21 hours ago                 test1
792bcc4b5f18   centos:7   "/bin/bash"   21 hours ago    Exited (0) 21 hours ago                 test11
[root@localhost ~]#docker start 49393ec48839
49393ec48839
[root@localhost ~]#docker commit -m  "new" -a "zz" 49393ec48839 centos:7commit 常用选项:-m:说明信息-a:作者信息-p:生成过程中停止容器的运行
[root@localhost ~]#docker images

2、基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为:

https://wiki.openvz.org/Download/template/precrated

[root@localhost opt]#docker import debian-7.0-x86-minimal.tar.gz -- debian:zt #生成镜像
[root@localhost opt]#docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
debian       zt        00ba511136f7   5 seconds ago   215MB
centos       7         297c214ceffa   8 minutes ago   204MB
nginx        latest    605c77e624dd   15 months ago   141MB
centos       <none>    eeb6ee3f44bd   19 months ago   204MB
[root@localhost opt]#docker run -itd debian:zt /bin/bash   #启动并查看
[root@localhost opt]#docker ps -a

3、基于dockerfile创建

  • dockerfile是由一组指令组成的文件

  • dockerfile每行支持一条指令,每条指令可携带多个参数,一条指令可以用&&方式,去写多条指令。

  • dockerfile支持以“#”为开头的注释

(1)dockerfile结构

基础镜像信息(Linux发行版:centos ubantu suse debian alpine redhat)
维护者信息(docker search可查看)
镜像操作指令(tar yum make)
容器启动时执行指令(cmd[“/root/run.sh”] 、entrypoint都是系统启动时,第一个加载的程序/脚本/命令)

(2)构建镜像命令

可以在构建镜像时指定资源限制

在编写Dockerfile时,有严格的格式需要遵循:

  • 第一行必须使用FROM指令指明所基于的镜像名称。
  • 之后使用MAINTAINER指令说明维护该镜像的用户信息。
  • 然后是镜像操作相关指令,如RUN指令。每运行一条指令,都会给基础镜像添加新的一 层。
  • 最后使用CMD指令指定启动容器时要运行的命令操作。
例:
docker build -t nginx:test .  #基于dockerfile文件构建镜像命令
完整的写法: docker build -f dockerfile -t nginx:new .
docker build : 基于dockerfile 构建镜像
-f :指定dockerfile 文件(默认不写的话指的是当前目录)
-t :(tag) 打标签 ——》nginx:new
.  :专业说法:指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件

三、Dockerfile编写

1、dockerfile操作指令

(1)FROM 镜像

指定新镜像所基于的基础镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令

(2)MAINTAINER 名字

说明新镜像的维护人信息

(3)RUN 命令

在所基于的镜像上执行命令,并提交到新的镜像中

(4)ENTRYPOINT [“要运行的程序”, “参数 1”, “参数 2”]

设定容器启动时第一个运行的命令及其参数。
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。

exec格式(数值格式):ENTRYPOINT [“命令”,“选项”,“参数”]shell格式:ENTRYPOINT 命令 选项 参数

(5)CMD [“要运行的程序”, “参数1”, “参数2”]

上面的是exec形式,shell形式:CMD 命令 参数1 参数2
启动容器时默认执行的命令或者脚本,Dockerfile只能有一条CMD命令。如果指定多条命令,只执行最后一条命令。如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么CMD就会被覆盖。
CMD 可以为 ENTRYPOINT 指令提供默认参数。

(6)EXPOSE 端口号

指定新镜像加载到 Docker 时要开启的端口

(7)ENV 环境变量 变量值

设置一个环境变量的值,会被后面的 RUN 使用
linxu PATH=$PATH:/opt
ENV PATH $PATH:/opt

(8)ADD 源文件/目录 目标文件/目录

将源文件复制到镜像中,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL

(9)COPY 源文件/目录 目标文件/目录

只复制本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中

(10)VOLUME [“目录”]

在容器中创建一个挂载点

(11)USER 用户名/UID

指定运行容器时的用户

(12)WORKDIR 路径

为后续的 RUN、CMD、ENTRYPOINT 指定工作目录

(13)ONBUILD 命令

指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

(14)HEALTHCHECK

健康检查

cmd和entrypoint区别

docker run后面的参数会将CMD指定的参数进行覆盖。ENTRYPOINT与CMD的区别是不可以被docker run 后的参数覆盖,会把docker run后面的参数传递给ENTRYPOINT指定的参数。

优先级
docker run 指定命令 —> entrypoint—>cmd

2、ADD和copy区别

首先都有本地复制和目录 到镜像功能,add复制tar命令压缩包 会自动解压。
url拉取目录来复制,cp只能复制本地主机文件/目录到镜像。Dockerfile中的COPY指令和ADD指令都可以将主机上的资源复制或加入到容器镜像中,都是在构建镜像的过程中完成的.copy只能用于复制(节省资源)。
ADD复制的同时,如果复制的对象是压缩包,ADD还可以解压(消耗资源)。

四、镜像分层原理

1、docker镜像分层

  • docker镜像位于bootfs(内核)之上

  • 每一层镜像的下一层成为父镜像

  • 第一层镜像成为base image(操作系统环境镜像)

  • 容器层(可读可写,为了给用户操作),在最顶层

  • 容器层以下都是readonly

2、bootfs (boot file system) 内核空间

bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。在linux操作系统中(不同版本的linux发行版本),linux加载bootfs时会将rootfs设置为read-only,系统自检后会将只读改为读写,让我们可以在操作系统中进行操作。
rootfs (root file system) 内核空间
在bootfs之上(base images,例如centos 、ubuntu)
包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件
rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等

五、dockerfile构建镜像实例

1、构建镜像tomcat实例

[root@localhost opt]#mkdir tomcat   #创建tomcat目录
[root@localhost opt]#cd tomcat
[root@localhost tomcat]#ls   #上传所需软件包
apache-tomcat-9.0.16.tar.gz  Dockerfile  jdk-8u201-linux-x64.tar.gz[root@localhost tomcat]#vim Dockerfile
FROM centos:7
MAINTAINER [zz]
ADD jdk-8u201-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.16.tar.gz /usr/localWORKDIR /usr/local
RUN mv apache-tomcat-9.0.16 tomcat
RUN mv jdk1.8.0_201 java
ENV JAVA_HOME /usr/local/java
ENV CLASS_PATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@localhost tomcat]#docker build -t tomcat:new .   #构建镜像
[root@localhost tomcat]#docker run -itd -p 2023:8080 tomcat:new   #运行容器并指定端口
[root@localhost tomcat]#docker ps -a
----真机访问----
http://宿主机ip:2023



2、构建镜像httpd实例

[root@localhost ]#mkdir /opt/apache    #建立工作目录
[root@localhost opt]#cd /opt/apache/
[root@localhost apache]#vim Dockerfile  #创建dockerfile文件FROM  centos:7
#基于基础镜像指定centos:7,注意本机要有此基础镜像
MAINTAINER this is apache image <zz>
#说明镜像维护人信息,指定用户为zz
RUN yum -y update
#此内容若保存可注释
RUN yum -y install httpd
镜像run指令指定启动内容后的运行命令,yum安装update和httpd服务
EXPOSE 80
#开启80端口
ADD index.html /var/www/html/index.html
#复制宿主机的index.html文件到容器的/var/www/html/index.html
ENTRYPOINT ["/usr/sbin/apachectl"]
CMD ["-D","FOREGROUND"]
#使用前台启动apache,使用绝对路径
[root@localhost apache]#echo "this is zz web" >index.html
#准备网站的网页,注必须在和dockerfile文件相同的目录
[root@localhost apache]#docker run  -d -p 50221:80 httpd:centos #运行容器并映射端口


3、构建镜像nginx实例

[root@localhost ~]#mkdir /opt/nginx    #创建nginx目录
[root@localhost ~]#cd /opt/nginx/
[root@localhost nginx]#vim Dockerfile
FROM centos:7
#基于基础镜像
MAINTAINER this is nginx image <zt>
#用户信息,镜像维护用户为zt
RUN  yum -y update
#此内容若保存可注释
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#安装编译安装工具
ADD nginx-1.12.0.tar.gz /opt/
#上传nginx软件包
WORKDIR /opt/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make &&  make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定工作目录
EXPOSE 80
EXPOSE 443
#指定http和https端口
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#关闭nginx在后台运行
ADD run.sh /run.sh
RUN  chmod 755 /run.sh
CMD ["/run.sh"]
#添加宿主机中run.sh到容器中
#保存退出
[root@localhost nginx]#vim run.sh
#创建run.sh脚本,注意必须和dockerfile在同一路径下,内容如下
#!/bin/bash
/usr/local/nginx/sbin/nginx
#保存退出

[root@localhost nginx]#docker run -itd -P nginx:centos
[root@localhost nginx]#docker ps -a
真机访问
http://宿主机ip:2023


Docker容器---dockerfile简介相关推荐

  1. 自动化集成:Docker容器入门简介

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Docker基础用法. 一.Docker简介 1.基础 ...

  2. 【Docker】Dockerfile简介

    介绍 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本. 我们使用docker commit可以构造镜像,但是docker中的镜像随时变化,不能一 ...

  3. Docker容器 - DockerFile发布Java微服务并部署到Docker容器

    目录 通过idea新建一个普通微服务项目 一.新建项目 二.POM 三.YML 四.启动类 五.Controller类 启动 通过Dockerfile发布微服务部署到docker容器 一.通过idea ...

  4. 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述流水线集成Docker用法. 一.背景描述 微服务架构 ...

  5. Docker容器编排

    Docker容器编排 简介 为什么需要 Compose? 安装docker-compose 常用命令 使用步骤 小案例 总结 简介 Compose(容器编排) 是 Docker 公司推出的一个工具软件 ...

  6. 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介

    高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 文章目录 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 D ...

  7. docker容器简介及安装

    docker容器简介及安装 一.docker的前世今生 早期 过度 目前 二.什么是docker 三.docker核心概念 1.镜像 2.容器 3.仓库 四.docker容器和虚拟机的区别 五.doc ...

  8. 共享内存简介及docker容器的shm设置与修改

    共享内存简介及docker容器的shm设置与修改 共享内存简介 共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存.由于多个CPU需要快 ...

  9. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5

    实战:Docker容器虚拟化技术 (使用DockerFile构建镜像并搭建 swarm+compose集群)5 要求: 使用DockerFile构建镜像并搭建 swarm+compose集群 在Swa ...

最新文章

  1. css --- 应用媒介查询制作响应式导航栏
  2. android -------- 解决NDK开发中的 Method 'NewStringUTF' could not be resolved
  3. 疯狂开店! 华为不甘心只卖车 | 次世代车研所
  4. (转)Android studio 使用心得(五)—代码混淆和破解apk
  5. Elasticsearch聚合 之 Ip Range IP地址范围聚合
  6. 数组string 转 long
  7. 406.根据身高重建队列
  8. Navicat注册机报错No all pattern found! file already patched
  9. 预约活动报名登记缴费小程序开发制作功能介绍
  10. Vcc(电源)和GND(地)之间接电容的作用
  11. C语言实现根据用户输入的整数求和(两种方法)
  12. android 各版本介绍,Android的版本的介绍
  13. Volatility使用与实战
  14. echarts地图自定义icon图标并在图标内自定义文字
  15. 【408数据结构】备考常见必会算法图鉴
  16. 很二2022,滚蛋吧! 幸福2023,过来吧!
  17. 【iot-manager】(1)IOT商业化和未来竞争、淘汰还在继续,需要折腾一个开源IOT系统,参考Rancher开源Octopus:IoT设备管理系统做一个物联网管理系统
  18. 豆瓣爬虫实战——Angelababy到底是什么风评
  19. Joomla远程代码执行漏洞分析小白版(小宇特详解)
  20. 复旦工研院的计算机系老师,信息科学与工程学院

热门文章

  1. 连詹姆斯·高斯林(JAVA之父)都要被气疯掉的JAVA代码注释
  2. nz-upload的[nzCustomRequest]自定义上传
  3. pycharm在ubuntu中不能输入中文的问题
  4. windows被迫重装系统| 数据恢复 | 启动盘 PE盘 | 批量软件安装
  5. 一分钟教你如何使用edge浏览器玩4399小游戏
  6. c语言双截龙_双截龙出招表
  7. Linux系统中DHCP服务设置
  8. 华为云虚拟专用网络VPN常见问题解答
  9. 深入理解 Linux 内核---访问文件
  10. ZIGBEE------协调器断开重连,终端设备无法重新入网。