23 04 2021

前言

前面我们学习了通过Dockerfile构建镜像,以及镜像分层和构建原理。

本节我们主要学习Dockerfile文件的指令。

Dockerfile文件指令

1、FROM - 基于基准镜像

FROM 命令是定制的镜像都是基于 FROM 的镜像。如:

  1. FROM centos #制作基准镜像,基于centos:latest
  2. FROM scratch #不依赖于任何基准镜像base image
  3. FROM tomcat:jdk8-corretto
  4. # 注:尽量使用官方提供的Base Image,第三方提供的不清楚是否有漏洞或者后门~

2、LABEL & MAINTAINER - 说明信息

LABEL & MAINTAINER 主要是一些描述信息,这些信息不会产生实质的功能影响,主要用于辨别。

  1. MAINTAINER zwqh.top #可以是组织机构~
  2. LABEL version = "1.0"
  3. LABEL description = "朝雾轻寒博客,一起学编程~"

3、WORKDIR - 设置工作目录

WORKDIR 主要是设置工作目录,如果设置的文件目录不存在,则会自动创建

  1. WORKDIR /usr/local/tomcat/webapps
  2. WORKDIR /usr/local/projects
  3. # 注:尽量使用绝对路径,易于维护~

4、ADD & COPY - 复制文件

ADD & COPY 的主要职责就是完成文件复制,这两个命令大多数情况下是一样的,可以用COPY代替ADD。

在不需要解压情况下使用COPY,ADD会进行自动解压。

ADD 除了复制,还具备添加远程文件功能,在实际工作中使用较少。

  1. ADD project / #将文件project复制到根路径下
  2. ADD zwqh.tar.gz / #添加到根路径并进行解压
  3. ADD http://www.zwqh.top/1.txt / #将远程文件添加到根目录

5、ENV - 设置环境变量

ENV 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

  1. ENV JAVA_HOME /usr/local/openjdk8
  2. RUN ${JAVA_HOME}/bin/java -jar test.jar
  3. # 注:尽量使用环境变量,可以提供程序的可维护性~

6、RUN & ENTRYPOINT & CMD - 执行命令

RUN & ENTRYPOINT & CMD 都是执行命令,只是它们的执行时机不同。

  • RUN - 在镜像构建时执行(docker build)
  • ENTRYPOINT - 容器启动时执行命令(docker run)
  • CMD - 容器启动后执行默认的命令或参数(docker run)
ENTRYPOINT

ENTRYPOINT 有入口点的意思,用于在容器启动时执行命令。

注:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。其不会被docker run 指定的命令覆盖。

CMD

为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。

注:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如果容器启动时指定了附加指令,则CMD被忽略。

命令格式

运行命令有两种格式:

shell 格式:

  1. RUN yum install -y vim

exec 格式:

  1. RUN ["yum","install","-y","vim"]

两种格式区别:

shell运行方式:

  • 使用shell执行时,当前shell是父进程,它创建一个子shell进程来执行命令
  • 在子shell进程中执行脚本,执行完后,子进程会退出销毁,回到当前shell

exec运行方式:

  • 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
  • 执行完毕,直接退出,并不会退回之前的进程环境

官方推荐采用exec~

示例

示例1:

  1. #Dockerfile如下
  2. FROM centos
  3. RUN ["echo","image building..."]
  4. CMD ["ps","-ef"]
  5. #构建镜像
  6. docker build -t zwqh.top/docker-run:1.0 /usr/image/docker-run
  7. #运行内容
  8. Sending build context to Docker daemon 2.048kB
  9. Step 1/3 : FROM centos
  10. ---> 300e315adb2f
  11. Step 2/3 : RUN ["echo","image building..."]
  12. ---> Running in 121ba33c0337
  13. image building...
  14. Removing intermediate container 121ba33c0337
  15. ---> 077c37604e44
  16. Step 3/3 : CMD ["ps","-ef"]
  17. ---> Running in 8ebcc13ac3e8
  18. Removing intermediate container 8ebcc13ac3e8
  19. ---> c3efc3f1e790
  20. Successfully built c3efc3f1e790
  21. Successfully tagged zwqh.top/docker-run:1.0
  22. #创建运行容器
  23. docker run zwqh.top/docker-run:1.0
  24. #运行内容
  25. UID PID PPID C STIME TTY TIME CMD
  26. root 1 0 0 14:38 ? 00:00:00 ps -ef
  27. #再次运行
  28. docker run zwqh.top/docker-run:1.0 ls
  29. #运行结果
  30. bin
  31. dev
  32. etc
  33. home
  34. lib
  35. lib64
  36. lost+found
  37. media
  38. mnt
  39. opt
  40. proc
  41. root
  42. run
  43. sbin
  44. srv
  45. sys
  46. tmp
  47. usr
  48. var
  49. #由此我们得知CMD命令会被docker run附加指令覆盖~

可以看到RUN和CMD的运行时期是不同的~

示例2:

  1. #修改Dockerfile如下
  2. FROM centos
  3. RUN ["echo","image building..."]
  4. CMD ["ps","-ef"]
  5. #构建镜像
  6. docker build -t zwqh.top/docker-run:1.1 /usr/image/docker-run
  7. #运行内容
  8. Sending build context to Docker daemon 2.048kB
  9. Step 1/4 : FROM centos
  10. ---> 300e315adb2f
  11. Step 2/4 : RUN ["echo","image building..."]
  12. ---> Using cache
  13. ---> 077c37604e44
  14. Step 3/4 : ENTRYPOINT ["ps"]
  15. ---> Running in 4d756bfe4f43
  16. Removing intermediate container 4d756bfe4f43
  17. ---> 599bf6615f40
  18. Step 4/4 : CMD ["-ef"]
  19. ---> Running in 3ea20b225b79
  20. Removing intermediate container 3ea20b225b79
  21. ---> 850c5a43b39c
  22. Successfully built 850c5a43b39c
  23. Successfully tagged zwqh.top/docker-run:1.1
  24. #我们看到再次构建没有输出“image building”,前面说过,使用了临时镜像快照~
  25. #创建启动容器
  26. docker run zwqh.top/docker-run:1.1
  27. #运行内容
  28. UID PID PPID C STIME TTY TIME CMD
  29. root 1 0 0 14:44 ? 00:00:00 ps -ef
  30. #我们看到ENTRYPOINT和CMD可以组合使用,CMD可以命令可以由docker run指定附加命令传参~

~~~其他命令待补充~~~~~

总结

本节我们学习了Dockerfile常用的基础命令以及运行指令,后面我们通过实战使用一些这些指令,循序渐进…

延伸阅读
  1. Windows下IIS搭建Ftp服务器
  2. Nginx开启Gzip压缩提升页面加载速度
  3. Nginx安装及配置(linux)
  4. Docker(10):Docker-Compose简介及安装
  5. Docker(5):docker镜像分层(layer)
发表评论