Docker之Dockerfile
1、Dockerfile
1.1、dockerfile的基本介绍
Dockerfile 是一个用来构建镜像的文本文件,该文本内容内包含了一条条构建镜像所需的指令和参数。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
DockerFile 对于 docker 镜像而言,可以理解为就如同 java 中某个类的 .class 文件对应上该类的 .java 文件。
从应用软件的角度来看,Dockerfile、 Docker镜像与Docker容器分别代表软件的三个不同阶段:
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1.2、dockerfile内容
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。
文件内容说明:
- 每条保留字指令都必须为大写字母且后面要跟随至少一个数
- 指令按照从上到下,顺序执行
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
- #表示注释
2、Dockerfile常用指令
常用指令图:
2.1、FROM(指定基础镜像)
FROM:指定基础镜像,即当前镜像基于哪个镜像创建的。该指令必须为第一个命令。
示例:
FROM centos:6
2.2、MAINTAINER(指定维护者信息)
指明镜像维护者及其联系方式(一般是邮箱地址),例如:
MAINTAINER xxx <xxx@qq.com>
不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:
LABEL maintainer="edisonzhou.cn"
2.3、RUN
镜像构建时运行的命令,例如:
RUN ["yum", "install", "httpd"] RUN yum install vim #安装vim模块 RUN yum install net-tools
2.4、EXPOSE
声明容器运行的该容器暴露的服务端口,例如:
EXPOSE 80 443
2.5、CMD
启动容器时执行的Shell命令,例如:
CMD ["-C", "/start.sh"] CMD echo "success----ok" CMD /bin/bash
Dockerfile 文件中可以存在多个 CMD 指令,但仅有最后一个会生效。并且 CMD 启动的程序会被 docker run 命令行最后所指定的参数所覆盖。
2.6、WORKDIR
指定在创建并运行容器后,默认进去的容器的目录。如果没有指定,将默认进去容器内的根目录 / 下。
也是为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:
WORKDIR /data
2.7、ENV
设置环境变量,例如:
ENV MY_PATH /usr/test ENV MYSQL_ROOT_PASSWORD 123456 ENV JAVA_HOME /usr/local/jdk1.8.0_45
设置的环境变量可以在后续的任何RUN指令中使用,也可以在其它指令中直接使用这些环境变量。比如:WORKDIR $MY_PATH
2.8、COPY
将宿主机目录下的文件或者目录拷贝进镜像中,例如:
COPY ./start.sh /start.sh
2.9、ADD
将宿主机目录下的文件或者目录拷贝进镜像中,相对于 COPY 命令的区别是如果是URL或压缩包,会自动下载或自动解压。
例如:
ADD 宿主机文件路径 镜像文件路径 ADD html.tar.gz /var/www/html ADD https://xxx.com/html.tar.gz /var/www/html
2.10、VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器,例如:
VOLUME ["/var/lib/mysql"]
一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。
2.11、ENTRYPOINT
启动容器时执行的Shell命令,同CMD类似,只是由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序。
例如:
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"] ENTRYPOINT /bin/bash -C '/start.sh'
Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效。
2.12、ONBUILD
用于设置镜像触发器,当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器就会被触发。
2.13、USER
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
# 格式: USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group # 示例: USER wen
使用USER指定用户后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过 -u 参数来覆盖所指定的用户。