dockerFile的使用
前言
————————————————————————————————————
本文安装docker的基础是linux centos7系统,使用终端模拟软件xshell,有需要安装教程的同鞋可以戳我之前的博客
VMware下载,安装及创建虚拟机
VMware安装Centos7 究极逐步详细图文流程
上节内容↓
Docker零基础入门——3.Docker之数据卷和数据卷容器
1.dockerFile的概念和规则
之前概念篇我们没有提到dockerfile,是因为他只从概念来讲的话,比较简单,难在他的指令书写和编排上,这里我们大概了解一下。
dockerfile 其实就是用来构建docker image 的构建文件,是由一系列的命令和参数组成的脚本。
我们在docker hub 官网上看到的对应容器的code tab,里边就是dockerfile的内容
比如说tomcat,你在官网都可以直接查看到他的dockerfile脚本代码。
dockerfile脚本的基本使用规则是
→1.每一行保留字必须大写
→2.后边至少跟上一个参数
→3.指令由上到下顺序执行
→4.井号是注释行
→5.每一条指令都会创建一个新的镜像层,并对镜像提交
2.dockerFile的指令
指令很多,我们挑一些简单常用的进行说明
- FROM 指令
用来指定当前镜像生成的基础镜像,必须为第一条指令,我们知道镜像是多个可读层,比方说tomcat的镜像就是基于openJDK的,因为tomcat是java开发的,需要java运行环境。
语法:
FORM <image> 或 FORM <image>:<tag>
举例:
FROM centos:7
表明此镜像基于centos:7镜像
- MAINTAINER 指令
用来指定维护者的信息,相当于一个备注,一般写开发者的邮箱,姓名等
语法:
MAINTAINER <...>
举例:
MAINTAINER The CentOS Project <cloud-ops@centos.org> - ami_creator
- RUN 指令
容器构建时会自动调用的命令
语法:
RUN <command> 或 RUN ["命令", 参数1, 参数2]
举例:
RUN mkdir -p "$CATALINA_HOME"
- EXPOSE 指令
用来指定服务调用的默认端口号(容器启动时可以通过 -p或-P 来指定外部对应的访问端口)
语法:
EXPOSE <port> [<port>...]
举例:
EXPOSE 8080
我们的tomcat就是暴露8080端口的
- WORKDIR 指令
容器创建后,终端默认登陆进来工作目录的路径,就是当我们第一次进入容器时所在的目录。
语法:
WORKDIR <path>
举例:
WORKDIR $CATALINA_HOME
- ENV 指令 (environment的缩写)
用来指定环境变量,被后续命令使用,并且在容器运行时保持
语法:
ENV <name> <value>
举例:
ENV CATALINA_HOME /usr/local/tomcat
- ADD 指令
用来将宿主机中的拷贝到容器中的
其中可以是dockerfile所在目录的一个相对路径,也可以是一个URL,
还可以是一个tar文件,会[自动解压]为目录
语法:
ADD <src> <dest>
举例:
ADD centos-7-x86_64-docker.tar.xz /
拷贝.tar到容器根目录并解压
- COPY 指令
从构建上下文目录中<源路径>文件/目录复制到新的镜像容器的目录<目标路径>
和ADD类似 不过这个只是单纯的copy,而不会解压
语法:
COPY src dest 或 COPY ["src", "dest"]
举例:
COPY centos-7-x86_64-docker.tar.xz /
拷贝.tar到容器根目录(不会自动解压)
- VOLUME 指令
这个指令我们上节内容中使用到了,用来创建数据卷,多个的话用逗号分割,可以概括为:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据
语法:
VOLUME ["/data" ...]
举例:
VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"]
- CMD 指令
容器启动时执行的命令,如果用户指定了运行的命令,则会覆盖掉CMD的命令,这就是我们运行容器时指定指令的默认值,
语法有三种格式:
<1> CMD ["executable","参数1","参数2"...] 使用exec执行,推荐使用
<2> CMD command 参数1 参数2... 在/bin/sh中执行,提供给需要交互的使用
<3> CMD ["参数1","参数2"...] 提供给ENTRYPOINT的默认参数
举例:
CMD ["catalina.sh", "run"]
dockerfile 应当只有一条cmd命令,如果指定了多条,则会覆盖,最终只有最后一条会被调用
- ENTRYPOINT 指令
容器启动后执行的命令,且不会被docker run 提供的参数覆盖,也是唯一的,同CMD
语法有两种格式:
<1> ENTRYPOINT ["executable","参数1","参数2"...]
<2> ENTRYPOINT command 参数1 参数2... shell中执行
举例:
ENTRYPOINT ["curl", "-s", "xxx.com"]
比方说你执行了如下命令
docker run -it xxximages:xxx -i
最终执行时会把CMD的参数"-i"追加到ENTRYPOINT参数中,为:
ENTRYPOINT [“curl”, “-s”, “-i”, “xxx.com”]
- ONBUILD 指令
当A镜像作为B镜像的基础镜像时,B镜像build时执行的, 记录在A镜像dockerfile中的命令。总结一下就是
B镜像build时,会执行A镜像 docker file 中的ONBUILD后指定的命令
语法:
ONBUILD [INSTRUCTION]
举例:
ONBUILD RUN echo "build form A镜像"
3.自定义dockerFile
我们使用dockerfile脚本的顺序一般如下
→1.编写dockerfile
→2.build dockerfile 获得镜像文件
→3.docker run 通过镜像生成容器
现在开始让我们按照上边顺序自己里定义一个dockerfile
直接上dockerfile代码
FROM centos:7
MAINTAINER cjl<836735455@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "clearlove77777"
CMD /bin/bash
这是非常简单的一个dockerfile了,我们将其build编译为镜像
语法:docker build -f <dockerfilename> -t <image> .
注意这一行的末尾,是有一个英文句号的,表明是在当前目录
举例:docker build -f dockerfile1 -t cjl_centos:1.0 .
因为dockerfile中有安装的命令,导致下载时打印在控制台上的东西过多,这里我就只截图开始和结束了,
下来再使用docker run 通过镜像生成容器
docker run -dit image7:1.0
首先查看生成的镜像
再启动容器,之前我们指定了workdir是 usr/local,进入容器查看一下是不是这样
一发入魂,么得毛病
OK,dockerFile就简单先介绍到这了,在我们实际使用的时候构建dockerfile才是使用docker的基础核心,希望大家可以继续学习其他的指令,我们下节再见。