当前位置:   article > 正文

Dockerfile【超级详细】

dockerfile

Dockerfile 基础知识

  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 #构建的时候设置环境遍量

实战测试

Docker Hub 中 99% 镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建的

  1. #创建一个自己的centos
  2. #编写Dockerfile 文件
  3. [root@root dockerfile01]# cat mydockerfile
  4. FROM centos
  5. MAINTAINER Hang<1754808@qq.com>
  6. ENV MYPATH /usr/local
  7. WORKDIR $MYPATH
  8. RUN yum -y install vim
  9. RUN yum -y install net-tools
  10. EXPOSE 80
  11. CMD echo $MYPATH
  12. CMD echo "----END----"
  13. CMD /bin/bash
  14. #通过这个文件构建镜像
  15. #docker build -f dockerfile文件路径 -t 镜像名:[tag] .
  16. [root@root dockerfile]# docker build -f mydockerfile -t mycentos1.0 .
  17. Removing intermediate container 59cd03ecce3f
  18. ---> 89ba49a34e1e
  19. Step 7/10 : EXPOSE 80
  20. ---> Running in a1efee3b0fe2
  21. Removing intermediate container a1efee3b0fe2
  22. ---> e58f7bcccc27
  23. Step 8/10 : CMD echo $MYPATH
  24. ---> Running in e882afef45eb
  25. Removing intermediate container e882afef45eb
  26. ---> 906c0671d05c
  27. Step 9/10 : CMD echo "----END----"
  28. ---> Running in f4ecc2caf6af
  29. Removing intermediate container f4ecc2caf6af
  30. ---> 6f4bef42e0fc
  31. Step 10/10 : CMD /bin/bash
  32. ---> Running in 44f884f709c9
  33. Removing intermediate container 44f884f709c9
  34. ---> e6062ccf13fd
  35. Successfully built e6062ccf13fd
  36. Successfully tagged mycentos1.0:latest
  37. #测试运行
  38. [root@root dockerfile]# docker run -it mycentos1.0 /bin/bash
  39. [root@f408b8773605 local]# pwd
  40. /usr/local

我们可以列出本地镜像的变更历史

  1. [root@root dockerfile]# docker history mycentos1.0
  2. IMAGE CREATED CREATED BY SIZE COMMENT
  3. e6062ccf13fd 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
  4. 6f4bef42e0fc 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
  5. 906c0671d05c 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
  6. e58f7bcccc27 6 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
  7. 89ba49a34e1e 6 minutes ago /bin/sh -c yum -y install net-tools 23.4MB
  8. 2ba5aff6da20 6 minutes ago /bin/sh -c yum -y install vim 58.1MB
  9. e34dc5e2146b 7 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
  10. bd4017671eca 7 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
  11. f23b466173fb 7 minutes ago /bin/sh -c #(nop) MAINTAINER root<175480… 0B
  12. 300e315adb2f 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  13. <missing> 6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
  14. <missing> 6 weeks ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB

CMD 和 ENTRYPOINT 区别

CMD            #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT    #指定这个容器启动的时候要运行的命令,可以追加命令

测试cmd

  1. # 编写dockerfile文件
  2. [root@root dockerfile]# vi dockerfile-cmd
  3. FROM centos
  4. CMD ["ls","-a"]
  5. # 构建镜像
  6. [root@root dockerfile]# docker build -f dockerfile-cmd -t cmd .
  7. Sending build context to Docker daemon 3.072kB
  8. Step 1/2 : FROM centos
  9. ---> 300e315adb2f
  10. Step 2/2 : CMD ["ls","-a"]
  11. ---> Running in 711a369ca8ce
  12. Removing intermediate container 711a369ca8ce
  13. ---> 96c1a6a5a855
  14. Successfully built 96c1a6a5a855
  15. Successfully tagged cmd:latest
  16. # run 运行 发现我们的 ls -a 命令生效
  17. [root@root dockerfile]# docker run 96c1a6a5a855
  18. .
  19. ..
  20. .dockerenv
  21. bin
  22. dev
  23. etc
  24. home
  25. lib
  26. lib64
  27. lost+found
  28. media
  29. mnt
  30. opt
  31. proc
  32. root
  33. run
  34. sbin
  35. srv
  36. sys
  37. tmp
  38. usr
  39. var
  40. # 想追加一个命令 -l ls -al
  41. [root@root dockerfile]# docker run 96c1a6a5a855 -l
  42. docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
  43. # cmd 的情况下 -l 替换了 CMD ["ls","-a"] 命令 -l 不是命令 所以报错

测试ENTRYPOINT

  1. # 编写dockerfile文件
  2. [root@root dockerfile]# vi dockerfile-entrypoint
  3. # 构建镜像
  4. [root@root dockerfile]# docker build -f dockerfile-entrypoint -t entrypoint .
  5. Sending build context to Docker daemon 4.096kB
  6. Step 1/2 : FROM centos
  7. ---> 300e315adb2f
  8. Step 2/2 : ENTRYPOINT ["ls","-a"]
  9. ---> Running in 198ab82ed16c
  10. Removing intermediate container 198ab82ed16c
  11. ---> 951f0c5be0f2
  12. Successfully built 951f0c5be0f2
  13. Successfully tagged entrypoint:latest
  14. # run 运行 发现我们的 ls -a 命令生效
  15. [root@root dockerfile]# docker run 951f0c5be0f2
  16. .
  17. ..
  18. .dockerenv
  19. bin
  20. dev
  21. etc
  22. home
  23. lib
  24. lib64
  25. lost+found
  26. media
  27. mnt
  28. opt
  29. proc
  30. root
  31. run
  32. sbin
  33. srv
  34. sys
  35. tmp
  36. usr
  37. var
  38. # 想追加一个命令 -l ls -al 发现生效
  39. [root@root dockerfile]# docker run 951f0c5be0f2 -l
  40. total 0
  41. drwxr-xr-x. 1 root root 6 Jan 22 16:08 .
  42. drwxr-xr-x. 1 root root 6 Jan 22 16:08 ..
  43. -rwxr-xr-x. 1 root root 0 Jan 22 16:08 .dockerenv
  44. lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
  45. drwxr-xr-x. 5 root root 340 Jan 22 16:08 dev
  46. drwxr-xr-x. 1 root root 66 Jan 22 16:08 etc
  47. drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
  48. lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
  49. lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
  50. drwx------. 2 root root 6 Dec 4 17:37 lost+found
  51. drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
  52. drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
  53. drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
  54. dr-xr-xr-x. 240 root root 0 Jan 22 16:08 proc
  55. dr-xr-x---. 2 root root 162 Dec 4 17:37 root
  56. drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
  57. lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
  58. drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
  59. dr-xr-xr-x. 13 root root 0 Jan 22 13:11 sys
  60. drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
  61. drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
  62. drwxr-xr-x. 20 root root 262 Dec 4 17:37 var

实战:tomcat镜像

1、准备镜像文件 tomcat压缩包 、jdk压缩包

apache-tomcat-9.0.22.tar.gz

jdk-8u11-linux-x64.tar.gz

2、编写dockerfile文件 官方命名 Dockerfile ,build会自动寻找这个文件 就不需要 -f 指定了

  1. [root@root tomcat]# cat Dockerfile
  2. FROM centos
  3. MAINTAINER Hang<1754808103@qq.com>
  4. COPY readme.txt /usr/local/readme.txt
  5. ADD jdk-8u11-linux-x64.tar.gz /usr/local/
  6. ADD apache-tomcat-9.0.22.tar.gz /usr/local/
  7. RUN yum -y install vim
  8. ENV MYPATH /usr/local
  9. WORKDIR $MYPATH
  10. ENV JAVA_HOME /usr/local/jdk1.8.0_11
  11. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  12. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
  13. ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
  14. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  15. EXPOSE 8080
  16. CMD /usr/local/apache-tomcat-9.0.22/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

3、构建镜像

  1. # docker build -t diytomcat .
  2. Removing intermediate container 8ae0bf3da639
  3. ---> 731ad02de5b7
  4. Step 7/15 : ENV MYPATH /usr/local
  5. ---> Running in 096e09b9bc21
  6. Removing intermediate container 096e09b9bc21
  7. ---> 4af21aee2224
  8. Step 8/15 : WORKDIR $MYPATH
  9. ---> Running in 754abbc7213e
  10. Removing intermediate container 754abbc7213e
  11. ---> b90b463448c6
  12. Step 9/15 : ENV JAVA_HOME /usr/local/jdk1.8.0_11
  13. ---> Running in 8d88b767e5ba
  14. Removing intermediate container 8d88b767e5ba
  15. ---> 8be538aa441f
  16. Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  17. ---> Running in 2d474aacec81
  18. Removing intermediate container 2d474aacec81
  19. ---> d2a196f068ee
  20. Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
  21. ---> Running in 57b51e71729c
  22. Removing intermediate container 57b51e71729c
  23. ---> 82bc59fffad0
  24. Step 12/15 : ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
  25. ---> Running in 132900cd06c0
  26. Removing intermediate container 132900cd06c0
  27. ---> 26764aa6f6e6
  28. Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  29. ---> Running in dd532def866f
  30. Removing intermediate container dd532def866f
  31. ---> 20a93b435b70
  32. Step 14/15 : EXPOSE 8080
  33. ---> Running in 791216126e87
  34. Removing intermediate container 791216126e87
  35. ---> 6187b918f77d
  36. Step 15/15 : CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out
  37. ---> Running in 1aee1676f7d3
  38. Removing intermediate container 1aee1676f7d3
  39. ---> 0c58fc779b7a
  40. Successfully built 0c58fc779b7a
  41. Successfully tagged dirtomcat:latest

启动容器,出现错误

启动镜像,ID出来,可是docker ps 发现没有运行

使用docker logs 容器ID 查看报错内容

出现 /bin/startup.sh:Pemission denied

解决方法

  1. 进入容器
  2. #启动容器
  3. [root@root tomcat]# docker run -it -d dirtomcat /bin/bash
  4. f6dfac5e79aedf94afb79c9797aebb3f198a0b17a297b94ba72e5a686d7a0741
  5. #查看正在运行的容器
  6. [root@root tomcat]# docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. f6dfac5e79ae dirtomcat "/bin/bash" 2 seconds ago Up 1 second 8080/tcp strange_keller
  9. #进入容器
  10. [root@root tomcat]# docker exec -it f6dfac5e79ae /bin/bash
  11. [root@f6dfac5e79ae local]# ls
  12. apache-tomcat-9.0.22 bin etc games include jdk1.8.0_11 lib lib64 libexec readme.txt sbin share src
  13. #使用 startup.sh 命令 发现报错 原因是权限不够
  14. [root@f6dfac5e79ae local]# startup.sh
  15. bash: /usr/local/apache-tomcat-9.0.22/bin/startup.sh: Permission denied
  16. #赋权 再启动 发现 catalina.sh 权限不够
  17. [root@f6dfac5e79ae local]# chmod 777 /usr/local/apache-tomcat-9.0.22/bin/startup.sh
  18. [root@f6dfac5e79ae local]# startup.sh
  19. Cannot find /usr/local/apache-tomcat-9.0.22/bin/catalina.sh
  20. The file is absent or does not have execute permission
  21. This file is needed to run this program
  22. #继续给 catalina.sh 赋权
  23. [root@f6dfac5e79ae /]# chmod 777 /usr/local/apache-tomcat-9.0.22/bin/catalina.sh
  24. #再次启动 tomcat 启动成功
  25. [root@f6dfac5e79ae /]# startup.sh
  26. Using CATALINA_BASE: /usr/local/apache-tomcat-9.0.22
  27. Using CATALINA_HOME: /usr/local/apache-tomcat-9.0.22
  28. Using CATALINA_TMPDIR: /usr/local/apache-tomcat-9.0.22/temp
  29. Using JRE_HOME: /usr/local/jdk1.8.0_11
  30. Using CLASSPATH: /usr/local/apache-tomcat-9.0.22/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.22/bin/tomcat-juli.jar

那么我们修改一下dockerfile文件内容

  1. [root@root tomcat]# cat Dockerfile
  2. FROM centos
  3. MAINTAINER root<1754808@qq.com>
  4. COPY readme.txt /usr/local/readme.txt
  5. ADD jdk-8u11-linux-x64.tar.gz /usr/local/
  6. ADD apache-tomcat-9.0.22.tar.gz /usr/local/
  7. RUN yum -y install vim
  8. RUN chmod 777 /usr/local/apache-tomcat-9.0.22/bin/startup.sh
  9. RUN chmod 777 /usr/local/apache-tomcat-9.0.22/bin/catalina.sh
  10. ENV MYPATH /usr/local
  11. WORKDIR $MYPATH
  12. ENV JAVA_HOME /usr/local/jdk1.8.0_11
  13. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  14. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
  15. ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
  16. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  17. EXPOSE 8080
  18. CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

构建镜像

  1. [root@root tomcat]# docker build -t lh_tomcat .
  2. Sending build context to Docker daemon 169.9MB
  3. Step 1/17 : FROM centos
  4. ---> 300e315adb2f
  5. Step 2/17 : MAINTAINER root<1754808103@qq.com>
  6. ---> Using cache
  7. ---> f23b466173fb
  8. Step 3/17 : COPY readme.txt /usr/local/readme.txt
  9. ---> Using cache
  10. ---> 5dfad04cae31
  11. Step 4/17 : ADD jdk-8u11-linux-x64.tar.gz /usr/local/
  12. ---> Using cache
  13. ---> e15afd0717d9
  14. Step 5/17 : ADD apache-tomcat-9.0.22.tar.gz /usr/local/
  15. ---> Using cache
  16. ---> 8b3b0b260f0c
  17. Step 6/17 : RUN yum -y install vim
  18. ---> Using cache
  19. ---> 731ad02de5b7
  20. Step 7/17 : RUN chmod 777 /usr/local/apache-tomcat-9.0.22/bin/startup.sh
  21. ---> Using cache
  22. ---> e60e5bb8d68d
  23. Step 8/17 : RUN chmod 777 /usr/local/apache-tomcat-9.0.22/bin/catalina.sh
  24. ---> Using cache
  25. ---> 1bdadcf5f05c
  26. Step 9/17 : ENV MYPATH /usr/local
  27. ---> Running in dc5f851a95aa
  28. Removing intermediate container dc5f851a95aa
  29. ---> 567826b1db9b
  30. Step 10/17 : WORKDIR $MYPATH
  31. ---> Running in a1b9fa1f25c8
  32. Removing intermediate container a1b9fa1f25c8
  33. ---> f2da44f2566d
  34. Step 11/17 : ENV JAVA_HOME /usr/local/jdk1.8.0_11
  35. ---> Running in 1525576adae9
  36. Removing intermediate container 1525576adae9
  37. ---> 422a260a9854
  38. Step 12/17 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  39. ---> Running in ff3679d3d0d7
  40. Removing intermediate container ff3679d3d0d7
  41. ---> 1f2fb5b405ce
  42. Step 13/17 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
  43. ---> Running in c627139c2a0e
  44. Removing intermediate container c627139c2a0e
  45. ---> 941804071257
  46. Step 14/17 : ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
  47. ---> Running in 201a8d7d454b
  48. Removing intermediate container 201a8d7d454b
  49. ---> 6a3edac3ea02
  50. Step 15/17 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  51. ---> Running in 5403ebe0c029
  52. Removing intermediate container 5403ebe0c029
  53. ---> 3de5361ec881
  54. Step 16/17 : EXPOSE 8080
  55. ---> Running in a1e4f56c1cb5
  56. Removing intermediate container a1e4f56c1cb5
  57. ---> 98fd728337df
  58. Step 17/17 : CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
  59. ---> Running in 3b183e06aecd
  60. Removing intermediate container 3b183e06aecd
  61. ---> 9fcc0d5c6a4e
  62. Successfully built 9fcc0d5c6a4e
  63. Successfully tagged lh_tomcat:latest

重新启动容器

  1. #启动
  2. [root@root tomcat]# docker run -d -p 9100:8080 --name lh_tomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs lh_tomcat
  3. 57f64d17045fe343a60cbbec368cac9b0a201a181253903828bb8cbb2a73e51d
  4. #查看正在运行的容器,发现正在运行
  5. [root@root tomcat]# docker ps
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. 57f64d17045f lh_tomcat "/bin/sh -c '/usr/lo…" 2 seconds ago Up 2 seconds 0.0.0.0:9100->8080/tcp lh_tomcat
  1. #### 访问测试
  2. ##### 访问 本机ip:9100

在/home/tomcat/test 下构建两个文件

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  6. version="2.5">
  7. </web-app>

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>哥的页面</title>
  6. </head>
  7. <body>
  8. <h1>哥牛逼!</h1>
  9. </body>
  10. </html>

成功!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/727538
推荐阅读
相关标签
  

闽ICP备14008679号