当前位置: 首页 > news >正文

Docker(二)

Dockerfile文件

一、概述

Dockfile文件是镜像生成的一种方式。Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile文件中的每一个命令都会创建镜像的一层。

二、常见命令

命令字作用语法
FROM指定基础镜像,并且必须是第一条指令。FROM<image>FROM<image>:<tag>FROM<image>:<digest>
RUN镜像创建时运行指定的命令。注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 linux操作系统上默认 /bin/sh -c RUN书写时的换行符是 \RUN command RUN ["executable", "param1", "param2"]
CMD功能为容器启动时要运行的命令.注意:里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON arrayCMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2
LABEL为镜像指定标签,一个Dockerfile种可以有多个LABEL 注意:LABEL会继承基础镜像中的LABEL,如遇到key相同,则值覆盖LABEL<key>=<value><key>=<value><key>=<value>...
MAINTAINER指定作者MAINTAINER name
EXPOSE暴漏容器运行时的监听端口给外部,但是EXPOSE并不会使容器访问主机的端口EXPOSE port
ENV设置环境变量,多环境变量使用空格隔开ENV <key><value> ENV <key>=<value> <key>=<value> <key>=<value>...
ADD把文件复制到镜像中;如果把<src>写成一个url,那么ADD就类似于wget命令; 尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据能够将压缩文件自动解压ADD <src>... <dest> ADD ["<src>",... "<dest>"]
SHELL设置默认的 shell 环境。默认情况下,Docker 使用 /bin/sh -cSHELL ["<shell>", "<shell参数>"]
COPY把文件复制到镜像中; 与ADD的区别:COPY的<src>只能是本地文件,其他用法一致COPY <src>... <dest> COPY ["<src>",... "<dest>"]
ENTRYPOINT容器启动时的默认命令; 与CMD比较说明: 相同点: 只能写一条,如果写了多条,那么只有最后一条生效 容器启动时才运行,运行时机相同 不同点: ENTRYPOINT不会被docker run运行的command覆盖,而CMD则会被覆盖 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效。ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2
VOLUME实现挂载功能,可以将内部文件夹或者其他容器中得文件夹挂载到这个容器中,一般的使用场景为需要持久化存储数据时; ["/data"]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的 VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db注意:VOLUME命令在Dockerfile中只能用来创建挂载点,不能指定已经存在的目录作为挂载点。如果指定的目录已经存在,但没有使用VOLUME命令,Docker将会将其作为普通目录对待,而不会创建一个挂载点。VOLUME ["/data"]
USER设置启动容器的用户,可以是用户名或UID注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行USER daemo USER UID
WORKDIR设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次;默认工作目录是:/WORKDIR /path/to/workdir
ARG设置变量命令,ARG命令定义了一个变量;在docker build创建镜像的时候,使用 --build-arg<varname>=<value>来指定参数;如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning 提示如下: [Warning] One or more build-args [foo] were not consumed. 如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值ARG<name>[=<default value>]
STOPSIGNAL当容器退出时给系统发送什么样的指令STOPSIGNAL signal
HEALTHCHECK容器健康状况检查命令; 第一个的功能是在容器内部运行一个命令来检查容器的健康状况 第二个的功能是在基础镜像中取消健康检查命令 [OPTIONS]的选项支持以下三中选项: interval=DURATION 两次检查默认的时间间隔为30秒 timeout=DURATION 健康检查命令运行超时时长,默认30秒 retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3 注意: HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下: 0: success - 表示容器是健康的 1: unhealthy - 表示容器已经不能工作了 2: reserved - 保留值HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE

三、制作镜像

3.1、编写dockerfile文件

FROM ubuntu
RUN apt update && apt install -y gcc make wget && apt install -y libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev
RUN wget http://nginx.org/download/nginx-1.24.0.tar.gz && tar xf nginx-1.24.0.tar.gz && cd nginx-1.24.0 && ./configure --prefix=/usr/local/nginx && make && make install
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos:7

#MAINTAINER 维护者信息
MAINTAINER bertwu

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

3.2、构建镜像

docker build命令解析

-t, --tag: 给镜像打标签,格式为name:tag

docker build -t myimage:latest .

-f, --file: 指定 Dockerfile 的路径。

docker build -f /path/to/Dockerfile .

--build-arg: 设置构建参数,可以在 Dockerfile 中使用ARG指令引用。

docker build --build-arg MY_VAR=value .

--no-cache: 不使用缓存,强制重新构建所有层。

docker build --no-cache .

--pull: 总是尝试拉取最新的基础镜像。

docker build --pull .

--compress: 使用 gzip 压缩构建上下文。

docker build --compress .

--quiet, -q: 静默模式,只输出镜像 ID。

docker build -q .

--target: 指定构建阶段,适用于多阶段构建。

docker build --target mystage .

--network: 指定构建过程中使用的网络模式。

docker build --network mynetwork .

--label: 给镜像添加元数据标签。

docker build --label version=1.0 .

例:构建一个带有特定标签和构建参数的镜像

docker build -t myimage:1.0 --build-arg MY_VAR=value .

http://www.jsqmd.com/news/676024/

相关文章:

  • 2026年语义混合检索系统哪家专业:五家优选品牌对比 - 科技焦点
  • 鲸汤(上海)智能科技有限公司:以 AI 重构企业获客,一部手机就是一支 AI 获客团队 - 品牌企业推荐师(官方)
  • 保姆级教程:用ThinkBook 16+打造完美双系统开发环境(Win11+Ubuntu 20.04)
  • SpringBoot监听Redis键过期事件,实现订单超时自动关闭(附集群版避坑指南)
  • 把Netcat玩出花:从端口扫描到简易蜜罐,Windows下的5个实战场景演练
  • 别再傻等暴力破解!fcrackzip搭配rockyou字典效率翻倍实战
  • 2026年塑料食品包装袋批发厂家优选指南 - 品牌企业推荐师(官方)
  • 鲸汤AI:以大模型技术重构企业获客,赋能中小微企业智能增长 - 品牌企业推荐师(官方)
  • C#调用Phi-3/Qwen2模型时频繁OOM或超时?紧急发布.NET 11专用MemoryPool+Span<T>零拷贝推理补丁包(限前500名开发者)
  • 告别手动点点点:用Python+pywin32脚本实现CANoe自动化测试(附完整源码)
  • 2026年LED纹理屏厂家深度测评:如何为你的项目匹配最佳方案? - 速递信息
  • 终极解决B站缓存视频碎片化:一键合并完整视频的完整指南
  • 从门禁到智能储物柜:手把手教你用51单片机+RC522+语音模块DIY一个可扩展的RFID系统
  • 2026 广州 GEO 优化服务商 TOP5 排名|华南生成式引擎优化行业选型报告 - 品牌企业推荐师(官方)
  • 只需要一条命令,让所有 AI 应用工具共享 skills
  • 删除 SAP HANA Virtual Table 这件事,看起来只是 DROP TABLE,真正要防的是本地删完了,远端也一起没了
  • 2026年亲测:液晶电视面板破裂维修费用大揭秘! - 小何家电维修
  • 还在头疼推客管理?直接换云微推客系统
  • 注塑机数据采集网关|智象九维VBOX 免授权全品牌适配 赋能注塑工厂数字化升级 - 品牌企业推荐师(官方)
  • 告别干扰:深入浅出聊聊5G SRS信号的多用户传输配置(时/频/码分复用详解)
  • 绍兴地理优化服务,如何甄选可靠供应商?
  • Open5GS实战避坑:日志系统太吵?内存管理怎么选?聊聊那些源码里的“小脾气”
  • 微博相册一键批量下载:终极指南,3步搞定高清图片收藏
  • 称重系统常见问题解答(2026最新专家版) - 速递信息
  • EcomGPT-7B电商智能客服实战:Java微服务集成与API调用详解
  • 独家披露:Dify v0.12.3工业增强版内测通道开放倒计时(含OPC UA原生接入插件+ISO 13849-1安全逻辑校验器)
  • 显示真实执行计划
  • HsMod完整指南:基于BepInEx的炉石传说终极游戏体验优化方案
  • Windows驱动签名踩坑记:用VHLK搭建测试环境时,这几个网络和防火墙设置千万别忽略
  • 别再只用Enscape导效果图了!试试这个‘独立EXE文件’功能,向甲方汇报体验直接拉满