DockerFile示例展示:
FROM adoptopenjdk/openjdk7:latest //获取base image
RUN mkdir /opt/app //类似于执行 linux指令
COPY demo-docker.jar /opt/app/ //类似于linux copy指令
EXPOSE 8080 //对外端口
CMD ["java", "-jar", "/opt/apps/demo-docker.jar"] //执行命令 java -jar /opt/apps/demo-docker.jar
FROM
一般是Dockfile开头的语法,他的作用是指定我们所新创建的container的base image
FROM scratch //表示我们从头去创建container不依赖于base image
FROM adoptopenjdk/openjdk8:latest //表示从某个base image基础上创建container
LABEL
给创建的镜像添加标签,比如作者信息,版本信息,描述信息等
LABEL maintainer = "作者姓名"
LABEL version = "版本信息"
LABEL description = "描述"
RUN
相当于执行命令,比如我们需要在镜像中安装一些软件,那么就需要使用RUN语法,但需要注意的是,由于每条RUN操作会在docker之中新建一个镜像,所以我们尽量将一些命令合并成一条,在这里我们可以使用反斜杠换行,使其阅读美观
RUN yum -y update && \
yum install -y net-tools ntpdate && \
mkdir -p /opt/nginx/{html,conf}
WORKDIR
类似于linux中的 cd 命令,在对目录进行操作时,需要注意
WORKDIR /opt/software //如果没有会自动创建/opt/software目录
WORKDIR apps //同上
RUN pwd //输出内容是/opt/software/apps
ADD 和 COPY
ADD | COPY | |
---|---|---|
相同功能 | 将某文件复制到固定目录下 | 将某文件复制到固定目录下 |
不通功能 | 可以将tar文件解压提取到固定目录下 | 单纯复制文件 |
示例 | ADD demo /opt ADD demo.tar.gz /opt |
COPY demo /opt |
如果想添加远程文件、目录,可使用 RUN + curl/wget
ENV
为当前容器设置环境变量时,可以使用ENV设置一个常量,如想安装一个5.7的MYSQL时我们可以这样做
ENV MYSQL_VERSION 5.7 //设置常量 MYSQL_VERSION值是5.7
RUN yum install -y mysql-server = "${MYSQL_VERSION}" //引用常量
CMD 和 ENTRYPOINT
dockerfile有两种书写格式,cmd和entrypoint在这两种书写格式中输出的结果不通
RUN yum install -y ntpdate
CMD echo "hello world"
ENTRYPOINT echo "hello world"
FROM centos7
ENV name hello-world
ENTRYPOINT echo "${name}" //输出是hello-world
RUN ["yum","install","-y","ntpdate"]
CMD ["/bin/echo","hello-world"]
ENTRYPOINT ["/bin/echo","hello-world"]
FROM centos7
ENV name hello-world
ENTRYPOINT ["bin/echo","${name}"] //输出是${name}
两种不同输出的原因是因为第一种Dockerfile是shell格式执行命令,默认就在linux的shell里执行。第二种Dockerfile我们去执行的是 echo这个命令而不是在linux的shell下执行命令,因此输出不一样。
1)CMD
容器启动时默认执行的命令,如果docker run指定了其他命令,CMD命令被忽略,例如:
FROM centos7
CMD echo "hello-world"
docker run [image] 输出就是 hello-world
docker run [image] /bin/bash 默认进入了当前container
注:如果定义了多个CMD,只有最后一个CMD会被执行
2)ENTRYPOINT
让容器以应用程序或者服务的形式运行
不会被忽略,一定会执行
最佳实践是写一个shell 脚本作为 ENTRYPOINT
EXPOSE
功能为暴漏容器运行时的监听端口给外部
但是EXPOSE并不会使容器访问主机的端口
如果想使容器与主机的端口有映射关系,必须在容器启动的时候加上 -P 参数
VOLUME
可实现挂载功能,容器告诉Docker在主机上创建一个目录(默认情况下是在/var/lib/docker),然后将其挂载到指定的路径。
当删除使用该Volume的容器时,Volume中的内容本身不会受到影响,它可以一直存在下去
FROM centos7 //将该镜像的存储内容挂载到宿主机data文件夹下,这样即使删除了该镜像,再重新创建后,也不会影响数据
VOLUME /data
CMD echo "hello-world"
Dockerfile更多语法请参考docker doc文档