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

posted @ 2021-04-28 19:24  当康  阅读(197)  评论(0编辑  收藏  举报