Docker篇章7:Docker-Dockerfile
Posted xujunkai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker篇章7:Docker-Dockerfile相关的知识,希望对你有一定的参考价值。
Docker篇章7:Docker-Dockerfile
-
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成脚本。
构建三个步骤:编写dockerfile文件,docker build , docker run
dockerFile构建过程
-
dockerfile内容基本要求:
- 每条保留字指令都必须为大写字母并且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
-
表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
-
Docker执行Docker的大致流程
- docker 从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit操作提交一个新的镜像层
- docker再基于刚刚提交的镜像运行一个新的容器
- 执行dockerfile中的下一条指令直到所有指令都执行完毕
-
从应用角度看,DockerFile,Docker镜像与Docker容器分别代表软件三个不同阶段:
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态
- DockerFile面向开发,Docker镜像成为交付标准,Docker容器则设计部署与运维,三者缺已不可,合力充当Docker体系基石。
DockerFile 需要定义一个Dockerfile,Dockerfile定义进程需要的一切东西,Dockerfile设计的内容包括执行代码或者是文件、环境变量、依赖包、运行环境、动态链库、操作系统的发型版,服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)
Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务。
Docker容器,容器是直接提供服务
DockerFile保留的字指令
-
FROM
基础镜像,当前新镜像是基于那个镜像
-
MAINTAINER
镜像维护者的姓名和邮箱地址
-
RUN
容器构建时候需要运行的命令
-
EXPOSE
当前容器对外暴露出的端口
-
WORKDIR
指定在创建容器后,终端默认登录进来工作目录。
-
ENV
用来在构建镜像过程中设置环境变量
-
ADD
在宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
-
COPY
类似于ADD,拷贝文件和目录到镜像中 将从构建上下文目录中<源路经>的文件/目录复制到新的一层的镜像内的<目标路径>位置。 书写方式有2种: COPY src dest COPY [‘src‘, ‘dest‘]
-
VOLUME
容器数据卷,用于数据保存和持久化工作
-
CMD
指定一个容器启动时运行的命令
注意:dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。
-
ENTRYPOINT
指定一个容器启动时运行的命令
注意:ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数,会在docker run之后追加
-
ONBUILD
当构件一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
DockerFile案例:
1.dockerFile构建自己centos:
-
关闭所有容器
docker rm -f $(docker ps -q)
-
编写DockerFile
vim mydockerfile2 # 继承于centos FROM centos # 编写作者 MAINTAINER xkl<xxx@163.com> # 环境目录 ENV MYPATH /usr/local # 进入容器默认到此目录 WORKDIR $MYPATH # 安装 vim,net-tools RUN yum -y install vim RUN yum -y install net-tools # 暴露80端口 EXPOSE 80 # 打印信息 CMD echo $MYPATH CMD echo ‘success---------[OK]‘ # 以shell脚本进入 CMD /bin/bash
-
构建
# 构建镜像mycentos,1.3版本成功。 docker build -f /mydocker/mydockerfile2 -t mycentos:1.3 .
-
运行
docker run -it REPOSITORY:TAG docker run -it centos:1.3 [root@37911b322ad0 local]# ifconfig # 可以查看网卡
-
查看镜像构建顺序
docker history [IMAGE ID]
2.CMD和ENTRYPONIT案例
-
Dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换。
当我们执行: docker run -it -p 7777:8080 tomcat ls -l # 则会覆盖构建tomcat的dockerFile的最后一个CMD命令。并且会进入容器内执行ls -l # 相当于,dockerFile中加了一句 CMD ["ls", "-l"]。并且容器没有被启动。
-
制作CMD版本的查询IP
vim mydockerfile3 # 写入dockerFile FROM centos RUN yum install -y curl CMD ["curl", "-s", "http://ip.cn"] # 构建镜像 docker build -f /mydocker/mydockerfile3 -t myip . #运行,会返回ip 所在地。 docker run -it myip # 但是存在问题,当我想看详细头信息时候,就会报错,原因是当前执行curl为CMD命令,而 -i会覆盖之前curl命令,导致dockerfile结尾添加依据 curl -i .所以会报错 docker run -it myip -i
-
ENTRYPONIT版本的查询IP
vim mydockerfile4 # 写入dockerFile FROM centos RUN yum install -y curl ENTRYPOINT ["curl", "-s", "http://ip.cn"] # 构建镜像 docker build -f /mydocker/mydockerfile4 -t myip2 . #运行,会返回ip 和 头信息 因为添加-i 可在 原有ENTRYPOINT命令下添加 -i docker run -it myzip2 -i
3.ONBUILD案例
-
ONBUILD 应用在原有mydockerfile4中添加此句
# 表示别的继承我这个镜像会打印此句,在原有mydockerfile4添加一句 ONBUILD RUN echo "father....1111"
-
构建父镜像
# 构建一个父镜像 docker build -f /mydocker/mydockerfile4 -t myip_father .
-
另写一个dockerfile 为mydockerfile5
# 另写一个dockerfile 为mydockerfile5 FROM myip_father #继承my_father的镜像 RUN yum install -y curl ENTRYPOINT ["curl","-s","http://ip.cn"] # 此时用mydockerfile5 构建镜像 docker build -f /mydocker/mydockerfile5 -t myip_son . # 构建镜像myip_son时,因mydockerfile5继承my_father 镜像,会执行ONBUILD,构件时候会打印"father......1111"这句话
以上是关于Docker篇章7:Docker-Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章