docker基础dockerfile创建镜像(二)

结合 docker入门实操基础命令干货(一)所学,创建dockerfile

dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成,因此,层越多,效率越低,创建镜像,层越少越好。因此能在一个指令完成的动作尽量通过一个指令定义。

构建三步骤

1、手动编写dockerfile文件,当前必须要符合file的规范;

2、编写好file后,直接docker  bulid命令执行,获得一个自定义的镜像;

3、使用run将已经生成的镜像启动。

dockerfile内容基础知识

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

2、指令按照从上到下、顺序执行;

3、#便是注释;

4、每条指令都会创建一个新的镜像层,并对镜像进行提交。

docker执行dockerfile的大致流程

1、docker从基础镜像运行一个容器;

2、执行一条指令并对容器做出修改;

3、执行类似dockers commit的操作提交一个新的镜像层;

4、docker在基于刚提交的镜像运行一个新容器;

5、执行dockerfile中的下一条指令直到所有指令都执行完成。

dockerfile体系结构(保留字指令)

FROM 基础镜像,当前新镜像是基于哪个镜像的

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

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

EXPOSE 当前容器对外暴露的端口

WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

ENV 用来指定在构建镜像过程中设置环境变量

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

COPY  类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径> 的文件/目录复制到新的一层的镜像内的<目标路径>位置。COPY src dest ,COPY ["src","dest"]

VOLUME 容器数据卷,用于数据保存和持久化工作

CMD 指定一个容器启动时要运行的命令。dockerfile中可以有多个CMD指令,但是最后一个生效,CMD会被docker run 之后的参数替换

ENTERPOINT 指定一个容器启动时要运行的命令。ENTERPOINT的目的和CMD一样,都是在指定容器启动程序及参数。但是ENTERPOINT不会覆盖,只会追加

ONBUILD  当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被出发。

主流命令图

 案例一

首先编写一个简单的dockerfile

vim dockerfile

如上dockerfile与我们用命令的方法大概一致,只不过通过dockerfile生成镜像,直接启动成容器不需要执行太多命令。

(docker run -it -v /宿主机的某个目录:/datatest1 -v /宿主机的某个目录:/datatest2 centos /bin/bash  )

但是在dockerfile不支持   -v  /宿主机:/datatest1,只能支持VOLUME,处于可移植和分享考虑,用-v /主机目录:/容器目录 这种方法不能够直接在dockerfile中实现。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的目录。

将dockerfile生成成为一个容器

docker  build  -f  /mydocker/dockerfile  -t   new/centos  .   (最后有个点,不加会报错)

查看已经生成镜像

启动验证是否创建两个容器卷

通过docker inspect b633d2c6201b(经运行的容器ID),查看容器卷的两个目录在宿主机的具体位置。

/datatest1容器卷对应的宿主机目录

/datatest2容器卷对应的宿主机目录

在容器卷目录中创建两个文件,切换至宿主机对应目录查看已经共享。

 一个简单的创建centos镜像,并添加容器卷已近完成。

案例二

自定义centos镜像,因为下载的精简版的centos,很多命令是没有的没办法使用。自己定义的centos镜像根据自我需求添加。

登陆后的默认路径/home

给centos镜像添加vim,运行成容器后能够使用vim编辑器

精简版的centos镜像运行后是无法使用ifconfig命令,在案例中我们让支持ifconfig

vim dockerfile

生成新的镜像

查看完成

运行验证启动后是否在/home目录

 

验证是否能使用ifconfig

 验证是否能够使用vim

案例三

CMD与ENTRYPOINT的区别,CMD有多个但是只会执行最后一个,ENTRYPOINT可以有多个但是会依次执行

创建一个镜像启动后,会查看网卡信息。

 docker build -f /mydocker/dockerfile -t centos:1.2 .     创建成一个镜像

启动镜像时,查看网卡信息。如果使用CMD就会报错。当有多个执行命令时,就需要使用ENTRYPOINT。

原文地址:https://www.cnblogs.com/sxshaolong/p/14096155.html