Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
docker通过读取dockerfile中的指令按步自动生成镜像
docker build -t 机构/镜像名[:tags] dockerfile目录

使用 Dockerfile 定制镜像

  1. From tomcat:lastest [设置基准镜像]
  2. MAINTAINER zyf [该镜像是由谁维护的,只是说明信息]
  3. LABEL description="label对应描述信息,说明作用"
  4. WORKDIR /usr/local/tomcat/webapps [切换工作目录,如果没有还会创建目录]
  5. ADD docker-web ./docker-web [执行xx复制到docker-web下]
  1. docker run -d -p 8001:8080 imageName:tag [执行对外映射端口]

image.png
临时容器 构建过程中的存档.一层层执行
同时,如果有另外容器需要构建,前三步是一样的,就可以直接利用cache,节省系统资源

  1. 定制一个nginx镜像[内部有个index.html文件]
    1. FROM nginx
    2. RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
    FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

  1. FROM centos
  2. RUN yum install wget
  3. RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
  4. RUN tar -xvf redis.tar.gz
  5. 以上执行会创建 3 层镜像。可简化为以下格式:
  6. FROM centos
  7. RUN yum install wget \
  8. && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
  9. && 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=:] <源路径1>… <目标路径> [—chown=:]
COPY [—chown=:] [“<源路径1>”,… “<目标路径>”]
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(镜像名称:镜像标签)
:最后的 . 代表本次执行的上下文路径,下一节会介绍。

  1. docker build -t nginx:v3 .

上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

常用Dockerfile

  1. #定制镜像来源
  2. FROM java:8
  3. #定义匿名数据卷,创建/tmp目录并持久化到Docker数据文件夹
  4. #因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录
  5. VOLUME /tmp
  6. #添加到指定目录
  7. ADD oa-manager-0.0.1-SNAPSHOT.jar /app/oa-manager-0.0.1-SNAPSHOT.jar
  8. # Djava.security.egd 产生随机数用于sessionID
  9. EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流
  10. EXPOSE 9001
  11. # ENTRYPOINT 类似于 CMD指令[执行命令] 不会被 docker run 的命令行参数指定的指令所覆盖
  12. 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端口