1、dockerfile是什么?

dockerfile是用来构建Docker镜像的构建文件,是一系列命令和参数构成的脚本。

2、dockerfile构建三步骤

一、手动编写一个dokcerfile文件,符合dockerfile文件规范

二、执行docker build,生成一个自定义的镜像文件

三、执行docker run命令

scratch是元镜像,相当于java里的object类

3.Dockerfile构建过程解析

一、Dockerfile基础内容知识

每条保留指令都必须为大写字母且后面要跟随至少一个参数

每条指令按照从上到下,顺序执行

#为注释

每条指令都会创建一个新的镜像层,并对镜像进行提交,就像一个同心圆

docker 发布c 程序 docker编写dockerfile_docker 发布c 程序

二、docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器

(2)执行每条指令并对容器作出修改

(3)执行类似docker commit 的操作提交一个新的镜像层

(4)docker再基于刚提交的镜像,运行一个新的容器

(5)执行dockerfile的下一条指令,直到所有指令执行完成

从软件应用的角度来讲,Dockerfile、docker镜像与docker 容器分别代表软件三个不同阶段,

dockerfile是软件的原材料

docker镜像是软件的交付品

docker容器则可以认为是软件的运行态

docker面向开发,docker镜像成为交付标准,docker容器则涉及部署运维,三者缺一不可,合力充当docker体系的基石。

docker 发布c 程序 docker编写dockerfile_Dockerfile_02

Dockerfile经过build后,生成Docker镜像,Docker镜像经过run后,变成Docker容器

4.DockerFile体系结构

FROM:基础镜像,当前镜像是基于哪个镜像构建的

MAINTAINER:镜像维护者的姓名和邮箱

RUN:容器构建时需要运行的命令

EXPOSE:容器对外暴露的端口

WORKDIR:容器创建后,默认登录容器后的目录,是一个落脚点

ENV: 用来构建镜像的过程中,设置环境变量

ADD:将宿主主机目录下的文件拷贝镜像且ADD命令会自动处理URL和解压tar压缩包

COPY:类似ADD,将宿主主机目录下的文件,复制到容器里。将从构建上 下文目录中《源路径》的文件/目录复制到新的一层镜像

内的《目标路径》

VOLUME:容器数据卷,用于数据保存和持久化工作,在容器内创建路径

CMD:指定一个容器启动时,要执行的命令。dockerfile中可以用多个CMD命令,但是只有最后一个生效,CMD会被docker run覆盖

ENTRYPOINT:指定一个容器启动时要执行的命令,ENTRYPOINT目前的目的和CMD一样,都是在容器启动程序及参数替换

ONBUILD:当构建一个被继承的Dockerfile时运行的命令,父镜像被子继承后,父镜像的onbulid被触发。相当于继承后,会触发onbuild方法。

docker 发布c 程序 docker编写dockerfile_centos_03

DockerFile案例

Base镜像(scratch),Docker hub中99%的镜像都是通过base镜像中安装和配置需要的软件构建出来的。

自定义镜像

1、编写

Hub默认的Centos镜像是什么情况

准备编写DockerFile文件

myCentos内容DockerFile

查询centos镜像有哪些

docker search centos

docker 发布c 程序 docker编写dockerfile_centos_04

拉取centos镜像,docker pull docker.io/centos

docker 发布c 程序 docker编写dockerfile_docker 发布c 程序_05

查看当前镜像,docker images,我们可以看到centos的镜像,大小是209MB

启动centos容器,docker run -it docker.io/centos /bin/bash,这里我们指定了登录容器后的目录(落脚点),也就是/bin/bash根路径

docker 发布c 程序 docker编写dockerfile_docker_06

这里,我们也顺便记录下一些常用命令

docker ps:查看当前运行的所有容器

docker ps -a:查看当前所有容器

docker ps -q:查询所有运行的容器ID

docker 发布c 程序 docker编写dockerfile_DockerFile_07

容器初始化后,进入容器,我们会发现有些shell常用的命令,在容器内都无法使用。这是因为docker 容器,本身就是轻量级,

精简版,只留下内核kernel。这个时候,我们就需要在原来的镜像基础上,RUN yum -y install vim,进行vim命令安装

docker 发布c 程序 docker编写dockerfile_centos_08

接下来,我们开始简单编写第一个DockerFile。

第一步,编写DockerFile

touch df1

docker 发布c 程序 docker编写dockerfile_DockerFile_09

#基于本地现有的docker.io/centos镜像
FROM docker.io/centos
#编写作者信息,姓名和邮箱
MAINTAINER michard michard888@qq.com
#设置变量
ENV MYPATH /home
#指定登录容器后目录,即落脚点
WORKDIR $MYPATH
#安装vim命令
RUN yum -y install vim
#向外暴露80端口
EXPOSE 80
#执行命令,但是只有最后一条有效可执行,其他命令不会执行
CMD echo 'this workdir is $MYPATH'
CMD /bin/bash

 

刚刚不小心在容器内编写dockerfile了,所以我们把dockerfile复制到宿主主机上,

docker cp 7dae976581a7:/home/dockerfile/df1 /home/

第二步,构建,使用命令docker build 新镜像名字:tag

docker build -f df1 -t mycentos:1.3 .

docker 发布c 程序 docker编写dockerfile_docker 发布c 程序_10

这里执行到Step 5/8,就卡住了,有点奇怪?

我们查询下当前的镜像,发现镜像已经制作完成,但是REPOSITORY为<none>

使用docker tag 镜像ID tag名,为镜像命名

docker 发布c 程序 docker编写dockerfile_docker 发布c 程序_11

基于新镜像,构建容器

docker run -it mycentos:1.3

我们发现进入容器后,默认目录就是/home,而且vi命令也可以使用

docker 发布c 程序 docker编写dockerfile_centos_12

这样就完成了一个简单的dockerfile编写、构建。