DockerFile
一、什么是dockerfile
'''
1.dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2.构建的三步骤
- 编写dockerfile文件
- docker build -f dockerfile文件路径 -t 镜像名
- docker run
'''
二、dockerfile构建过程解析
'''
1.dockerfile基础知识
- 每条保留字指令都必须为大写字母切后面要跟随至少一个参数
- 指令从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
2.docker执行dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令知道所有指令都执行完成
'''
小总结
'''
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
* Dockerfile是软件的原材料
* Docker镜像是软件的交付品
* Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。
'''
![](https://gitee.com/cyan_yyh/blogimage/raw/master/img/20200402134345.png)
三、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 容器ID 后面的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD 当构建一个被继承的dockerfile时运行的命令
父镜像在被子镜像继承后父镜像的ONBUILD被触发
'''
四、案例操作
1.创建一个centos镜像,默认工作路径为/tmp,并自带vim编辑器和ifconfig
'''
1.创建dockerfile文件
############################
# 如果本地不存在CENTOS镜像,则会先从镜像仓库拉取CENTOS镜像
FROM CENTOS
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
CMD "/bin/bash"
############################
2.通过build构建新的镜像
docker build -f ./dockerfile -t cyan/centos .
3.运行后可发现容器默认的工作路径为 /tmp
'''
2.CMD和ENTRYPOINT比较
'''
1.以redis的dockerfile为例
###############
EXPOSE 6379
CMD ["redis-server"]
###############
docker run -it redis ls -l # 会替换redis-server就不会被执行了
2.ENTRYPOINT
ENTRYPOINT ["curl","-s","https://ip.cn"]
docker run 镜像id -i
CMD ["curl","-s","https://ip.cn"]
docker run 镜像id -i # 会报错
'''
![](https://gitee.com/cyan_yyh/blogimage/raw/master/img/20200402142642.png)