Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41031 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

46 | 如何制作Docker镜像?

Dockerfile最佳实践
Dockerfile指令介绍
容器被入侵后使用docker commit
构建临时的测试镜像
使用多阶段构建
使用.dockerignore忽略构建镜像时非必需的文件
尽量使用Dockerfile共享镜像
推荐将CMDENTRYPOINT指令结合使用
优先使用COPY而非ADD指令
充分利用缓存
FROM指令应该包含tag
给镜像打上标签
不要在Dockerfile中修改文件的权限
使用更少的层,把相关的内容放到一个层,并使用换行符进行分割
在构建镜像时,删除不需要的文件,只安装需要的文件
在选择基础镜像时,尽量选择官方的镜像
建议所有的Dockerfile指令大写
其他指令:EXPOSE, HEALTHCHECK, STOPSIGNAL
定义容器启动时执行命令的指令:CMD, ENTRYPOINT
定义镜像构建过程的指令:COPY, ADD, RUN, USER, WORKDIR, ARG, ENV, VOLUME, ONBUILD
定义镜像维护者的指令:MAINTAINER
定义基础镜像的指令:FROM
通过Dockerfile来构建镜像
通过docker commit命令构建镜像
Dockerfile最佳实践
Dockerfile指令介绍
Docker镜像构建原理和方式
如何制作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
立即购买
登录 后留言

全部留言(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-13
    27
  • 随风而过
    官方文档中最佳实践有介绍,RUN, COPY, ADD 三个指令会创建层,其他指令会创建一个中间镜像,并且不会影响镜像大小。这样我们说的指令合并也就是以这三个指令为主。当然了docker history查看构建历史与镜像大小,更为易读和简约

    作者回复: 666

    2021-09-12
    7
  • 静心
    感觉介绍IAM项目本身的相关内容少了点,像Docker相关的知识,其实给大家推荐一下资料就可以了。

    作者回复: 主要考虑到有些读者基础比较薄弱,需要一些基本的docker知识。如果推荐一些资料,读者要从中找出跟iam相关的内容学习,并且这些资料,大而全,读完再来学习专栏周期会比较久。 我直接列出了一些核心知识,整理后供读者学习,能节省读者不少时间。

    2021-11-04
    2
  • 冷峰
    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
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部