Dockerfile 定制镜像并运行以及常用Dockerfile指令

Dockerfile 定制镜像

构建index.jsp入门

  • Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
  • 进入/usr/local目录
cd /usr/local
  • 创建docker文件夹
mkdir docker
  • 创建项目文件夹
cd docker
mkdir myshop
  • 创建index.jsp 和 Dockerfile 文件
vi index.jsp   
# 添加内容  Hello Word!

vi Dockerfile  
# 添加如下内容
FROM tomcat

COPY index.jsp /usr/local/tomcat/webapps/ROOT/index.jsp
  • 构建镜像
docker build -t myshop .
#  . 表示当前目录 Dockerfile 的配置文件路径
#  . 指定Dockerfile 的上下文目录

在这里插入图片描述

  • 查看镜像
docker images

在这里插入图片描述

  • 守护态运行
docker run -p 8080:8080 --name myshop -d myshop
  • 查看是否运行成功
docker ps

在这里插入图片描述

  • 浏览器输入地址 http://192.168.25.129:8080/(输入你对应的虚拟机IP地址)

构建ssm项目

  • 上传本地的打包的ssm.zip到/usr/local/docker/myshop所在的目录下
    • 如果没有对应的文件夹,则新建
  • 新建Dockerfile
vi Dockerfile
  • Dockerfile中的内容
FROM tomcat:latest

WORKDIR /usr/local/tomcat/webapps/ROOT

RUN rm -fr *

COPY ssm.zip .

RUN unzip ssm.zip

RUN rm -rf ssm.zip

WORKDIR /usr/local/tomcat
  • 构建镜像
docker build -t myshop .
  • 守护态运行
docker run -p 8080:8080 --name myshop -d myshop
  • 浏览器输入地址 http://192.168.25.129:8080/(输入你对应的虚拟机IP地址)

Dockerfile 指令

COPY

格式:

  • COPY <源路径>… <目标路径>
  • COPY ["<源路径1>",… “<目标路径>”]
    和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

COPY package.json /usr/src/app/
  • <源路径> 可以是多个,甚至可以是通配符

ADD

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。

比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。

如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。

CMD

  • CMD 指令的格式和 RUN 相似,也是两种格式:

    扫描二维码关注公众号,回复: 10274803 查看本文章
    • shell 格式:CMD <命令>
    • exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
    • 参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
  • Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。

  • 在运行时可以指定新的命令来替代镜像设置中的这个默认命令,比如,ubuntu 镜像默认的 CMD 是 /bin/bash,如果我们直接 docker run -it ubuntu 的话,会直接进入 bash。我们也可以在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release。这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。

  • 在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。

如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

CMD echo $HOME

在实际执行中,会将其变更为:

CMD [ "sh", "-c", "echo $HOME" ]

这就是为什么我们可以使用环境变量的原因,因为这些环境变量会被 shell 进行解析处理。

ENTRYPOINT

  • 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

  • 但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

  • 优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

  • 注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
  • 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,

VOLUME

  • 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
  • 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

更多相关资料请查看参考文档…

参考文档

你知道的越多,你不知道的越多。
有道无术,术尚可求,有术无道,止于术。
如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步

发布了193 篇原创文章 · 获赞 116 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40722827/article/details/105023627