docker镜像构建-dockfile文件详解

简介: Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速并且与平台解耦的自动化部署方式。作为当下使用最为广泛的部署技术,如何构建docker镜像,快速部署应用,dockerfile文件编写至关重要;本文主要从dockerfile的基础构成、命令、用例说明几个方面出发,详细介绍如何通过dockerfile制作docker镜像。

一.基本结构

  Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

  命令规则:一般直接使用Dockerfile,不推荐修改;

  书写规则:一份标准的Dockerfile文件中应包含指令、注释等内容,构建指令应使镜像尽量干净没有垃圾文件;

   1、自动化:Dockerfile全程无交互,所以整个构建过程需要保证命令集能够一直持续不断执行下去。

   2、顺序执行:Dockerfile构建过程默认就是自上而下,所以对其中的命令编写要考虑顺序问题。

   3、压缩大小:构建镜像的过程中会产生很多临时文件,对于这些临时文件需要通过在Dockerfile文件最后写上清理系统的命令处理。

   4、易读:便于理解及二次开发。

二.常用命令

1.FROM(引入镜像)
FROM image
FROM image:tag

Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。

2.MAINTAINER(指定维护者信息)
MAINTAINER user_name user_email
3.RUN(执行镜像修改命令)
RUN command
RUN ["EXECUTABLE","PARAM1","PARAM2".....]

前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c "echo hello";后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c","echo hello"]

每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。

4.CMD(执行容器启动命令)
# 使用exec执行,这是推荐的方式。CMD ["executable","param1","param2"]
# 在/bin/sh中执行CMD command param1 param2
# 提供给ENTERYPOINT的默认参数CMD ["param1","param2"]

CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。

5.EXPOSE(暴露端口)
EXPOSE port [port2,port3,...]

EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。

在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。

6.ENV(指定环境变量)
ENV key value

用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。

7.ADD(复制文件)
ADD src dest

该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。

8.COPY(复制文件)
COPY src dest

复制本地主机src目录或文件到容器的dest目录,dest不存在时会自动创建。

9.ENTRYPOINT(执行容器启动后命令)
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2

用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。

10.VOLUME(创建数据卷)
VOLUME ["/data"]

作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。

11.USER(指定用户)
USER username

指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。

RUN groupadd -r docker && useradd -r -g docker docker

12.WORKDIR(指定配置工作目录)

WORKDIR /path

为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

13.ONBUILD(依赖镜像构建)
ONBUILD [INSTRUCTION]

格式ONBUILD [INSTRUCTION]

该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。

三.示例文件解析

1.前端项目镜像构建与部署:nginx

# 引入centos基础镜像FROM centos:7
# 安装相关依赖包,清理缓存RUN yum -y install wget curl gcc gcc-c++ make openssl-devel pcre-devel gd-devel \
          iproute net-tools telnet && \
         yum clean all && \
         rm -rf /var/cache/yum/*
# 将本地ngnix压缩包复制到容器根目录下ADD nginx-1.15.5.tar.gz /
# 进入容器内ngnix目录下,配置ngnix,编译安装,清理缓存,设置时区RUN cd nginx-1.15.5 && \      
    ./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module && \
    make -j 4 && make install && \
    mkdir /usr/local/nginx/conf/vhost && \
    cd / && rm -rf nginx* && \
   ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# ngnix环境变量ENV PATH $PATH:/usr/local/nginx/sbin
# 复制本地配置文件到容器中COPY nginx.conf /usr/local/nginx/conf/nginx.conf
# 配置工作目录WORKDIR /usr/local/nginx
# 暴露容器80端口EXPOSE80# 启动ngnixCMD ["nginx","-g","daemon off;"]

2.java项目镜像构建tomcat

FROM centos:7
ENV VERSION=8.5.43
RUN yum -y install java-1.8.0-openjdk wget curl unzip iproute net-tools && \
        yum clean all && \
        rm -rf /var/cache/yum/*
ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
     sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"'     /usr/local/tomcat/bin/catalina.sh && \
     ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/tomcat/bin
WORKDIR /usr/local/tomcat
EXPOSE8080CMD ["catalina.sh","run"]
相关文章
|
14天前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
172 0
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
24天前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
237 100
|
24天前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
190 99
|
24天前
|
缓存 前端开发 Docker
Docker Layer Caching:加速你的容器构建
Docker Layer Caching:加速你的容器构建
|
24天前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
24天前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
58 8
|
5月前
|
缓存 Shell 网络安全
将应用程序打包成Docker镜像时可能遇到哪些问题?
将应用程序打包成Docker镜像时可能遇到哪些问题?
464 77
|
5月前
|
网络协议 NoSQL Redis
Docker Compose--模板文件
Docker Compose--模板文件
328 29