Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
docker通过读取dockerfile中的指令按步自动生成镜像
docker build -t 机构/镜像名[:tags] dockerfile目录
使用 Dockerfile 定制镜像
From tomcat:lastest [设置基准镜像]
MAINTAINER zyf [该镜像是由谁维护的,只是说明信息]
LABEL description="label对应描述信息,说明作用"
WORKDIR /usr/local/tomcat/webapps [切换工作目录,如果没有还会创建目录]
ADD docker-web ./docker-web [执行xx复制到docker-web下]
docker run -d -p 8001:8080 imageName:tag [执行对外映射端口]
临时容器 构建过程中的存档.一层层执行
同时,如果有另外容器需要构建,前三步是一样的,就可以直接利用cache,节省系统资源
- 定制一个nginx镜像[内部有个index.html文件]
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
FROM | 定制镜像来源 | FROM nginx | 定制基础镜像nginx 后续操作基于nginx | |
FROM scratch | 不依赖于任何镜像 | |||
MAINTAINER | 说明作者 | MAINTINER zyf | ||
LABER | LABEL version=1.0 LABEL description=”描述” |
描述信息 | ||
WORKDIR | 切换目录,没有则创建 | |||
RUN | RUN<命令行> | shell命令 | RUN echo ‘xxx’ | 等同于,在终端操作的 shell 命令 |
RUN[“可执行文件”,”参数1”,”参数2”] | exec命令 | RUN [“./test.php”, “dev”, “offline”] | 等价于 RUN ./test.php dev offline 指令 |
|
copy | COPY [—chown= |
[—chown= |
||
COPY [—chown= |
||||
add | 复制/解压/ 添加远程文件[类似curl/get] |
|||
cmd | ||||
entrypoint | ||||
env | ENV |
设置环境常量 | ENV NODE_VERSION 7.2.0 | 这里设置后 后续就可以使用 $NODE_VERSION引用 |
arg | ARG <参数名>[=<默认值>] | 构建参数,与env作用一致,不过arg仅对dockerfile有效 | ||
volume | VOLUME [“<路径1>”, “<路径2>”…] | 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。避免容易不断变大,重要数据因重启而丢失 | ||
EXPOSE | EXPOSE <端口1> [<端口2>…] | 声明端口 | ||
WORKDIR | WORKDIR <工作目录路径> | 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。 docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在 |
||
USER | USER <用户名>[:<用户组>] | 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。 格式: |
||
HEALTHCHECK | HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令 HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。 |
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。 | ||
ONBUILD | ONBUILD <其它指令> | 用于延迟构建命令的执行 |
run: 在build构建时执行命令
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
shell 格式:[会创建子进程,完成后销毁]
RUN <命令行命令> # <命令行命令> 等同于,在终端操作的 shell 命令。
exec 格式:[官方推荐,替换当前进程保持pid不变]
RUN [“可执行文件”, “参数1”, “参数2”] eg: RUN [“./test.php”, “dev”, “offline”] 等价于 RUN ./test.php dev offline
指令
ENTRYPOINT: 容器启动时执行的命令 只有最后一个entrypoint会被执行
CMD: 容器启动后执行默认命令或参数
开始构建镜像
在 Dockerfile 文件的存放目录下,执行构建动作。
已经准备好了Dockerfile文件 通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)
注:最后的 . 代表本次执行的上下文路径,下一节会介绍。
docker build -t nginx:v3 .
上下文路径
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
常用Dockerfile
#定制镜像来源
FROM java:8
#定义匿名数据卷,创建/tmp目录并持久化到Docker数据文件夹
#因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录
VOLUME /tmp
#添加到指定目录
ADD oa-manager-0.0.1-SNAPSHOT.jar /app/oa-manager-0.0.1-SNAPSHOT.jar
# Djava.security.egd 产生随机数用于sessionID
EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流
EXPOSE 9001
# ENTRYPOINT 类似于 CMD指令[执行命令] 不会被 docker run 的命令行参数指定的指令所覆盖
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/oa-manager-0.0.1-SNAPSHOT.jar"]
docker build -t oa-manager:latest .
其中 . 是上下文环境,将当钱包下都打包
docker run -d -p 5001[服务器port]:9001[容器port] oa-manager
-d 后台运行 -p 9001:9000 将docker容器的9001端口映射到服务器上的5000端口