docker读书笔记003

1、完整的应用容器化过程主要分为以下几个步骤。
(1)编写应用代码。
(2)创建一个Dockerfile,其中包括当前应用的描述、依赖以及该如何运行这个应用。
(3)对该Dockerfile执行docker image build
 命令。
(4)等待Docker将应用程序构建到Docker镜像中。
一旦应用容器化完成(即应用被打包为一个Docker镜像),就能以镜像的形式交付并以容器的方式运行了。


2、每个Dockerfile文件第一行都是FROM
 指令。FROM
 指令指定的镜像,会作为当前镜像的一个基础镜像层,当前应用的剩余内容会作为新增镜像层添加到基础镜像层之上。
 
3、Dockerfile中通过标签(LABLE)方式指定了当前镜像的维护者. com”。每个标签其实是一个键值对(Key-Value),在一个镜像当中可以通过增加标签的方式来为镜像添加自定义元数据。备注维护者信息有助于为该镜像的潜在使用者提供沟通途径,这是一种值得提倡的做法。

4、RUN apk add --update nodejs nodejs-npm
 指令使用alpine
 的apk
 包管理器将nodejs
 和nodejs-npm
 安装到当前镜像之中。RUN
 指令会在FROM
 指定的alpine
 基础镜像之上,新建一个镜像层来存储这些安装内容。当前镜像的结构如图8.3所示。
COPY. / src
 指令将应用相关文件从构建上下文复制到了当前镜像中,并且新建一个镜像层来存储。COPY
 执行结束之后,当前镜像共包含3层
Dockerfile通过WORKDIR
 指令,为Dockerfile中尚未执行的指令设置工作目录。该目录与镜像相关,并且会作为元数据记录到镜像配置中,但不会创建新的镜像层。
然后,RUN npm install
 指令会根据package.json
 中的配置信息,使用npm
 来安装当前应用的相关依赖包。npm
 命令会在前文设置的工作目录中执行,并且在镜像中新建镜像层来保存相应的依赖文件。
因为当前应用需要通过TCP端口8080对外提供一个Web服务,所以在Dockerfile中通过EXPOSE 8080
 指令来完成相应端口的设置。这个配置信息会作为镜像的元数据被保存下来,并不会产生新的镜像层。
最终,通过ENTRYPOINT
 指令来指定当前镜像的入口程序。ENTRYPOINT指定的配置信息也是通过镜像元数据的形式保存下来,而不是新增镜像层。
docker image build -t web:latest . 命令最后的点(.)表示Docker在进行构建的时候,使用当前目录作为构建上下文。一定要在命令最后包含这个点。

5、Docker Hub就是这样的一个开放的公共镜像仓库服务,并且这也是docker image push命令默认的推送地址,为镜像打标签命令的格式是docker image tag <current-tag> <new-tag>

6、Dockerfile中的注释行,都是以#开头的。
除注释之外,每一行都是一条指令(Instruction)。指令的格式是指令参数如下。
INSTRUCTION argument
指令是不区分大小写的,但是通常都采用大写的方式。这样Dockerfile的可读性会高一些。
Docker image build
 命令会按行来解析Dockerfile中的指令并顺序执行。
部分指令会在镜像中创建新的镜像层,其他指令只会增加或修改镜像的元数据信息。
在上面的例子当中,新增镜像层的指令包括FROM、RUN以及COPY,而新增元数据的指令包括EXPOSE、WORKDIR、ENV以及ENTERPOINT 。关于如何区分命令是否会新建镜像层,一个基本的原则是,如果指令的作用是向镜像中增添新的文件或者程序,那么这条指令就会新建镜像层;如果只是告诉Docker如何完成构建或者如何运行应用程序,那么就只会增加镜像的元数据。

7、可以通过docker image history来查看在构建镜像的过程中都执行了哪些指令。

8、每一个RUN指令会新增一个镜像层。因此,通过使用&&连接多个命令以及使用反斜杠(\)换行的方法,将多个命令包含在一个RUN指令中,通常来说是一种值得提倡的方式。这并不难掌握,多加练习即可。

9、多阶段构建方式使用一个Dockerfile,其中包含多个FROM指令。每一个FROM 指令都是一个新的构建阶段(BuildStage),并且可以方便地复制之前阶段的构件。多阶段构建这种方式仅用到了一个Dockerfile,并且docker image build
 命令不需要增加额外参数。


10、docker image build
 命令会从顶层开始解析Dockerfile中的指令并逐行执行。而对每一条指令,Docker都会检查缓存中是否已经有与该指令对应的镜像层。如果有,即为缓存命中(Cache Hit),并且会使用这个镜像层;如果没有,则是缓存未命中(Cache Miss),Docker会基于该指令构建新的镜像层。缓存命中能够显著加快构建过程。
通过对docker image build命令加入--nocache=true参数可以强制忽略对缓存的使用。

11、执行docker image build命令时,可以通过增加--squash参数来创建一个合并的镜像。在使用docker image push
 命令发送镜像到Docker Hub时,合并的镜像需要发送全部字节,而不合并的镜像只需要发送不同的镜像层即可。

12、在构建Linux镜像时,若使用的是APT包管理器,则应该在执行apt-get install
 命令时增加no-install-recommends
 参数。这能够确保APT仅安装核心依赖(Depends
 中定义)包,而不是推荐和建议的包。这样能够显著减少不必要包的下载数量。


13、docker构建命令汇总:
docker image build
 命令会读取Dockerfile,并将应用程序容器化。使用-t
 参数为镜像打标签,使用-f
 参数指定Dockerfile的路径和名称,使用-f
 参数可以指定位于任意路径下的任意名称的Dockerfile。构建上下文是指应用文件存放的位置,可能是本地Docker主机上的一个目录或一个远程的Git库。
Dockerfile中的FROM指令用于指定要构建的镜像的基础镜像。它通常是Dockerfile中的第一条指令。
Dockerfile中的RUN指令用于在镜像中执行命令,这会创建新的镜像层。每个 RUN指令创建一个新的镜像层。
Dockerfile中的COPY指令用于将文件作为一个新的层添加到镜像中。通常使用 COPY指令将应用代码赋值到镜像中。
Dockerfile中的EXPOSE指令用于记录应用所使用的网络端口。
Dockerfile中的ENTRYPOINT指令用于指定镜像以容器方式启动后默认运行的程序。
其他的Dockerfile指令还有LABEL、ENV、ONBUILD、HEALTHCHECK、CMD等。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值