yss0 2020-06-02
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成脚本。
构建三个步骤:编写dockerfile文件,docker build , docker run
dockerfile内容基本要求:
Docker执行Docker的大致流程
从应用角度看,DockerFile,Docker镜像与Docker容器分别代表软件三个不同阶段:
DockerFile 需要定义一个Dockerfile,Dockerfile定义进程需要的一切东西,Dockerfile设计的内容包括执行代码或者是文件、环境变量、依赖包、运行环境、动态链库、操作系统的发型版,服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制) Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务。 Docker容器,容器是直接提供服务
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被触发
关闭所有容器
docker rm -f $(docker ps -q)
编写DockerFile
vim mydockerfile2 # 继承于centos FROM centos # 编写作者 MAINTAINER xkl<> # 环境目录 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 [ local]# ifconfig # 可以查看网卡
查看镜像构建顺序
docker history [IMAGE ID]
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
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"这句话