Docker Dockerfile介绍
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile 命令
构建镜像命令
docker build -t 机构/镜像名称<:tags> Dockerfile目录
docker build -t nginx:v3 .
-t
参数
给镜像打标签。.
参数
当前目录,代表本次执行的上下文路径(应用文件存放的位置,可能是本地主机上的一个目录或一个远程的 Git 库)。
基础命令
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
FROM
用于指定要构建的镜像的基础镜像。它通常是 Dockerfile 中的第一条指令。
FROM 镜像
# 发布一个应用到tomcat里,那么的第一步就是FROM tomcat
FROM tomcat<:tags>
LABEL&MAINTAINER
- MAINTAINER
一般写个人或组织id。 - LABEL
纯注释说明,方便阅读的,不会对Dockerfile造成任何影响。
MAINTAINER ldc.com
LABEL version = "1.0.0"
WORKDIR
类似于Linux中的cd命令,当目录不存在时,会自动创建出来,然后再进入。
WORKDIR /usr/local/testdir
COPY&ADD
COPY 用于将文件作为一个新的层添加到镜像中。
# 将1.txt拷贝到根目录下
COPY 1.txt /
# 它不仅仅能拷贝单个文件,还支持Go语言风格的通配符
# 拷贝所有 abc 开头的文件到testdir目录下
COPY abc* /testdir/
ADD 和 COPY 的使用格式一致,功能也类似。
在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
# 将test.tar.gz解压缩然后将解压缩的内容拷贝到/home/work/test
ADD test.tar.gz /home/work/test
只是文件拷贝的话可以用COPY,有额外操作可以用ADD代替。
ENV
设置环境常量,方便下文引用。
ENV JAVA_HOME /usr/local/jdk1.8
# 上面的常量可以通过${xxx}的方式引用
RUN ${JAVA_HOME}/bin/java -jar xxx.jar
ENV设置的常量,其他地方都可以用${xxx}来引用,将来改的时候只需改ENV的变量内容。
运行指令
一共有三个:
- RUN
- CMD
- ENTRYPOINT
FROM centos
RUN ["echo", "image building!"]
CMD ["echo", "container starting!"]
docker build -t ldc.com/test-v1 .
构建镜像的过程中输出了image building!
。
docker run ldc.com/test-v1
容器启动的时输出了container starting!
RUN
RUN指令是在构建镜像时运行,在构建时能修改镜像内部的文件。
执行后面跟着的命令行命令:
- shell 格式
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令
RUN yum -y install vim
- exec 格式
RUN ["可执行文件", "参数1", "参数2"]
RUN ["yum","-y","install","vim"]
对比:shell会创建子进程执行,EXEC不会创建子进程。
CMD
容器启动时执行,而不是镜像构建时执行。
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
CMD ["echo", "container starting..."]
ENTRYPOINT
容器创建时执行,而不是镜像构建时执行。
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENTRYPOINT ["ps","-ef"]
ENTRYPOINT和CMD可以共用一起合并执行。
FROM centos
RUN ["echo", "image building!!!"]
ENTRYPOINT ["ps"]
CMD ["-ef"]
合并执行了ps -ef
。
部署应用到tomcat
准备工作
# 在服务器上创建dockerfile文件夹
mkdir dockerfile
# 进入dockerfile目录
cd dockerfile
# 创建需要部署到tomcat的应用
mkdir helloworld
# 在helloworld目录下创建index.html写上hello dockerfile!
cd helloworld/
vim index.html
Dockerfile
# 在dockerfile目录下创建Dockerfile文件(注意大写D,没有后缀)
touch Dockerfile
在Dockerfile里写上如下内容
FROM tomcat:latest
MAINTAINER ldc.com
WORKDIR /usr/local/tomcat/webapps
ADD helloworld ./helloworld
第一行:因为要部署应用到tomcat上,所以需要从远程仓库里拉取tomcat作为基础镜像。
第二行:描述信息。
第三行:制作完的镜像在容器中run时,tomcat的位置是在/usr/local/tomcat,cd/webapps
后需要把应用程序放在webapps下才能跑。
第四行:ADD命令将宿主机上的helloworld文件夹下的内容拷贝到当前目录(webapps,上一步刚cd进来的)的helloworld文件夹下。
制作镜像
docker build -t ldc.com/test-helloworld:1.0.0 .
查看镜像:
docker images
启动容器
docker run -d -p 8100:8080 ldc.com/test-helloworld:1.0.0
# 查看容器是否存在
docker ps
浏览器访问:http://localhost:8100/helloworld/index.html