Docker(二)

张开发
2026/4/21 9:57:50 15 分钟阅读

分享文章

Docker(二)
Dockerfile文件一、概述Dockfile文件是镜像生成的一种方式。Dockerfile 是一个文本格式的配置文件用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile文件中的每一个命令都会创建镜像的一层。二、常见命令命令字作用语法FROM指定基础镜像并且必须是第一条指令。FROMimageFROMimage:tagFROMimage:digestRUN镜像创建时运行指定的命令。注意多行命令不要写多个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 param2LABEL为镜像指定标签一个Dockerfile种可以有多个LABEL 注意LABEL会继承基础镜像中的LABEL如遇到key相同则值覆盖LABELkeyvaluekeyvaluekeyvalue...MAINTAINER指定作者MAINTAINER nameEXPOSE暴漏容器运行时的监听端口给外部但是EXPOSE并不会使容器访问主机的端口EXPOSE portENV设置环境变量多环境变量使用空格隔开ENV keyvalue ENV keyvalue keyvalue keyvalue...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 param2VOLUME实现挂载功能可以将内部文件夹或者其他容器中得文件夹挂载到这个容器中一般的使用场景为需要持久化存储数据时 [/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 UIDWORKDIR设置工作目录对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建也可以设置多次默认工作目录是/WORKDIR /path/to/workdirARG设置变量命令ARG命令定义了一个变量在docker build创建镜像的时候使用 --build-argvarnamevalue来指定参数如果用户在build镜像时指定了一个参数没有定义在Dockerfile种那么将有一个Warning 提示如下 [Warning] One or more build-args [foo] were not consumed. 如果我们给了ARG定义的参数默认值那么当build镜像时没有指定参数值将会使用这个默认值ARGname[default value]STOPSIGNAL当容器退出时给系统发送什么样的指令STOPSIGNAL signalHEALTHCHECK容器健康状况检查命令 第一个的功能是在容器内部运行一个命令来检查容器的健康状况 第二个的功能是在基础镜像中取消健康检查命令 [OPTIONS]的选项支持以下三中选项 intervalDURATION 两次检查默认的时间间隔为30秒 timeoutDURATION 健康检查命令运行超时时长默认30秒 retriesN 当连续失败指定次数后则容器被认为是不健康的状态为unhealthy默认次数是3 注意 HEALTHCHECK命令只能出现一次如果出现了多次只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功具体的返回值如下 0: success - 表示容器是健康的 1: unhealthy - 表示容器已经不能工作了 2: reserved - 保留值HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE三、制作镜像3.1、编写dockerfile文件FROM ubuntuRUN apt update apt install -y gcc make wget apt install -y libpcre3 libpcre3-dev zlib1g-dev openssl libssl-devRUN 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 installEXPOSE 80CMD [/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.rpmRUN yum install -y wget lftp gcc gcc-c make openssl-devel pcre-devel pcre yum clean allRUN useradd -s /sbin/nologin -M www#WORKDIR 相当于cdWORKDIR /usr/local/nginx-1.8.0RUN ./configure --prefix/usr/local/nginx --userwww --groupwww --with-http_ssl_module --with-pcre make make installRUN 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_VARvalue .④--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 version1.0 .例构建一个带有特定标签和构建参数的镜像docker build -t myimage:1.0 --build-arg MY_VARvalue .

更多文章