1、Dockerfile常用指令
1、FROM
语法:FROM :
指明构建的新镜像来自那个基础镜像,如果没有选择tag,那么默认值为latest。
FROM centos:7
#如果不以任何镜像为基础,那么写法为:FROM scratch。官方说明:scratch镜像是一个空镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像
2、MAINTAINER(deprcated)
语法:MAINIAINER
指明镜像维护着及联系方式(一般是邮箱地址)。过时,推荐使用LABEL.
MAINIAINER tom <tom@qq.com>
3、LABEL
语法:LABEL = = =
功能是为镜像指定标签。也可以使用LABELl来指定镜像作者
LABEL maintainer="tom@qq.com"
4、RUN
语法:RUN
构建镜像时运行的shell命令,比如构建的新镜像中我们想在/usr/local 目录下创建一个java目录。
RUN mkdir -p /usr/local/java
5、ADD
语法:ADD …
拷贝文件或目录到镜像中。src可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压。还可以是一个url,如果吧src写成一个url。那么ADD就类似于wget命令,然后自动下载和解压
ADD jdk-1.8.0_linux_x64_bin.tar.gz /usr/local/java
6、COPY
语法:COPY …
拷贝文件或者目录到镜像中。用法同ADD,只是不支持下载和解压。
COPY jdk-1.8.0_linux_x64_bin.tar.gz /usr/local/java
7、EXPOSE
语法:EXPOSE [/ …]
暴露容器运行时的监听端口给外部,也可以指定端口时监听TCP还是UDP,如果未指定协议,则默认为TCP。
EXPOSE 80 443 8080/tcp
如果想使得容器与宿主机的端口有映射关系,必须在容器启动的时候加上-P参数。
8、ENV
语法:ENV 添加单个,ENV =…添加多个
设置容器内环境变量
ENV JAVA_HOME /usr/local/java/jdk-1.8.0/
9、CMD
语法
CMD ehco $JAVA_HOME
#如果创建容器的时候指定了命令,则CMD命令会被替代。假如镜像叫centos:7 ,创建容器时命令是:docker run -it --name centos7 centos:7 echo "helloworld" 或者docker run -it --name centos7 centos:7/bin/bash,就不会输出SJAVA_ HOME的环境变量信息了,因为CMD命令被echo "helloworld"、 /bin/bash 覆盖了。
启动容器时执行的Shell命令。在Dockerfile中只能有-条CMD指令。如果设置了多条CMD,只有最后-条CMD会生效。
10、ENTRYPOINT
启动容器时执行的Shell命令,同CMD类似,不会被docker run命令行指定的参数所覆盖。在Dockerfile中只能有一条ENTRYPOINT指令。如果设置了多条ENTRYPOINT, 只有最后一 条ENTRYPOINT会生效。
语法
ENTRYPOINT ehco $JAVA_HOME
#如果在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数;
#如果在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它两会互相覆盖,谁在最后谁生效
11、WORKDIR
语法:WORKDIR /path/data
为RUN、CMD、ENTRYPOINT 以及COPY和AND设置工作目录。
WORKDIR /usr/local
#指定进入容器的默认目录是 /usr/local
12、VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器。-般的使用场景为需 要持久化存储数据时。
#容器的/var/lib/mysq1 目录会在运行时自动挂载为匿名卷,匿名卷在宿主机的/var/lib/docker/volumes 目录下
VOLUME [" /var/lib/mysq1"]
一般不会在Dockerfile中用到,更常见的还是在docker run的时候通过-V 指定数据卷。
2、Dockerfile文件编写
1、Dockerfile创建镜像
centos+tomcat镜像
#指明构建的新新镜像来源 hub.c.163.com/public/centos:6.7-tools 基础镜像
FROM hub.c.163.com/public/centos:6.7-tools
#通过镜像标签声明作者信息
LABEL maintainer="tom@qq.com"
#设置默认工作目录
WORKDIR /usr/local
#新镜像构建成功以后创建目录
RUN mkdir -p /usr/local/java && mkdir mkdir -p /usr/local/tomcat
#拷贝文件到镜像中并解压
ADD apache-tomcat-7.0.54.tar.gz /usr/local/tomcat
ADD jre-8u291-linux-x64.tar.gz /usr/loacl/java
#暴露容器运行时的8080 监听端口给外部
EXPOSE 8080
#设置容器内 JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jre1.8.0_291
ENV PATH $PATH:$JAVA_HOME/bin
#启动容器时启动 tomcat run 保持在前台有运行程序
CMD ["/usr/local/tomcat/apache-tomcat-7.0.54/bin/catalina.sh","run"]
2、生效Dockerfile文件
# build -f 指定构建文件为Dockerfile -t 指定创建完成的镜像名字和版本
# . 加载资源位置为当前上下文件 就是当前目录
[root@centos08 dockerfile]# docker build -f Dockerfile -t mytomos:01 .
Sending build context to Docker daemon 101.6MB
Step 1/10 : FROM hub.c.163.com/public/centos:6.7-tools
---> b2ab0ed558bb
Step 2/10 : LABEL maintainer="tom@qq.com"
---> Running in c7852639b35a
Removing intermediate container c7852639b35a
---> de18d3412acf
Step 3/10 : WORKDIR /usr/local
---> Running in c9eeb179873b
Removing intermediate container c9eeb179873b
---> 7a05459a464b
Step 4/10 : RUN mkdir -p /usr/local/java && mkdir mkdir -p /usr/local/tomcat
---> Running in 106b663d0574
Removing intermediate container 106b663d0574
---> e3ce2f044210
Step 5/10 : ADD apache-tomcat-7.0.54.tar.gz /usr/local/tomcat
---> f7166e58bf62
Step 6/10 : ADD jre-8u291-linux-x64.tar.gz /usr/loacl/java
---> 3b5110822120
Step 7/10 : EXPOSE 8080
---> Running in af27cec32269
Removing intermediate container af27cec32269
---> c7e1da83a374
Step 8/10 : ENV JAVA_HOME /usr/local/java/jre1.8.0_291
---> Running in 89567b40f4c3
Removing intermediate container 89567b40f4c3
---> bab67686ad81
Step 9/10 : ENV PATH $PATH:$JAVA_HOME/bin
---> Running in 82603c12aa5e
Removing intermediate container 82603c12aa5e
---> 7d5d9ef25aa3
Step 10/10 : CMD ["/usr/local/tomcat/apache-tomcat-7.0.54/bin/catalina.sh","run"]
---> Running in 90283457d447
Removing intermediate container 90283457d447
---> d4552256d551
Successfully built d4552256d551
Successfully tagged mytomos:01
#查看构建成功的镜像
[root@centos08 dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomos 01 d4552256d551 9 seconds ago 867MB
hello-world latest d1165f221234 3 months ago 13.3kB
hub.c.163.com/public/centos 6.7-tools b2ab0ed558bb 4 years ago 602MB
3、启动生成的镜像
[root@centos08 dockerfile]# docker run -id --name mytomos -p 8080:8080 mytomos:01
a76f129bf6e030d887371cec047b1daadf24e016499314927aace432d6b92605