介绍

Dockerfile是用来构建docker镜像的文件,命令参数脚本

构建步骤:

  1. 构建一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)

DockerFile - 图4

DockerFile - 图5

DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行顺序从上到下
  3. 表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交!

构建命令:

docker build [-f dockerfileName] -t imageName:tag .

  • 当dockerfile名字为Dockerfile时 不需要使用-f进行指定
  • 注意不要忘记最后面那个点.

常用指令

  1. FROM #基础镜像,一切从这里开始构建
  2. MAINTAINER #镜像是谁写的,姓名+邮箱
  3. RUN #镜像构建时需要运行的命令
  4. ADD #步骤,tomcat镜像,这个tomcat压缩包;添加内容
  5. WORKDIR #镜像工作目录
  6. VOLUME #挂载的目录
  7. EXPOSE #暴露端口配置
  8. CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  9. ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
  10. ONBUILD #当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
  11. COPY #类似ADD,将我们的文件拷贝至镜像中
  12. ENV #构建的时候设置环境变量

构建tomcat镜像

  1. kpsmile@kpsmile-machine:~/package$ cat Dockerfile
  2. FROM centos:7
  3. MAINTAINER kpsmile<kpsmile95@gamil.com>
  4. ENV MYPATH /usr/local
  5. WORKDIR $MYPATH
  6. COPY README $MYPATH
  7. ADD jdk-8u341-linux-x64.tar.gz $MYPATH
  8. ADD apache-tomcat-8.5.81.tar.gz $MYPATH
  9. RUN ln -s jdk1.8.0_341 jdk_default
  10. RUN ln -s apache-tomcat-8.5.81 tomcat8_default
  11. ENV JAVA_HOME /usr/local/jdk_default
  12. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  13. ENV CATALINA_HOME /usr/local/tomcat8_default
  14. ENV CATALINA_BASH /ust/local/tomcat8_default
  15. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  16. EXPOSE 8080
  17. CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATELINE_HOME/log/catelina.out
  18. # <<<注意最后有一个点>>>
  19. kpsmile@kpsmile-machine:~/package$ sudo docker build -t mytomcat:0.1 .
  20. kpsmile@kpsmile-machine:~/package$ docker images
  21. REPOSITORY TAG IMAGE ID CREATED SIZE
  22. mytomcat 0.1 1cb67202f9d5 7 seconds ago 589MB
  23. centos 7 eeb6ee3f44bd 10 months ago 204MB
  24. kpsmile@kpsmile-machine:~/package$ docker run -it -p 8080:8080 --name tomcat02 1cb67202f9d5
  25. Using CATALINA_BASE: /usr/local/tomcat8_default
  26. Using CATALINA_HOME: /usr/local/tomcat8_default
  27. Using CATALINA_TMPDIR: /usr/local/tomcat8_default/temp
  28. Using JRE_HOME: /usr/local/jdk_default
  29. Using CLASSPATH: /usr/local/tomcat8_default/bin/bootstrap.jar:/usr/local/tomcat8_default/bin/tomcat-juli.jar
  30. Using CATALINA_OPTS:
  31. Tomcat started.
  32. tail: cannot open '/log/catelina.out' for reading: No such file or directory
  33. tail: no files remaining

构建springboot服务

  1. kpsmile@kpsmile-machine:~/jar$ cat Dockerfile
  2. FROM mytomcat:0.1
  3. MAINTAINER kpsmile<kpsmile95@gamil.com>
  4. ENV JAR_DIR /usr/local/jar/
  5. WORKDIR $JAR_DIR
  6. ADD docker_demo-0.0.1-SNAPSHOT.jar $JAR_DIR/docker-demo.jar
  7. ENTRYPOINT ["java","-jar","docker-demo.jar"]
  8. kpsmile@kpsmile-machine:~/jar$ docker build -t boot-jar:0.1 .
  9. Sending build context to Docker daemon 17.63MB
  10. Step 1/6 : FROM mytomcat:0.1
  11. ---> 1cb67202f9d5
  12. Step 2/6 : MAINTAINER kpsmile<kpsmile95@gamil.com>
  13. ---> Running in 896fb225d19a
  14. Removing intermediate container 896fb225d19a
  15. ---> 7ac2fd421892
  16. Step 3/6 : ENV JAR_DIR /usr/local/jar/
  17. ---> Running in 21f3883d4313
  18. Removing intermediate container 21f3883d4313
  19. ---> 35b49e5403ce
  20. Step 4/6 : WORKDIR $JAR_DIR
  21. ---> Running in 1cce8e09708f
  22. Removing intermediate container 1cce8e09708f
  23. ---> 187fafe16079
  24. Step 5/6 : ADD docker_demo-0.0.1-SNAPSHOT.jar $JAR_DIR/docker-demo.jar
  25. ---> db0e89d4be5e
  26. Step 6/6 : ENTRYPOINT ["java","-jar","docker-demo.jar"]
  27. ---> Running in 2aee83c7ebef
  28. Removing intermediate container 2aee83c7ebef
  29. ---> 885434d46011
  30. Successfully built 885434d46011
  31. Successfully tagged boot-jar:0.1
  32. kpsmile@kpsmile-machine:~/jar$ docker ps
  33. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  34. 016a97ac8f4f 1cb67202f9d5 "bash" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat03
  35. 432679cae712 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp nginx00
  36. 36f85e59fbe0 redis "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis00
  37. 2eca34a18260 cedcd3e1ddad "/bin/sh -c /bin/bash" 3 hours ago Up 3 hours 80/tcp strange_pike
  38. kpsmile@kpsmile-machine:~/jar$ docker images
  39. REPOSITORY TAG IMAGE ID CREATED SIZE
  40. boot-jar 0.1 885434d46011 11 seconds ago 606MB
  41. mytomcat 0.1 1cb67202f9d5 About an hour ago 589MB
  42. centoswithnettool 0.1 cedcd3e1ddad 3 hours ago 613MB
  43. wm/ubuntu-ifconfig 1.0 9e8154d445c3 26 hours ago 111MB
  44. 192.168.1.29:5000/wm/ubuntu 1.1 c0cad9d8bfb3 2 days ago 111MB
  45. nginx latest 605c77e624dd 7 months ago 141MB
  46. redis latest 7614ae9453d1 7 months ago 113MB
  47. mysql 5.7 c20987f18b13 7 months ago 448MB
  48. mysql latest 3218b38490ce 7 months ago 516MB
  49. registry latest b8604a3fe854 9 months ago 26.2MB
  50. ubuntu latest ba6acccedd29 9 months ago 72.8MB
  51. hello-world latest feb5d9fea6a5 10 months ago 13.3kB
  52. centos 7 eeb6ee3f44bd 10 months ago 204MB
  53. kpsmile@kpsmile-machine:~/jar$ docker run -d -p 8888:8888 --name jar01 boot-jar:0.1
  54. ccc7425d9a198e767866a3e335044cc6bb768c3d3fa202fb31f8edde08537c83

DockerFile - 图6

Docker镜像原理

DockerFile - 图7DockerFile - 图8思考:

1. Docker镜像本质是什么?

·是一个分层文件系统

2. Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?

·Centos的iso镜像文件包含bootts和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层

3. Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

docker关键字

关键字 作用 备注
FROM 指定父镜像 指定 dockerfile 基于那个 image 构建
MAINTAINER 作者信息 用来标明这个 dockerfile 谁写的
LABEL 标签 用来标明 dockerfile 的标签可以使用 Label 代替 Maintainer 最终都是在 dockerimage 基本信息中可以查看
RUN 执行命令 执行一段命令默认是/bin/sh 格式:RUNcommand 或者 RUN[“command”,“param1”,“param2”]
CMD 容器启动命令 提供启动容器时候的默认命令和 ENTRYPOINT 配合使用.格式 CMDcommandparam1param2 或者 CMD[“command”,“param1”,“param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build 的时候复制文件到 image 中
ADD 添加文件 build 的时候添加文件到 image 中不仅仅局限于当前 build 上下文可以来源于远程服务
ENV 环境变量 指定 build 时候的环境变量可以在启动的容器的时候通过-e 覆盖格式 ENVname=value
ARG 构建参数 构建参数只在构建的时候使用的参数如果有 ENV 那么 ENV 的相同名字的值始终覆盖 arg 的参数
VOLUME 定义外部可以挂载的数据卷 指定 build 的 image 那些目录可以启动的时候挂载到文件系统中启动容器的时候使用-v 绑定格式 VOLUME[“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口启动容器的使用-p 来绑定暴露端口格式:EXPOSE8080 或者 EXPOSE8080/udp
WORKDIR 工作目录 指定容器内部的工作目录如果没有创建则自动创建如果指定/使用的是绝对地址如果不是/开头那么是在上一条 workdir 的路径的相对路径
USER 指定执行用户 指定 build 或者启动的时候用户在 RUNCMDENTRYPONT 执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令基本上没用因为很多时候应用本身有健康监测机制
ONBUILD 触发器 当存在 ONBUILD 关键字的镜像作为基础镜像的时候当执行 FROM 完成之后会执行 ONBUILD 的命令但是不影响当前镜像用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该 STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的 shell 指定 RUNCMDENTRYPOINT 执行命令的时候使用的 shell