Docker 的核心思想就是将应用整合到容器中, 并且在容器中实际运行.

8.1 应用的容器化-简介

容器化过程:

  1. 编写应用代码
  2. 创建 Dockerfile
  3. 执行 docker image build
  4. 等待镜像生成

image.png

8.2 应用的容器化-详解

8.2.1 单体应用容器化

  1. 获取应用代码
  2. 分析Dockerfile

    • 包含应用文件的目录被称为构建上下文 (Build Context)

Dockerfile 的内容:

  1. FROM alpine
  2. LABEL maintainer="xxx"
  3. RUN apk add --update nodejs nodejs-npm
  4. COPY . /src
  5. WORKDIR /src
  6. RUN npm install
  7. EXPOSE 8080
  8. ENTRYPOINT ["node", "./app.js"]

不会创建镜像层的指令:

  • label
  • workdir
  • expose
  • entrypoint

构建后的镜像层:

image.png

  1. 容器化当前应用/构建具体的镜像
  1. $ docker image build -t web:latest .
  1. 推送镜像到仓库

登录:

  1. $ docker login

推送镜像需要如下信息:

  • Registry (镜像仓库服务), 默认为 Registry=docker.io
  • Repository (镜像仓库)
  • Tag (镜像标签), 默认为 Tag=latest

重打标签:

  • 并没有覆盖
  1. $ docker image tag web:latest nigelpoulton/web:latest

推送:

  1. $ docker image push nigelpoulton/web:latest

image.png

  1. 运行应用程序
  1. $ docker container run -d --name c1 -p 80:8080 web:latest
  1. app 测试
  2. 详述
    1. Dockerfile 中的注释使用 #
    2. 指令不区分大小写
    3. 解析是按照行的书写顺序

8.2.2 生产环境中的多阶段构建

  • 对于生产环境来说, 应该使镜像体积尽量小
  • 不同的 Dockerfile 写法会对镜像大小产生显著影响
  • 多在 RUN 指令一行中使用 && 连接多个命令和 \ 换行
  • RUN 指令在运行指定程序后, 会在镜像中残留构建文件
  • 建造者模式 (Builder Pattern) 需要至少两个 Dockerfile (开发, 生产)
    • Dockerfile.dev
    • Dockerfile.prod

多阶段构建:

  • 多阶段构建使用一个 Dockerfile
  • 包含多个 FROM 指令, 每一个都是构建阶段 (Build Stage)

注意:

  • FROM xxx:yyy AS zzz
  • COPY --from

image.png

查看多阶段构建方式生成的镜像:

  1. $ docker image ls

image.png

8.2.3 最佳实践

  1. 利用构建缓存, 将易于变化的指令放在最后
    1. docker image build --nocache=true 禁用缓存
  2. 合并镜像
    1. 利弊参半
    2. Docker 会将正常构建的各镜像层合并
    3. 基础镜像最好进行合并
    4. 无法共享镜像层, 镜像体积大
    5. docker image build --squash 合并镜像
    6. push 时, 合并的镜像需要发送全部内容

image.png

  1. 使用 no-install-recommends
  2. 不要安装 MSI 包 (Windows)

8.3 应用的容器化-命令

8.4 本章小结