ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker学习4

Docker学习4 一、RUN 执行命令RUN 是 Dockerfile 中最常用的指令主要用于在镜像构建阶段执行命令来修改镜像。具体来说安装依赖RUN apt-get install nginx编译程序RUN gcc -o app main.c下载文件RUN curl -O https://example.com/file.tar.gz配置系统RUN mkdir -p /app/data理解 RUN 的核心是理解镜像分层每一个 RUN 都会在当前层之上创建新的一层这会影响镜像大小。因此合理使用 RUN特别是合并多个 RUN是构建轻量级镜像的关键。1.1、基本语法RUNcommandRUN[executable,param1,param2]RUN 指令是 Dockerfile 中最常用的指令之一。它在 当前镜像层 之上创建一个新层执行指定的命令并提交结果。1.2、Shell 格式RUNapt-getupdate特点默认通过 /bin/sh -c 执行。优势可以使用环境变量、管道、重定向等 Shell 特性。1.3、Exec 格式RUN[apt-get,update]特点直接调用可执行文件不经过 Shell。优势避免 Shell 字符串解析问题适用于参数中包含特殊字符的情况。二、COPY 复制文件COPY 是在构建镜像时将构建上下文Dockerfile 所在目录及其子目录中的文件或目录复制到容器内的指令。它是处理应用代码、配置文件最常用的方式。典型场景复制应用源码COPY . /app复制配置文件COPY nginx.conf /etc/nginx/nginx.conf复制静态资源COPY public /app/public类比搬家打包行李FROM ubuntu 买了一辆空货车基础镜像RUN apt-get install 在车里装了货架、工具装软件环境COPY . /app 把你的货物搬上车没有这步车开走了货还在原地COPY 就是装货上车的那一步。2.1、基本语法COPY[选项]源路径...目标路径COPY[选项][源路径1,源路径2,...目标路径]COPY 指令将构建上下文中的文件或目录复制到镜像内。三、CMD 容器启动命令CMD 指令用于指定容器启动时默认执行的命令。它定义了容器的 “主进程”。如果用户在 docker run 时提供命令CMD 会被覆盖。核心概念容器的生命周期 主进程的生命周期。CMD 指定的命令就是这个主进程。3.1、语法格式格式语法推荐程度exec 格式CMD [可执行文件, 参数1, 参数2]✅ 推荐shell 格式CMD 命令 参数1 参数2⚠️ 简单场景参数格式CMD [参数1, 参数2]配合 ENTRYPOINT四、ENTRYPOINT 入口点如果说 CMD 是“容器中的默认程序”那么 ENTRYPOINT 就是“把容器变成一个命令”。这个思维转变决定了你何时使用 ENTRYPOINT。4.1、使用 ENTRYPOINT 的典型场景4.1.1、命令行工具你想让镜像像 curl 或 wget 一样使用ENTRYPOINT[curl]# docker run myimage http://example.com → curl http://example.com4.1.2、应用启动脚本你有一个初始化脚本需要接收命令行参数ENTRYPOINT[/app/entrypoint.sh]# docker run myimage --debug → /app/entrypoint.sh --debug4.1.3、与 CMD 结合ENTRYPOINT 定义入口CMD 定义默认参数ENTRYPOINT[python,app.py]CMD[--port,8000]# docker run myimage → python app.py --port 8000# docker run myimage --port 9000 → python app.py --port 9000对比 CMD如果没有这些“把容器当命令用”的需求通常使用 CMD 就足够了。五、ENV 设置环境变量镜像是要离开你的手、到别人机器上运行的。 代码知道怎么跑但运行环境找哪个端口、JDK 在哪、输出要不要缓冲需要有人告诉它——ENV 就是镜像作者替使用者提前写好的标准答案保证拿到镜像的人零配置就能正确启动有特殊情况又能灵活覆盖。没有 ENV每个使用镜像的人都要先读文档/读代码搞清楚这个程序要哪些环境变量、分别该填什么然后每次 docker run 时人肉输入。三个人部署可能填出三个不同的值。有了 ENV镜像作者把合理默认封装进镜像——拿到镜像直接 docker run 就是正确行为确实要改的场景如换端口再用 -e 覆盖。5.1、基本语法## 格式一单个变量ENVkeyvalue## 格式二多个变量ENVkey1value1key2value2...六、ARG 构建参数ARG 不是为了设值是为了设一个构建时可覆盖的值。 如果你的值永远不变、且运行时要用——对直接 ENV 就行ARG 确实多余。ARG 的价值全在于 --build-arg 那个外部能改的灵活性上。ARGVERSION1.0# ① 声明默认值 1.0可被外部覆盖RUNecho$VERSION/version.txt# ② 消费构建时 $VERSION 被替换成实际值dockerbuild --build-argVERSION2.0-tapp.# ③ 外部传入 2.0①读 ARGVERSION1.0→ 查外部传了没传了VERSION2.0②读 RUNecho$VERSION→ 替换 → RUNecho2.0/version.txt ③执行 → 镜像里 /version.txt 的内容是2.0七、VOLUME 定义匿名卷容器存储层应该保持无状态任何运行时数据都应该存储在卷中。7.1、基本语法VOLUME[/路径1,/路径2]VOLUME /路径VOLUME 指令创建挂载点并标记为外部挂载的卷。八、EXPOSE 暴露端口8.1、基本语法EXPOSE端口[端口/协议...]EXPOSE 不开放任何端口它只是声明容器设计上是监听这些端口的——是写在镜像上的服务说明。8.2、EXPOSE 的作用8.2.1、文档说明告诉镜像使用者容器将在哪些端口提供服务## 使用者一看就知道这是 web 应用EXPOSE80443使用者拿到镜像不用翻源码、不用猜一看就知道dockerinspect myimage# ExposedPorts: {80/tcp: {}, 443/tcp: {}}哦这是个 web 应用该映射 80/443。镜像从黑盒变成自描述。8.2.2、配合 -P 使用使用 docker run -P 时Docker 会自动映射 EXPOSE 的端口到宿主机随机端口dockerrun-PmyimageDocker 读镜像里的 EXPOSE 声明自动把每个端口映射到宿主机随机空闲端口宿主机 :32768 ──► 容器 :80 Docker 自动挑的 宿主机 :32769 ──► 容器 :443没有 EXPOSE-P 就不知道要映射什么等于失效。九、WORKDIR 指定工作目录9.1、基本语法WORKDIR工作目录路径WORKDIR 指定后续指令的工作目录。如果目录不存在Docker 会自动创建。WORKDIR 的作用范围构建时 运行时是给构建过程和容器启动后的进程共同的当前目录FROM node:22-alpine WORKDIR /app# ① 声明从此刻起当前目录是 /appCOPY package.json ./# ② 构建时. 指的是 /app → 文件进 /app/package.jsonRUNnpminstall# ③ 构建时在 /app 里执行 npm installCMD[node,server.js]# ④ 运行时容器启动后进程的当前目录也是 /app十、USER 指定当前用户10.1、基本语法USER用户名[:用户组]USERUID[:GID]USER 指令切换后续指令 (RUN、CMD、ENTRYPOINT) 的执行用户。10.2、为什么要使用 USER以非 root 用户运行容器是最重要的安全实践之一。十一、LABEL 为镜像添加元数据11.1、为什么需要 LABEL版本管理记录版本号、构建时间、Git Commit ID联系信息维护者邮箱、文档地址、支持渠道自动化工具CI/CD 工具可以读取标签触发操作许可证信息声明开源协议11.2、基本语法LABELkeyvaluekeyvalue...LABEL 指令以键值对的形式给镜像添加元数据。这些数据不会影响镜像的功能但可以帮助用户理解镜像或被自动化工具使用。11.3、基本用法定义单个标签LABELversion1.0LABELdescription这是一个 Web 应用服务器定义多个标签推荐LABELmaintaineruserexample.com\version1.2.0\descriptionMy App Description\org.opencontainers.image.authorsYeasy
返回列表