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。