IT评测·应用市场-qidao123.com

标题: docker基础(二)之docker build [打印本页]

作者: 刘俊凯    时间: 2024-9-20 23:37
标题: docker基础(二)之docker build
用于学习记录,内容来自于网络,chatgpt3.5,现实操纵等。
概述

docker build 命令用于使用 Dockerfile 创建镜像。
语法

docker build [OPTIONS] PATH | URL | -
命令用法速查

OPTIONS说明:

实例

使用当前目录的 Dockerfile 创建镜像

使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
  1. docker build -t runoob/ubuntu:v1 .
复制代码
使用指定URL的Dockerfile创建镜像

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
  1. docker build github.com/creack/docker-firefox
复制代码
使用指定目录的Dockerfile创建镜像

也可以通过-f Dockerfile文件的位置:
  1. docker build -f /path/to/a/Dockerfile
复制代码
留意:
在执行Dockerfile 中的指令前进行语法检查
在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,
  1. docker build -t test/myapp .
复制代码
有语法错误时会返回:
  1. Sending build context to Docker daemon 2.048 kB
  2. Error response from daemon: Unknown instruction: RUNCMD
复制代码
各选项详解,使用场景, 实例

–build-arg=[]

该选项用于在构建镜像时设置镜像创建时的变量。这个选项允许你在 Dockerfile中使用 ARG 指令界说的变量,而且在构建时动态地向这些变量传递值。
使用场景:
当你的 Dockerfile 中使用了 ARG 指令界说了一些变量,而且你希望在构建镜像时为这些变量传递特定的值,就可以使用--build-arg选项。
实例:
假设在 Dockerfile 中界说了一个变量 VERSION:
ARG VERSION
然后你可以通过--build-arg选项在构建镜像时为这个变量传递值:
  1. docker build --build-arg VERSION=1.0 -t my-image:latest .
复制代码
这个命令中,--build-arg VERSION=1.0 表示为 VERSION 变量传递了值 1.0,这样在构建镜像时就会使用这个值作为 VERSION 变量的取值。
这些选项用于设置容器的 CPU 相关参数,具体含义如下:
–cpu-shares

设置 CPU 使用权重。这个选项允许你为容器指定 CPU 使用的相对权重,即分配给容器的 CPU 资源份额。默认情况下,全部容器的 CPU 权重相同。这可以用于在共享 CPU 时优先分配资源给特定的容器。值越高,分配的 CPU 资源越多。
–cpu-period

限定 CPU CFS (Completely Fair Scheduler) 周期。这个选项用于限定容器可以使用 CPU 的周期。CPU周期单位为微秒,默认为 100000(即100毫秒)。
–cpu-quota

限定 CPU CFS 配额。这个选项用于限定容器的 CPU 使用配额。配额的单位也是微秒,默认为 -1,表示无限定。
–cpuset-cpus

指定使用的 CPU id。允许你限定容器所能使用的 CPU 焦点,以逗号分隔的 CPU 焦点 id。
–cpuset-mems

指定使用的内存 id。允许你限定容器所能使用的内存节点,以逗号分隔的内存节点 id。
这些参数可以在运行容器时使用 docker run 命令传递参数。
举个例子:
  1. docker run --cpu-shares=512 --cpuset-cpus=0-3 -d my-container
复制代码
这个命令表示为容器分配相对权重为512的 CPU 资源,而且限定容器只能使用 CPU id 0 到 3 的焦点。
–disable-content-trust

忽略校验,默认开启;
–disable-content-trust

用于在执行 Docker 镜像相关操纵时禁用内容信任(Content Trust)。默认情况下,Docker 开启了内容信任,即在拉取、推送和构建镜像时会进行数字签名和验证,以确保镜像的完整性和来源的可信性。
如果你使用 --disable-content-trust 选项,Docker 将忽略内容信任,这意味着在拉取、推送和构建镜像过程中不会对镜像进行数字签名和验证。这可能会降低对镜像完整性和来源验证的安全性。
举个例子:
  1. docker pull --disable-content-trust my-image:latest
复制代码
这个命令表示拉取镜像时禁用内容信任。
需要留意的是,尽管 --disable-content-trust 可能会降低验证安全性,但偶然在某些测试和开发情况下可能需要暂时禁用内容信任。在生产情况下,发起始终保持内容信任功能开启,以确保安全性。
-f

用于指定要使用的 Dockerfile 路径。通常情况下,Docker 将在当前目录下寻找名为 Dockerfile 的文件来构建镜像,但是如果你的 Dockerfile 不在当前目录中,你可以使用 -f选项来指定其路径。
使用场景:
当你拥有多个 Dockerfile 大概 Dockerfile 不在当前目录时,你可以使用 -f 选项来明确告诉 Docker 使用特定路径下的 Dockerfile 进行构建。
实例:
  1. docker build -f /path/to/Dockerfile -t my-image:latest .
复制代码
在这个例子中,-f /path/to/Dockerfile 指定了 Dockerfile 的路径为 /path/to/Dockerfile,-t my-image:latest 指定了构建的镜像标签,. 表示构建上下文的路径为当前目录。
这样,Docker 将会使用指定路径下的 Dockerfile 来构建镜像。通常情况下,只有在以下情况下才会需要指定多个 Dockerfile:
在这些情况下,你可以使用 -f 选项来指定不同路径下的不同 Dockerfile 来满意项目的需求。
假设一个项目包罗一个 Web 应用和一个数据库服务,而且在两个不同的目录中分别有它们各自的 Dockerfile,那么你可以使用 -f 选项来分别指定不同的 Dockerfile 构建两个镜像。
假设项目结构如下所示:
  1. ├── webapp/
  2. │   ├── Dockerfile
  3. │   └── ...
  4. └── database/
  5.     ├── Dockerfile
  6.     └── ...
复制代码
在这种情况下,你可以使用如下命令来构建两个镜像:
命令1:
  1. docker build -f /path/to/project/webapp/Dockerfile -t webapp-image:latest /path/to/project/webapp
复制代码
这将使用 webapp 目录下的 Dockerfile构建名为webapp-image的镜像。
命令2:
  1. docker build -f /path/to/project/database/Dockerfile -t database-image:latest /path/to/project/database
复制代码
这将使用database目录下的 Dockerfile 构建名为 database-image 的镜像。
这样就能方便地对项目中的不同组件使用不同的 Dockerfile 进行构建。当使用多阶段构建时,通常会在一个 Dockerfile 中界说多个阶段来实现不同的构建任务,好比编译应用程序、网络依靠和生成最终的可执行文件。
多阶段构建的 Dockerfile 的简朴示例
下面是一个使用多阶段构建的 Dockerfile 的简朴示例:

  1. FROM golang:1.16 AS builder
  2. WORKDIR /app
  3. COPY . .
  4. RUN go build -o myapp
复制代码

  1. FROM alpine:latest
  2. WORKDIR /app
  3. COPY --from=builder /app/myapp .
  4. CMD ["./myapp"]
复制代码
这个 Dockerfile 包罗了两个阶段:
一旦 Dockerfile 中包罗了多个阶段,你可以使用-f选项来指定要构建的 Dockerfile,例如:
  1. docker build -f /path/to/Dockerfile -t myapp-image:latest .
复制代码
这将使用指定路径下的 Dockerfile 来构建名为myapp-image的镜像,此中 Dockerfile 包罗了多个阶段来构建项目的不同部分。
–isolation

--isolation 参数用于指定容器的隔离技术
在 Docker 中,容器的隔离技术决定了容器内的进程如何与宿主机以及其他容器隔离。
常见的容器隔离技术包罗:


例如,要在运行容器时指定使用 Hyperv 隔离技术,可以使用以下命令:
  1. docker run --isolation=hyperv <image>
复制代码
通过指定不同的隔离技术,可以更灵活地管理容器的运行情况,满意特定的安全性和性能需求。
这些隔离技术各有什么应用场景和优缺点,请举例说明

不同的隔离技术适用于不同的场景,每种隔离技术都有其长处和限定。
下面是一些常见的容器隔离技术的应用场景和优缺点:
–label=[]

--label 选项用于为 Docker 镜像添加自界说的元数据标签。这些标签可以资助你对镜像进行组织、分类,而且能在管理和使用镜像的过程中提供更多信息。
使用--label参数可以在构建镜像时为镜像添加元数据标签。例如,你可以将构建者的接洽方式、镜像的版本信息、构建日期大概其他相关信息添加为元数据标签。这样可以资助你更好地管理和跟踪镜像的信息。
以下是使用 --label 选项添加元数据标签的示例:
  1. docker build --label "version=1.0" --label "maintainer=yourname@example.com" -t myimage .
复制代码
上面的命令会为构建的镜像添加version和 maintainer 的元数据标签,分别指定镜像的版本和维护者的接洽方式。
添加元数据标签可以让你在后续使用镜像时更方便地识别和管理镜像,也可以让其他用户更容易地明白和使用这些镜像。
-m

设置内存最大值
–memory-swap

设置Swap的最大值为内存+swap,"-1"表示不限swap;
-m 和 --memory-swap 选项用于限定容器可以或许使用的内存以及 Swap 的最大值。这两个参数用于控制容器可以消耗的体系资源,可以或许资助你更好地管理容器的资源利用情况。
下面是对这两个选项的详细说明:
示例:
  1. docker run -m 1g myimage
复制代码
示例:
  1. docker run --memory-swap 2g myimage
复制代码
这些参数在构建容器时非常有效,可以资助你限定容器的资源使用,防止容器占用过多的内存大概 Swap,从而导致体系资源的耗尽。通过限定内存和 Swap 的使用,你可以更好地控制容器的资源消耗,防止由于容器内存占用过多而影响其他应用程序的正常运行。
   一般设置为多少?
  设置内存和Swap的值取决于你的应用程序的性能需求和体系资源的可用情况。通常情况下,发起根据以下几点来设置内存和Swap的值:
  
  例如,如果你的应用程序对内存的需求较高,但是宿主机的物理内存有限,可以思量设置较小的内存限定,并留一部分Swap供容器使用。具体的数值设置需要根据你的应用程序和体系资源情况来调解和优化。
最佳实践是在生产情况中进行测试并进行性能优化,以确定最适合你的应用程序和体系的内存和Swap设置。别的,如果你使用的是容器编排工具,如Kubernetes 或 Docker Swarm,也可以根据制定的策略来设置容器的资源限定。
举例
假设你的宿主机拥有16GB的内存,对于一个容器应用来说,下面是一种可能的内存和Swap设置。发起:

  1. docker run -m 8g myimage
复制代码

  1. docker run --memory-swap 16g myimage
复制代码
这个设置将允许容器使用8GB的内存和16GB的Swap。当然,具体的设置还需要根据你的应用程序的需求、体系资源状况以及性能体现来做出调解。在现实应用中,你可能需要根据具体情况进行测试和优化,以找到最合适的内存和Swap设置。
–no-cache

创建镜像的过程不使用缓存;
–pull

实验去更新镜像的新版本;
–quiet, -q

安静模式,乐成后只输出镜像 ID;
–rm

设置镜像乐成后删除中间容器;
–shm-size

设置/dev/shm的大小,默认值是64M;
–ulimit

ulimit设置。
–squash

将 Dockerfile 中全部的操纵压缩为一层。
–tag, -t

镜像的名字及标签,通常 name:tag 大概 name 格式;可以在一次构建中为一个镜像设置多个标签。
–network

默认 default。在构建期间设置RUN指令的网络模式
扩展部分

构建时的中间容器会保存在体系中吗?

当使用 docker build 命令构建镜像时,Docker 会根据 Dockerfile 中的指令逐步创建镜像的各个层。在每一步,Docker 会创建暂时的容器来执行相应的命令。这些暂时容器在命令执行完毕后会被主动清算,不会保存在体系中。因此,在构建过程结束后,不会产生中间容器保存在体系中。这些暂时容器的存在对于构建过程的快速性能具有重要意义,但它们并不会占用多余的资源或空间,也不会对正在运行的容器产生影响。
在 Docker 构建镜像的过程中,每个指令在构建镜像的特定层中创建一个存储位置。这些存储位置现实上就是 Docker 镜像的各层。当你重新构建镜像时,如果某个指令的参数、指令本身大概基础镜像没有改变,Docker 会实验重用之前构建好的层。这意味着,只有在 Dockerfile 的某个步骤发生改变时,Docker 才会重新执行该步骤并创建新的层。
当 Docker 检测到某个步骤的参数和指令都没有改变时,它会直接使用缓存的层,而不是重新运行相同的步骤,这样可以节省时间并进步构建效率。这也意味着,纵然之前的暂时容器不再存在,Docker 仍然可以重用之前构建好的层,从而避免重新执行相同的步骤。 因此,纵然之前的暂时容器已经被清算,Docker 仍然可以利用缓存的层,在下一次构建时提供类似的步骤,以进步构建速度和效率。
缓存的层会自行清算吗?

Docker 默认会对构建镜像时生成的缓存层进行管理。当执行 docker build 命令时,Docker 会检查每个步骤的缓存情况,并实验复用之前构建好的层,以加速构建速度。 对于缓存层的清算,Docker 会根据一些条件来确定是否需要重新构建和清算缓存。如果在 Dockerfile 中的某个步骤发生了变化,好比更改了命令大概参数,Docker 会丢弃该步骤之后的缓存层,并重新构建。别的,你也可以通过在构建时使用 --no-cache 参数来禁用缓存,逼迫 Docker 重新构建镜像。 总的来说,Docker 会根据需要主动管理缓存的层,确保在构建镜像时可以或许最大程度地复用之前构建好的层,并在需要时进行清算。
缓存层的管理策略是什么? 可以自行查看吗?

在 Docker 中,缓存层的管理是由 Docker 引擎主动进行的,而且并没有提供直接查看缓存层的命令或工具。
Docker 引擎会根据构建过程中的指令和层之间的依靠关系,进行适当的缓存管理 。它会实验重用之前构建好的层,并在必要时进行清算。这种管理策略是隐含的,通常不需要用户直接干预。 固然没有直接查看缓存层的命令,但你可以通过查看镜像的汗青记录来了解构建镜像时各步骤的情况,以及层的复用情况。可以使用 docker history 命令来查看镜像的汗青记录,这可以让你了解每个步骤都对应了哪些层,以及它们是否被缓存和复用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4