SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
刘宇玲 / 2020.04
Docker 最佳实践
• 最佳实践的原则

• 使⽤用buildkit ⼯工具

• Docker 通⽤用的最佳实践

• Dockerfile / build image 的最佳实践

• NodeJS with Docker 的最佳实践
Agenda
最佳实践的原则
• 增加构建速度 

• 提⾼高性能

• 减少空间占⽤用

• 获取更更多信息
使⽤用buildkit ⼯工具
• Buildkit 介绍

• 开启 buildkit ⼯工具
使⽤用buildkit ⼯工具
• 18.09版本的Docker Build的增强功能

• 通过集成BuildKit,⽤用户应该会看到性能,存储管理理,新功能和安全性⽅方⾯面的改
进。

• buildkit 提供 —secret 命令⾏行行选项允许⽤用户传递秘密信息构建 image
buildKit 开启
使⽤用buildkit ⼯工具
• 单次构建开启,设置环境变量量 DOCKER_BUILDKIT=1

$ DOCKER_BUILDKIT=1 docker build .
• 设置 buildkit 功能默认开启, 设置 /etc/docker/daemon.json

{ "features": { "buildkit": true } }
buildKit 开启
使⽤用buildkit ⼯工具
buildKit 开启
New Docker Build secret information
使⽤用buildkit ⼯工具
• --secret 选项可以帮助 docker build 的时候传⼀一些敏敏感信息参数,⽽而不不需要最
终的image 包含这个敏敏感信息
• 例例⼦子:

# shows secret from default secret location:
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret
# shows secret from custom secret location:
RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar
$ docker build --no-cache --progress=plain --secret
id=mysecret,src=mysecret.txt .
• Dockerfile 配置

# syntax = docker/dockerfile:1.0-experimental
New Docker Build secret information
使⽤用buildkit ⼯工具
Docker 通⽤用的最佳实践
• 尽量量使 image ⼩小且更更加丰富

• 存储数据的最佳实践

• Use CI/CD for testing and deployment

• Docker 在 dev 和 pro 环境的不不同
Docker 通⽤用的最佳实践
• 选择⼀一个合适的基础镜像, 推荐使⽤用 slim

• Use multistage builds

• 使⽤用⽣生产环境的 image 作为基础镜像,并且具备 debug 的能⼒力力

• 在构建镜像时,总是使⽤用有意义的 tag 作为说明
尽量量使 image ⼩小且更更加丰富
Docker 通⽤用的最佳实践
• 避免使⽤用 storage drivers, 不不要将数据写在 container 的可写层

• 使⽤用 volumes

•  使⽤用 bind mounts 在 development, 当需要将源代码映射到 container 中

• 在production, 使⽤用 volume 代替将源代码映射到 container 中
存储数据的最佳实践
Docker 通⽤用的最佳实践
• 当提交 PR 时, ⾃自动触发 CI / CD ——> build and tag a Docker image and
test it.

• 最好在发布⽣生产环境前是可以分别在 dev, testing, security team 对 image 做签
名
Use CI/CD for testing and deployment
Docker 通⽤用的最佳实践
Differences in development and production environments
Development Production
使⽤用 bind mounts 当时将源代码
映射到 container 中
使⽤用 volumes 去管理理 container data.
使⽤用 Docker Desktop for Mac 或
者 Docker Desktop for Windows.
使⽤用 Docker Engine - 最好是企业版, with userns mapping for greater isolation of Docker processes from host
processes.
不不⽤用担⼼心时间问题
需要保证 contianer 内的时间统⼀一,始终在Docker主机和每个容器器进程中运⾏行行NTP客户端,并将它们全部同步到同
⼀一NTP服务器器。如果使⽤用群集服务,还请确保每个Docker节点将其时钟同步到与容器器相同的时间源。
Dockerfile / build image 的最佳实践
• 创造短暂的 container

• 减少 build context

• 配置 .dockerignore

• 使⽤用 multi-stage builds

• 不不要安装没有必要的依赖

• 解耦 applications, 不不要再⼀一个容器器中起多个 applications

• 减少 layers 的数量量

• 整合参数输⼊入为多⾏行行

• 提⾼高 build 的缓存命中率
Dockerfile / build image 的最佳实践
• 什什么是短暂的 container —— 其功能不不依赖于他的⽣生命周期,短暂的container
同时意味着有明确的指责,不不依赖数据,从环境中解耦。

• 停⽌止并破坏容器器,然后并使⽤用绝对的最⼩小/ 少的设置和配置对其进⾏行行重建和替
换。
创造短暂的 container
Dockerfile / build image 的最佳实践
• 什什么是 build context

• 在 Dockerfile 不不需要将⽂文件复制到 Image 中的情况下,省略略构建上下⽂文会很有⽤用,并且由于没有⽂文件发送
到守护程序,因此可以提⾼高构建速度。

• Pipe Dockerfile 通过 stdin

• 使⽤用 STDIN ⽅方式构建 image,不不需要传输 build context

• 使⽤用 STDIN ⽅方式构建 image,同时需要传输 build context

• 使⽤用 STDIN ⽅方式构建 image,同时需要传输远端 build context
减少 build context
Dockerfile / build image 的最佳实践
• Docker 17.05 +

• 需求:Dev 环境需要所有的⼯工具或者依赖,但是 prod 环境⼀一般只需要要精简的
image

• 不不⽤用 multi-stage ⽅方式需要维护⾄至少两个的 dockerfile

• 优点:只需要 维护⼀一个 Dockerfile, 代码清晰,易易于维护
Use multi-stage builds
Dockerfile / build image 的最佳实践
• Container 也需要尊从单⼀一职责

• 最好限制 Container 内部只有⼀一个进程,不不要在 contianer 内部再使⽤用多进程

• Continer 之间存在依赖关系,使他们通过 Docker container networks 建⽴立联系
Decouple applications
Dockerfile / build image 的最佳实践
• 只有 RUN, COPY,ADD create layers. 

• 其他的语法只会创建⼀一个临时的过度images, 且这些语法不不会增加 build 的⼤大⼩小

• 尽可能的使⽤用 multi-stage builds,

• 只拷⻉贝最终的 image 所需要的依赖.
Minimize the number of layers
Dockerfile / build image 的最佳实践
• 尽可能的将参数使⽤用  多⾏行行分割,这样使代码清晰,易易于 review PR, 也可以
避免重复

Sort multi-line arguments
RUN apt-get update && apt-get install -y 
bzr 
cvs 
git 
mercurial 
subversion
Dockerfile / build image 的最佳实践
• 从已在缓存中的⽗父image开始,将下⼀一条指令与从该基本映像派⽣生的所有⼦子映像进⾏行行⽐比较,
以查看是否其中⼀一个是使⽤用完全相同的指令构建的。如果不不是,则缓存⽆无效。

• ADD 和 COPY 会对⽐比⽂文件内容是否被修改.

• 除了了ADD和COPY命令以外,缓存检查不不会查看容器器中的⽂文件来确定缓存是否匹配。例例
如,在处理理RUN apt-get -y update命令时,不不会检查容器器中更更新的⽂文件,以确定是否存在
缓存命中。在这种情况下,仅使⽤用命令字符串串本身来查找匹配项

Leverage build cache / 缓存机制
Dockerfile instructions 的最佳实践
• 排序指令: (变动频率由低到⾼高排序,提⾼高缓存的命中率)

• FROM : 推荐使⽤用 Alpine image

• LABEL : 使⽤用 label 标记更更多的信息

• RUN

• ADD or COPY

• ENTRYPOINT

• ONBULID
Dockerfile instructions 的最佳实践
• 尽可能的将参数使⽤用  多⾏行行分割

• APT-GET

• 避免使⽤用 apt-get upgrade 和 dist-upgrade 命令升级⽗父镜像中的软件

• 使⽤用 apt-get install -y ${软件名称} 安装/更更新

• 通常 apt-get update 与 apt-get install 共同使⽤用

• 好的实践是必要时指定版本

• 使⽤用管道

RUN
RUN apt-get update && apt-get install -y 
package-bar 
package-baz 
package-foo
单独⼀一⾏行行会出现缓存问题,
可能安装依赖失败
RUN apt-get update && apt-get install -y 
aufs-tools 
automake 
build-essential 
curl 
dpkg-sig 
libcap-dev 
libsqlite3-dev 
mercurial 
reprepro 
ruby1.9.1 
ruby1.9.1-dev 
s3cmd=1.1.* 
&& rm -rf /var/lib/apt/lists/*
Dockerfile instructions 的最佳实践
• 优先使⽤用 COPY

• ADD 有更更多的功能 (可以解压⽂文件/ 远端⽂文件 到 image 中)

• 请单独复制⽂文件,提⾼高缓存使⽤用

• ⼀一般将 COPY 放在 RUN 后

• ⽤用 RUN curl 代替 ADD 从远端获取⼤大⽂文件

ADD or COPY
Dockerfile instructions 的最佳实践
• ENTRYPOINT 指定的命令再 run container 时⼀一定会被执⾏行行的

• CMD 是在 run container 是可以被覆盖的

• ENTRYPOINT + 脚本 可以更更加⽅方便便的配置 container 的启动

ENTRYPOINT
Dockerfile instructions 的最佳实践
• ⽤用于⼦子 image, 在⼦子 image build 前执⾏行行

• 避免在 ONBUILD 中使⽤用 ADD COPY 

ONBUILD
Node.js 在 Docker 中的好的实践
• 基础镜像问题 使⽤用 slim

• 使⽤用 node user, 最⼩小权限原则

• node_moudle

• 不不要在 container 中使⽤用 process manager(Like pm2)

• Start Node Directly in Dockerfiles
谢谢

Mais conteúdo relacionado

Mais procurados

Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲ChinaNetCloud
 
Rancher: 建立你的牧場艦隊
Rancher: 建立你的牧場艦隊Rancher: 建立你的牧場艦隊
Rancher: 建立你的牧場艦隊Miles Chou
 
容器式基礎架構介紹
容器式基礎架構介紹容器式基礎架構介紹
容器式基礎架構介紹Philip Zheng
 
Docker open stack
Docker open stackDocker open stack
Docker open stackGuangya Liu
 
Docker 淺入淺出
Docker 淺入淺出Docker 淺入淺出
Docker 淺入淺出Miles Chou
 
Docker集群管理 工具篇
Docker集群管理 工具篇Docker集群管理 工具篇
Docker集群管理 工具篇Guangya Liu
 
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018Will Huang
 
Docker - 30秒生出100台伺服器
Docker - 30秒生出100台伺服器Docker - 30秒生出100台伺服器
Docker - 30秒生出100台伺服器升煌 黃
 
企業導入容器經驗分享與開源技能培養
企業導入容器經驗分享與開源技能培養企業導入容器經驗分享與開源技能培養
企業導入容器經驗分享與開源技能培養Philip Zheng
 
Docker容器微服務 x WorkShop
Docker容器微服務 x WorkShopDocker容器微服務 x WorkShop
Docker容器微服務 x WorkShopPhilip Zheng
 
docker intro
docker introdocker intro
docker introkoji lin
 
Docker Compose
Docker ComposeDocker Compose
Docker ComposeMiles Chou
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管Will Huang
 
AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)Will Huang
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架Will Huang
 

Mais procurados (20)

Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
Dev-Ops与Docker的最佳实践 QCon2016 北京站演讲
 
Rancher: 建立你的牧場艦隊
Rancher: 建立你的牧場艦隊Rancher: 建立你的牧場艦隊
Rancher: 建立你的牧場艦隊
 
Docker Build
Docker BuildDocker Build
Docker Build
 
容器式基礎架構介紹
容器式基礎架構介紹容器式基礎架構介紹
容器式基礎架構介紹
 
微服務自己動手做
微服務自己動手做微服務自己動手做
微服務自己動手做
 
Docker open stack
Docker open stackDocker open stack
Docker open stack
 
Docker 淺入淺出
Docker 淺入淺出Docker 淺入淺出
Docker 淺入淺出
 
Docker應用
Docker應用Docker應用
Docker應用
 
Docker集群管理 工具篇
Docker集群管理 工具篇Docker集群管理 工具篇
Docker集群管理 工具篇
 
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
 
Docker - 30秒生出100台伺服器
Docker - 30秒生出100台伺服器Docker - 30秒生出100台伺服器
Docker - 30秒生出100台伺服器
 
企業導入容器經驗分享與開源技能培養
企業導入容器經驗分享與開源技能培養企業導入容器經驗分享與開源技能培養
企業導入容器經驗分享與開源技能培養
 
Docker容器微服務 x WorkShop
Docker容器微服務 x WorkShopDocker容器微服務 x WorkShop
Docker容器微服務 x WorkShop
 
docker intro
docker introdocker intro
docker intro
 
Docker Compose
Docker ComposeDocker Compose
Docker Compose
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管
 
AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架
 

Semelhante a Docker 最佳实践

[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛Edward Kuo
 
美团点评技术沙龙14美团云-Docker平台
美团点评技术沙龙14美团云-Docker平台美团点评技术沙龙14美团云-Docker平台
美团点评技术沙龙14美团云-Docker平台美团点评技术团队
 
桃園市教育局Docker技術入門與實作
桃園市教育局Docker技術入門與實作桃園市教育局Docker技術入門與實作
桃園市教育局Docker技術入門與實作Philip Zheng
 
Docker一期培训
Docker一期培训Docker一期培训
Docker一期培训青帅 常
 
Docker
DockerDocker
DockerNCUDSC
 
DAE 新变化介绍
DAE 新变化介绍DAE 新变化介绍
DAE 新变化介绍Tianwei Liu
 
20220224台中演講k8s
20220224台中演講k8s20220224台中演講k8s
20220224台中演講k8schabateryuhlin
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Li Yi
 
20150604 docker 新手入門
20150604 docker 新手入門20150604 docker 新手入門
20150604 docker 新手入門azole Lai
 
Azure Container Service 使用 DC / OS 管理 docker 容器
Azure Container Service 使用 DC / OS 管理 docker 容器Azure Container Service 使用 DC / OS 管理 docker 容器
Azure Container Service 使用 DC / OS 管理 docker 容器Ch Rick
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011Ching Yi Chan
 
Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer TalkLarry Cai
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Jeff Chu
 
Cloudstack dev/user sharing
Cloudstack dev/user sharingCloudstack dev/user sharing
Cloudstack dev/user sharinggavin_lee
 
3 introduction to kubernetes
3 introduction to kubernetes3 introduction to kubernetes
3 introduction to kubernetesJiang Shang
 
99cloud openstack ci
99cloud openstack ci99cloud openstack ci
99cloud openstack ciLiang Bo
 
.NET Conf Taiwan 2022 - Tauri - 前端人員也能打造小巧快速的 Windows 應用程式
.NET Conf Taiwan 2022 - Tauri -前端人員也能打造小巧快速的 Windows 應用程式.NET Conf Taiwan 2022 - Tauri -前端人員也能打造小巧快速的 Windows 應用程式
.NET Conf Taiwan 2022 - Tauri - 前端人員也能打造小巧快速的 Windows 應用程式升煌 黃
 

Semelhante a Docker 最佳实践 (20)

[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
 
美团点评技术沙龙14美团云-Docker平台
美团点评技术沙龙14美团云-Docker平台美团点评技术沙龙14美团云-Docker平台
美团点评技术沙龙14美团云-Docker平台
 
桃園市教育局Docker技術入門與實作
桃園市教育局Docker技術入門與實作桃園市教育局Docker技術入門與實作
桃園市教育局Docker技術入門與實作
 
Docker一期培训
Docker一期培训Docker一期培训
Docker一期培训
 
Docker
DockerDocker
Docker
 
DAE 新变化介绍
DAE 新变化介绍DAE 新变化介绍
DAE 新变化介绍
 
20220224台中演講k8s
20220224台中演講k8s20220224台中演講k8s
20220224台中演講k8s
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践
 
20150604 docker 新手入門
20150604 docker 新手入門20150604 docker 新手入門
20150604 docker 新手入門
 
Azure Container Service 使用 DC / OS 管理 docker 容器
Azure Container Service 使用 DC / OS 管理 docker 容器Azure Container Service 使用 DC / OS 管理 docker 容器
Azure Container Service 使用 DC / OS 管理 docker 容器
 
Java Build Tool course in 2011
Java Build Tool course in 2011Java Build Tool course in 2011
Java Build Tool course in 2011
 
Docker實務
Docker實務Docker實務
Docker實務
 
Software Engineer Talk
Software Engineer TalkSoftware Engineer Talk
Software Engineer Talk
 
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
 
Cloudstack dev/user sharing
Cloudstack dev/user sharingCloudstack dev/user sharing
Cloudstack dev/user sharing
 
3 introduction to kubernetes
3 introduction to kubernetes3 introduction to kubernetes
3 introduction to kubernetes
 
99cloud openstack ci
99cloud openstack ci99cloud openstack ci
99cloud openstack ci
 
.NET Conf Taiwan 2022 - Tauri - 前端人員也能打造小巧快速的 Windows 應用程式
.NET Conf Taiwan 2022 - Tauri -前端人員也能打造小巧快速的 Windows 應用程式.NET Conf Taiwan 2022 - Tauri -前端人員也能打造小巧快速的 Windows 應用程式
.NET Conf Taiwan 2022 - Tauri - 前端人員也能打造小巧快速的 Windows 應用程式
 

Docker 最佳实践

  • 2. • 最佳实践的原则 • 使⽤用buildkit ⼯工具 • Docker 通⽤用的最佳实践 • Dockerfile / build image 的最佳实践 • NodeJS with Docker 的最佳实践 Agenda
  • 3. 最佳实践的原则 • 增加构建速度 • 提⾼高性能 • 减少空间占⽤用 • 获取更更多信息
  • 4. 使⽤用buildkit ⼯工具 • Buildkit 介绍 • 开启 buildkit ⼯工具
  • 5. 使⽤用buildkit ⼯工具 • 18.09版本的Docker Build的增强功能 • 通过集成BuildKit,⽤用户应该会看到性能,存储管理理,新功能和安全性⽅方⾯面的改 进。 • buildkit 提供 —secret 命令⾏行行选项允许⽤用户传递秘密信息构建 image buildKit 开启
  • 6. 使⽤用buildkit ⼯工具 • 单次构建开启,设置环境变量量 DOCKER_BUILDKIT=1 $ DOCKER_BUILDKIT=1 docker build . • 设置 buildkit 功能默认开启, 设置 /etc/docker/daemon.json { "features": { "buildkit": true } } buildKit 开启
  • 8. New Docker Build secret information 使⽤用buildkit ⼯工具 • --secret 选项可以帮助 docker build 的时候传⼀一些敏敏感信息参数,⽽而不不需要最 终的image 包含这个敏敏感信息
  • 9. • 例例⼦子: # shows secret from default secret location: RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret # shows secret from custom secret location: RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar $ docker build --no-cache --progress=plain --secret id=mysecret,src=mysecret.txt . • Dockerfile 配置 # syntax = docker/dockerfile:1.0-experimental New Docker Build secret information 使⽤用buildkit ⼯工具
  • 10. Docker 通⽤用的最佳实践 • 尽量量使 image ⼩小且更更加丰富 • 存储数据的最佳实践 • Use CI/CD for testing and deployment • Docker 在 dev 和 pro 环境的不不同
  • 11. Docker 通⽤用的最佳实践 • 选择⼀一个合适的基础镜像, 推荐使⽤用 slim • Use multistage builds • 使⽤用⽣生产环境的 image 作为基础镜像,并且具备 debug 的能⼒力力 • 在构建镜像时,总是使⽤用有意义的 tag 作为说明 尽量量使 image ⼩小且更更加丰富
  • 12. Docker 通⽤用的最佳实践 • 避免使⽤用 storage drivers, 不不要将数据写在 container 的可写层 • 使⽤用 volumes •  使⽤用 bind mounts 在 development, 当需要将源代码映射到 container 中 • 在production, 使⽤用 volume 代替将源代码映射到 container 中 存储数据的最佳实践
  • 13. Docker 通⽤用的最佳实践 • 当提交 PR 时, ⾃自动触发 CI / CD ——> build and tag a Docker image and test it. • 最好在发布⽣生产环境前是可以分别在 dev, testing, security team 对 image 做签 名 Use CI/CD for testing and deployment
  • 14. Docker 通⽤用的最佳实践 Differences in development and production environments Development Production 使⽤用 bind mounts 当时将源代码 映射到 container 中 使⽤用 volumes 去管理理 container data. 使⽤用 Docker Desktop for Mac 或 者 Docker Desktop for Windows. 使⽤用 Docker Engine - 最好是企业版, with userns mapping for greater isolation of Docker processes from host processes. 不不⽤用担⼼心时间问题 需要保证 contianer 内的时间统⼀一,始终在Docker主机和每个容器器进程中运⾏行行NTP客户端,并将它们全部同步到同 ⼀一NTP服务器器。如果使⽤用群集服务,还请确保每个Docker节点将其时钟同步到与容器器相同的时间源。
  • 15. Dockerfile / build image 的最佳实践 • 创造短暂的 container • 减少 build context • 配置 .dockerignore • 使⽤用 multi-stage builds • 不不要安装没有必要的依赖 • 解耦 applications, 不不要再⼀一个容器器中起多个 applications • 减少 layers 的数量量 • 整合参数输⼊入为多⾏行行 • 提⾼高 build 的缓存命中率
  • 16. Dockerfile / build image 的最佳实践 • 什什么是短暂的 container —— 其功能不不依赖于他的⽣生命周期,短暂的container 同时意味着有明确的指责,不不依赖数据,从环境中解耦。 • 停⽌止并破坏容器器,然后并使⽤用绝对的最⼩小/ 少的设置和配置对其进⾏行行重建和替 换。 创造短暂的 container
  • 17. Dockerfile / build image 的最佳实践 • 什什么是 build context • 在 Dockerfile 不不需要将⽂文件复制到 Image 中的情况下,省略略构建上下⽂文会很有⽤用,并且由于没有⽂文件发送 到守护程序,因此可以提⾼高构建速度。 • Pipe Dockerfile 通过 stdin • 使⽤用 STDIN ⽅方式构建 image,不不需要传输 build context • 使⽤用 STDIN ⽅方式构建 image,同时需要传输 build context • 使⽤用 STDIN ⽅方式构建 image,同时需要传输远端 build context 减少 build context
  • 18. Dockerfile / build image 的最佳实践 • Docker 17.05 + • 需求:Dev 环境需要所有的⼯工具或者依赖,但是 prod 环境⼀一般只需要要精简的 image • 不不⽤用 multi-stage ⽅方式需要维护⾄至少两个的 dockerfile • 优点:只需要 维护⼀一个 Dockerfile, 代码清晰,易易于维护 Use multi-stage builds
  • 19. Dockerfile / build image 的最佳实践 • Container 也需要尊从单⼀一职责 • 最好限制 Container 内部只有⼀一个进程,不不要在 contianer 内部再使⽤用多进程 • Continer 之间存在依赖关系,使他们通过 Docker container networks 建⽴立联系 Decouple applications
  • 20. Dockerfile / build image 的最佳实践 • 只有 RUN, COPY,ADD create layers. • 其他的语法只会创建⼀一个临时的过度images, 且这些语法不不会增加 build 的⼤大⼩小 • 尽可能的使⽤用 multi-stage builds, • 只拷⻉贝最终的 image 所需要的依赖. Minimize the number of layers
  • 21. Dockerfile / build image 的最佳实践 • 尽可能的将参数使⽤用 多⾏行行分割,这样使代码清晰,易易于 review PR, 也可以 避免重复 Sort multi-line arguments RUN apt-get update && apt-get install -y bzr cvs git mercurial subversion
  • 22. Dockerfile / build image 的最佳实践 • 从已在缓存中的⽗父image开始,将下⼀一条指令与从该基本映像派⽣生的所有⼦子映像进⾏行行⽐比较, 以查看是否其中⼀一个是使⽤用完全相同的指令构建的。如果不不是,则缓存⽆无效。 • ADD 和 COPY 会对⽐比⽂文件内容是否被修改. • 除了了ADD和COPY命令以外,缓存检查不不会查看容器器中的⽂文件来确定缓存是否匹配。例例 如,在处理理RUN apt-get -y update命令时,不不会检查容器器中更更新的⽂文件,以确定是否存在 缓存命中。在这种情况下,仅使⽤用命令字符串串本身来查找匹配项 Leverage build cache / 缓存机制
  • 23. Dockerfile instructions 的最佳实践 • 排序指令: (变动频率由低到⾼高排序,提⾼高缓存的命中率) • FROM : 推荐使⽤用 Alpine image • LABEL : 使⽤用 label 标记更更多的信息 • RUN • ADD or COPY • ENTRYPOINT • ONBULID
  • 24. Dockerfile instructions 的最佳实践 • 尽可能的将参数使⽤用 多⾏行行分割 • APT-GET • 避免使⽤用 apt-get upgrade 和 dist-upgrade 命令升级⽗父镜像中的软件 • 使⽤用 apt-get install -y ${软件名称} 安装/更更新 • 通常 apt-get update 与 apt-get install 共同使⽤用 • 好的实践是必要时指定版本 • 使⽤用管道 RUN RUN apt-get update && apt-get install -y package-bar package-baz package-foo 单独⼀一⾏行行会出现缓存问题, 可能安装依赖失败 RUN apt-get update && apt-get install -y aufs-tools automake build-essential curl dpkg-sig libcap-dev libsqlite3-dev mercurial reprepro ruby1.9.1 ruby1.9.1-dev s3cmd=1.1.* && rm -rf /var/lib/apt/lists/*
  • 25. Dockerfile instructions 的最佳实践 • 优先使⽤用 COPY • ADD 有更更多的功能 (可以解压⽂文件/ 远端⽂文件 到 image 中) • 请单独复制⽂文件,提⾼高缓存使⽤用 • ⼀一般将 COPY 放在 RUN 后 • ⽤用 RUN curl 代替 ADD 从远端获取⼤大⽂文件 ADD or COPY
  • 26. Dockerfile instructions 的最佳实践 • ENTRYPOINT 指定的命令再 run container 时⼀一定会被执⾏行行的 • CMD 是在 run container 是可以被覆盖的 • ENTRYPOINT + 脚本 可以更更加⽅方便便的配置 container 的启动 ENTRYPOINT
  • 27. Dockerfile instructions 的最佳实践 • ⽤用于⼦子 image, 在⼦子 image build 前执⾏行行 • 避免在 ONBUILD 中使⽤用 ADD COPY ONBUILD
  • 28. Node.js 在 Docker 中的好的实践 • 基础镜像问题 使⽤用 slim • 使⽤用 node user, 最⼩小权限原则 • node_moudle • 不不要在 container 中使⽤用 process manager(Like pm2) • Start Node Directly in Dockerfiles