K8S(二)————DockerFile
什么是Dockerfile
- Docker可以自动地根据Dockerfile中的指令构建一个镜像,所以说Dockerfile中保存的都是一些指令信息。
- Dockerfile仅仅是文本文档,命令行可以用来组装一个镜像。
- 使用docker build命令可以创建一个image
将正在运行的容器修改后提交成为一个新的镜像

Dockerfile格式
准备工作最好是新建一个工作目录,因为在DockerFile构建的时候会扫描目录下所有的文件。最后通过docker build构建镜像的时候会自动找到名为Dockerfile的文件进行构建,这样就不需要指定dockerfile文件的名称了
- #表示注释
- 指令(大写) 参数
- 第一行指令必须是FROM(基础镜像)
Dockerfile文件内容
# 第一行必须是FROM,指定基础镜像,本地没有的话会从dockerhub pull下来
FROM java:8
# 作者信息
MAINTAINER moxi
# 向镜像中添加文件
ADD 文件所在目录(宿主机) 要上传的目录(镜像里的目录)和COPY不同的是,ADD会自动解压
# 指定工作目录,就是进去容器之后的目录,比如说tomcat直接进去就是webaapp目录
WORKDIR
# 指定挂载目录,宿主机的目录是随即生成的,因为多个镜像跑成容器之后会有冲突。
VOLUME
# 用来给镜像定义所需要的环境变量(就像JAVA_HOME),并且可以被Dockerfile文件中位于其后的其他指令(如ENV、ADD、COPY等)所调用,调用格式:$variable_name或者$(variable_name}

ENV <key>=<value>
# 用法同上,指定一个变量,可以在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数
ARG <name>[=<default value>]
# 可以在构建镜像的过程当中执行一些shell命令,比如yum install 等。
RUN
# CMD <command>
CMD["<executable>","<paraml>","<param2>"]
CMD["<paraml>","<param2>"]
前两种语法和RUN相同
第三种语法用于为ENTRYPOINT指令提供默认参数
RUN和CMD区别:
·RUN指令运行于镜像文件构建过程中,CMD则运行于基于Dockerfile构建出的新镜像文件启动为一个容器的时候
·CMD指令的主要目的在于给启动的容器指定默认要运行的程序,且在运行结束后,容器也将终止;不过,CMD命令可以被docker run的命令行选项给覆盖
·Dockerfile中可以存在多个CMD指令,但是只有最后一个会生效
CMD
# 镜像要暴露的端口,如要使用端口,在执行docker run命令时使用-p生效
# 容器的网络是封闭的,只对宿主机开放,每个容器需要暴露端口,不暴露的用不了
EXPOSE 8080
# 在镜像运行为容器后执行的命令,不会被覆盖
ENTRYPOINT ["java","-jar","/luban.jar"]
和CMD不同的是ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序(但是,docker run命令的--entrypoint参数可以覆盖ENTRYPOINT)docker run命令传入的参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用同样,Dockerfile中可以存在多个ENTRYPOINT指令,但是只有最后一个会生效Dockerfile中如果既有CMD又有ENTRYPOINT,并且CMD是一个完整可执行命令,那么谁在最后谁生效
构建镜像
docker build -t huaan/mypro:v1 .
# -f指定Dockerfile文件的路径
# -t指定镜像名字和TAG
# .指当前目录,这里实际上需要一个上下文路径
- DockerFile中每一个指令都是一层镜像。所以说能够省写就省写

浙公网安备 33010602011771号