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 相似,也是两种格式:
- 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 参数修改挂载点。
更多相关资料请查看参考文档…
参考文档
你知道的越多,你不知道的越多。
有道无术,术尚可求,有术无道,止于术。
如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步