46 | 如何制作Docker镜像?
孔令飞
该思维导图由 AI 生成,仅供参考
你好,我是孔令飞。
要落地云原生架构,其中的一个核心点是通过容器来部署我们的应用。如果要使用容器来部署应用,那么制作应用的 Docker 镜像就是我们绕不开的关键一步。今天,我就来详细介绍下如何制作 Docker 镜像。
在这一讲中,我会先讲解下 Docker 镜像的构建原理和方式,然后介绍 Dockerfile 的指令,以及如何编写 Dockerfile 文件。最后,介绍下编写 Dockerfile 文件时要遵循的一些最佳实践。
Docker 镜像的构建原理和方式
首先,我们来看下 Docker 镜像构建的原理和方式。
我们可以用多种方式来构建一个 Docker 镜像,最常用的有两种:
通过docker commit命令,基于一个已存在的容器构建出镜像。
编写 Dockerfile 文件,并使用docker build命令来构建镜像。
上面这两种方法中,镜像构建的底层原理是相同的,都是通过下面 3 个步骤来构建镜像:
基于原镜像,启动一个 Docker 容器。
在容器中进行一些操作,例如执行命令、安装文件等。由这些操作产生的文件变更都会被记录在容器的存储层中。
将容器存储层的变更 commit 到新的镜像层中,并添加到原镜像上。
下面,我们来具体讲解这两种构建 Docker 镜像的方式。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了如何通过Dockerfile构建Docker镜像的方法,强调了这是最常用、最标准的制作镜像的方式。作者首先解释了Docker镜像构建的原理和方式,包括通过`docker commit`命令和编写Dockerfile文件来构建镜像。文章详细介绍了Dockerfile指令的基本格式和常用指令,以及编写Dockerfile的最佳实践。此外,还介绍了其他制作镜像的方式,包括通过`docker save`和`docker load`命令以及通过`docker export`和`docker import`命令构建镜像的方法。总的来说,本文内容详实,适合读者快速了解Docker镜像制作的方法和流程,尤其是通过Dockerfile构建镜像的具体步骤和注意事项。文章还提供了课后练习,鼓励读者在实践中加深对Docker镜像制作的理解。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》,新⼈⾸单¥68
《Go 语言项目开发实战》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- jxlwqq自荐一个dockerfile的写法: ```Dockerfile # 多阶段构建:提升构建速度,减少镜像大小 # 从官方仓库中获取 1.17 的 Go 基础镜像 FROM golang:1.17-alpine AS builder # 设置工作目录 WORKDIR /workspace # 安装项目依赖 COPY go.mod go.mod COPY go.sum go.sum RUN go mod download # 复制项目文件,这一步按需复制 COPY . . # 构建名为"app"的二进制文件 RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o app main.go # 获取 Distroless 镜像,只有 650 kB 的大小,是常用的 alpine:latest 的 1/4 FROM gcr.io/distroless/static:nonroot # 设置工作目录 WORKDIR / # 将上一阶段构建好的二进制文件复制到本阶段中 COPY --from=builder /workspace/app . # 设置监听端口 EXPOSE 8080 # 配置启动命令 ENTRYPOINT ["/app"] ```
作者回复: 6666
2021-09-1327 - 随风而过官方文档中最佳实践有介绍,RUN, COPY, ADD 三个指令会创建层,其他指令会创建一个中间镜像,并且不会影响镜像大小。这样我们说的指令合并也就是以这三个指令为主。当然了docker history查看构建历史与镜像大小,更为易读和简约
作者回复: 666
2021-09-127 - 静心感觉介绍IAM项目本身的相关内容少了点,像Docker相关的知识,其实给大家推荐一下资料就可以了。
作者回复: 主要考虑到有些读者基础比较薄弱,需要一些基本的docker知识。如果推荐一些资料,读者要从中找出跟iam相关的内容学习,并且这些资料,大而全,读完再来学习专栏周期会比较久。 我直接列出了一些核心知识,整理后供读者学习,能节省读者不少时间。
2021-11-042 - 冷峰go get 依赖 git 的吧, 不装 git , go get 能运行吗?
作者回复: 不安装git,go get基本不能运行。课程一开始就带着你们安装了git
2022-11-06归属地:广东 - wei 丶老师想确认下,第二阶段的FROM busybox是会覆盖掉第一阶段的FROM是嘛,只是用第一阶段进行编译而已,然后用第二阶段的镜像去运行app
作者回复: 你说的是对的。 第一阶段只是用来编译第二阶段需要的文件。docker后面运行的镜像是由第二阶段来构建的。
2021-10-16 - yandongxiao总结: 容器镜像的构建主要是通过Dockerfile来完成,构建过程如下: 1. 创建一个临时目录,将Context中的文件解压到该目录; 2. 执行Dockfile中的命令,一般是顺序执行,如果是多阶段构建,也会并行执行指令。 3. Docker Daemon 会为每条指令创建一个临时容器,执行该指令,生成镜像层,并缓存该镜像层。 4. 最终,将所有镜像层进行合并,生成最后的容器镜像。 最佳实践: Dockerfile指令大写;From 选择官方容器镜像,指定镜像的tag; 使用尽量少地层:构建时将相同指令的内容放到一层;不要在Dockerfile中修改文件权限;采用多阶段构建,大幅减少容器镜像的体积。 充分利用缓存:不易修改的指令放在前面。 推荐使用COPY而非ADD;ENTRYPOINT和CMD结合使用。2021-12-05
收起评论