一、什么是Dockerfile
Dockerfile是一个文本文档,可以通过docker build 命令构建成一个镜像;我们可以在Dockerfile中定义一系列的命令,构建出我们想要的镜像;想要制作一个新的镜像离不开Dockerfile。
二、Dockerfile 相关命令解释
2.1、FROM
格式:
FROM [—platform=
] [AS
] Or FROM [—platform= ] [:
] [AS ] Or FROM [—platform= ] [@
] [AS ]
作用:
代表镜像来源。
比如 FROM centos:7 就代表当前镜像的基础镜像为centos7;若不需要基础镜像可以写成 FROM scratch
2.2、RUN
格式:
RUN /bin/bash -c ‘source $HOME/.bashrc; \echo $HOME’ 也可以写成: RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME’
作用:
docker 镜像在构建过程中将运行RUN 后面定义的命令。
\代表可换行拼接执行语句。要使用除“/bin/sh”之外的不同 shell,请使用传入所需 shell的exec形式。
例如:
RUN [“/bin/bash”, “-c”, “echo hello”]
2.3、CMD
格式:
FROM ubuntu CMD echo “This is a test.” | wc - or FROM ubuntu CMD [“/usr/bin/wc”,”—help”]
作用:
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
比如:
CMD netstat -ntpl 可以写成 CMD [“netstat”,”ntpl”],CMD 命令在镜像构建期间并不会执行任何命令,而是指的镜像预期命令。
比如Dockerfile中的内容为:
FROM centos:7 CMD echo “hello docker”
进行docker build后不会报错,且执行docker run后也不会报错,因为 echo “hello word” 这条shell 命令在基础镜像 centos:7本身就是支持的。
但是Dockerfile中的内容若为:
FROM centos:7 CMD [“netstat”,”-ntpl”]
进行docker build后不会报错,且执行docker run后会报错,因为 netstat -ntpl 这条shell 命令在基础镜像 centos:7中是不被支持的。
2.4、LABEL
格式:
LABEL “com.example.vendor”=”ACME Incorporated”LABEL com.example.label-with-value=”foo”LABEL version=”1.0”LABEL description=”This text illustrates \
可以通过 docker image inspect —format=’’ {镜像名称}:{镜像tag} 进行查看。
作用:
镜像标签。一个镜像可以有多个标签。打标签时要在LABEL值中包含空格,请像在命令行解析中一样使用引号和反斜杠。
如:
FROM centos:7LABEL version=2.0 CMD [“netstat”,”-ntp
运行后占用的端口模式80。
2.5、EXPOSE
格式:
EXPOSE 80/tcp
作用:
用以告知Docker 容器在运行时侦听指定的网络端口。可以指定端口是监听TCP还是UDP,如果不指定协议,默认为TCP。
但是无EXPOSE怎么设置,进行docker run -p port:port 命令时任然可以指定容器占用的端口。
如:
docker run -dit v3:3.0
运行后期望占用的端口为80(这么运行实际不会占用端口);但是若运行docker run -dit -p 8081:8081 v3:3.0 ,那么容器运行后占用的端口为8081。
2.6、EVN
格式:
ENV
=
作用:
简单来说就是为构建后的镜像定义环境变量(运行为容器后生效),如jdk版本、数据库连接配置等都可以设置。
2.7、ADD
格式:
ADD [—chown=
: ] … ADD [—chown= : ] [“ “,… “ “]
作用:
ADD 命令即可添加本地的文件,也可以通过远程链接进行文件添加;如果ADD的文件是本地tar文件,那么ADD到镜像后会自动解压缩。
该功能仅在用于构建 Linux 容器的 Dockerfile 上受支持,不适用于 Windows 容器。
2.8、COPY
格式:
COPY [—chown=
: ] … COPY [—chown= : ] [“ “,… “ “]
该功能仅在用于构建 Linux 容器的 Dockerfile 上受支持,不适用于 Windows 容器。
作用:
COPY 命令可将本地文件添加到镜像中,且无论何种文件都不会自动解压。
2.9、ENTRYPOINT
格式:
ENTRYPOINT [“executable”, “param1”, “param2”] or ENTRYPOINT command param1 param2
作用:
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
2.10、VOLUME
格式:
VOLUME [“/data”]
作用:
运行镜像后再容器内部创建一个匿名数据卷,挂载在宿主机的文件系统下;但是挂载的目录是随机默认的,无法指定在宿主机文件系统的具体哪个位置。
如:
FROM centos:7 VOLUME /application/dockerfile/volume CMD [“/bin/bash”]
代表运行镜像后会在容器内部生成一个目录地址为 /application/dockerfile/volume 的数据卷。
通过docker volume ls 查看所有的数据卷。(再通过容器的启动时间和宿主机匿名文件夹创建的时间可以找到具体的文件夹位置)
再通过docker volume inspect {volume_name}可以看到挂载宿主机的哪个位置;宿主机的这个位置下的文件是和容器中挂载的数据卷是互通的。宿主机新建、编辑、删除文件等操作会同步到容器中。
2.11、WORKDIR
格式:
WORKDIR /path/to/workdir
作用:
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
如:
FROM centos:7 WORKDIR /home CMD [“/bin/bash”]
运行镜像后,进入容器的位置便是在/home位置下。
三、实践(构建镜像&推送镜像)
在基础镜像上构建一个镜像并推送到镜像仓库
1、Dockerfile内容# 基础镜像FROM centos7-jdk8:v1.0# 工作空间WORKDIR /application/webapp# 复制 jr包和启动脚本COPY demo.jar .COPY app.sh .# 声明容器需要的端口号EXPOSE 8022# 赋予启动脚本可执行权限RUN chmod a+x app.sh# 容器启动后执行脚本启动ENTRYPOINT ["./app.sh","start"]2、打包镜像根据Dockerfile打包镜像docker build -t demo:v1.0 .ordocker build -t demo:v1.0 . -f Dockerfile3、推送镜像docker push demo:v1.0
