Docker DockerFile

Docker file简单介绍

Docker可以使用Dockerfile的内容来自动构建镜像。Dockerfile也是一个文件,其中有创建镜像、运行指令等一系列的命令,且每行只支持一个运行命令。

Docker file分为四部分组成

  • 基础镜像信
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

dockerfile指令忽略大小写,建议大写,#作为注释,每行只支持一条指令,指令可以带多个参数。

dockerfile指令有

  • 构建指令:用于构建image,其指定的操作不会在运行image的容器中执行。
  • 设置指令:用于设置image的属性,其指定的操作会在运行image的容器中执行。

    Dockerfile指令

    Dockerfile指令一共有以下种:

    1、FROM

    用来指定基础镜像,然后通过在基础镜像上构建新的镜像,基础镜像一般有远程或本地仓库。并且Dockerfile文件第一行必须的FROM指令,如果一个Dockerfile需要创建多个镜像,可以使用多个FROM指令。
    1. #具体使用用法如下:
    2. FROM < image_name > #默认是latest版本
    3. FROM <image:version> #指定版本

    2、MAINTAINER

    指定镜像的创建者信息
    1. #具体使用法如下:
    2. MAINTAINER < name >

    3、RUN

    运行所有基础镜像能支持的命令,同样也可以使用多条RUN指令,可以使用\来换行 ```dockerfile

    具体使用法如下:

    RUN < command > RUN [“executable”, “param1”, “param2” … ] (exec form)
  1. <a name="Th4FO"></a>
  2. ### 4、CMD
  3. 用于容器启动时的指定操作,它可以是命令,也可以是脚本,但只执行一次,如果有多少默认只会执行最后一个。
  4. ```dockerfile
  5. #具体使用法如下:
  6. CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐
  7. CMD command param1 param2,在/bin/sh上执行
  8. CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。

5、EXPOSE

指定容器的端口映射(容器与物理机),运行容器时加上-p参数指定EXPOSE设置的端口。EXPOSE可以设置多个端口号,相应地运行容器配套多次使用-p参数。可以通过docker port +容器需要映射的端口号和容器ID来参考宿主机的映射端口。

  1. #具体使用法如下:
  2. EXPOSE <port> [port1 , port2 ............]

6、ENV

在镜像中用于设置环境变量的,然后RUN命令可以使用此设置的环境变量,在容器启动后也以通过docker inspect查看环境变量,可以通过docker run --env key=value来设置或修改环境变量。

  1. #具体使用法如下:
  2. ENV <key> <value>
  3. ENV JAVA_HOME /usr/local/jdk

7、ADD

复制指定的源文件、目录、URL到容器的指定目录中。所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0。

  • 如果源是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;
  • 如果源文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);
  • 如果源是文件且目标目录中不使用斜杠结束,则会将目标目录视为文件,源的内容会写入目标目录;
  • 如果源是文件且目标目录中使用斜杠结束,则会源文件拷贝到目标目录下。

    1. #具体使用法如下:
    2. ADD <源> <目标>

    8、COPY

    复制本地主机的源(默认为Dockerfile所在的目录)到容器中的目标中,目标路径不存在时会自动创建。

    1. #具体使用法如下:
    2. COPY <源> <目标>
    3. COPY web/index.html /var/web/
  • 路径必须是绝对路径,如果不存在,会自动创建对应目录

  • 路径必须是Dockerfile 所在路径的相对路径
  • 如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制

    9、ENTRYPOINT

    指定容器启动后执行的命令,多行只执行最后一行。并且不可被docker run提供的参数覆盖。
    1. #具体使用法如下:
    2. ENTRYPOINT "command" "param1" "param2"

    10、VOLUME

    创建一个可以从本地主机或其它容器挂载的挂载点,一般用于存放数据。与docker run -v也可以实现此功能。
    1. #具体使用法如下:
    2. VOLUME [directory_name]
    3. VOLUME /docker_data

    11、USER

    指定容器运行时使用的用户或UID,后面RUNCMDENTRYPIONT都会使用此用户来运行命令。
    1. #具体使用法如下:
    2. USER [username/uid]

    12、WORKDIR

    指定RUNCMDENTRYPIONT指定的命令的运行目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /data WORKDIR work。最终的路径就是/data/work。path路径也可以是环境变量。
    1. #具体使用方法如下:
    2. WORKDIR [path]

    13、ONBUILD

    配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。
    1. #具体使用法如下:
    2. ONBUILD [INSTRUCTION]

    通过Dockerfile快速构建镜像

    接下来,通过构建一个Tomcat镜像,来演示Dockerfile的使用方法,前提是安装Docker环境: ```bash [root@master tomcat]# ll 总用量 190504 -rw-r—r— 1 root root 9552281 6月 7 15:07 apache-tomcat-8.5.31.tar.gz -rw-r—r— 1 root root 32 7月 3 09:41 index.jsp -rw-r—r— 1 root root 185515842 9月 20 2017 jdk-8u144-linux-x64.tar.gz [root@master tomcat]# cat index.jsp welcome to mingongge’s web site [root@master tomcat]# pwd /root/docker/tomcat [root@master tomcat]# vim Dockerfile

    config file start

    FROM centos MAINTAINER mingongge

add jdk and tomcat software

ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.31.tar.gz /usr/local/ ADD index.jsp /usr/local/apache-tomcat-8.5.31/webapps/ROOT/

config java and tomcat ENV

ENV JAVA_HOME /usr/local/jdk1.8.0_144 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.31/ ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

config listen port of tomcat

EXPOSE 8080

config startup command of tomcat

CMD /usr/local/apache-tomcat-8.5.31/bin/catalina.sh run

end of config-file

  1. <a name="x5kp6"></a>
  2. ### 构建过程
  3. ```bash
  4. [root@master tomcat]# docker build -t tomcat-web . #这个.不用注释了吧相信懂的人自然懂的
  5. Sending build context to Docker daemon 195.1 MB
  6. Step 1/11 : FROM centos
  7. ---> 49f7960eb7e4
  8. Step 2/11 : MAINTAINER mingongge <Tomcat>
  9. ---> Running in afac1e218299
  10. ---> a404621fac22
  11. Removing intermediate container afac1e218299
  12. Step 3/11 : ADD jdk-8u144-linux-x64.tar.gz /usr/local/
  13. ---> 4e22dafc2f76
  14. Removing intermediate container b1b23c6f202a
  15. Step 4/11 : ADD apache-tomcat-8.5.31.tar.gz /usr/local/
  16. ---> 1efe59301d59
  17. Removing intermediate container aa78d5441a0a
  18. Step 5/11 : ADD index.jsp /usr/local/apache-tomcat-8.5.31/webapps/ROOT/
  19. ---> f09236522370
  20. Removing intermediate container eb54e6eb963a
  21. Step 6/11 : ENV JAVA_HOME /usr/local/jdk1.8.0_144
  22. ---> Running in 3aa91b03d2d1
  23. ---> b497c5482fe0
  24. Removing intermediate container 3aa91b03d2d1
  25. Step 7/11 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  26. ---> Running in f2649b5069be
  27. ---> 9cedb218a8df
  28. Removing intermediate container f2649b5069be
  29. Step 8/11 : ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.31/
  30. ---> Running in 39ef620232d9
  31. ---> ccab256164fe
  32. Removing intermediate container 39ef620232d9
  33. Step 9/11 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
  34. ---> Running in a58944d03d4a
  35. ---> f57de761a759
  36. Removing intermediate container a58944d03d4a
  37. Step 10/11 : EXPOSE 8080
  38. ---> Running in 30681437d265
  39. ---> b906dcc26584
  40. Removing intermediate container 30681437d265
  41. Step 11/11 : CMD /usr/local/apache-tomcat-8.5.31/bin/catalina.sh run
  42. ---> Running in 437790cc642a
  43. ---> 95204158ee68
  44. Removing intermediate container 437790cc642a
  45. Successfully built 95204158ee68

通过构建的镜像启动容器

  1. [root@master tomcat]# docker run -d -p 8080:8080 tomcat-web
  2. b5b65bee5aedea2f48edb276c543c15c913166bf489088678c5a44fe9769ef45
  3. [root@master tomcat]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. b5b65bee5aed tomcat-web "/bin/sh -c '/usr/..." 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp vigilant_heisenberg

访问容器

浏览器输入http://server-ip:8080