Docker Engine v18.09.1 新版本特性解读,全新功能先睹为快(二)

640?wx_fmt=jpeg

出品丨Docker公司(ID:docker-cn)

编译丨小东

每周一、三、五晚6点10分  与您不见不散!


说在前面


Docker Engine v18.09.1 提供了许多新功能、改进和 Bug 修复。接下来,让我们来继续看看在升级到 Docker 18.09.1 版本时值得注意的主要功能。点击下列标题,回顾前文:


&


BuildKit 0.3.3 脱离了实验模式

可以正式使用


BuildKit 是 Moby 下的一个新项目,用于使用容器进行构建和打包软件。它是一个工具包,用于将源代码转换为以一种高效、有表现力和可重复的方式构建工件。Docker 18.09.0 是第一个支持 buildkit 工具包的版本。使用这个最新版本,您现在可以在不启用实验模式的情况下运行 Buildkit 工具包。现在也可以在 daemon.json 中使用选项来配置 Buildkit 工具包。


“docker build”是一个 Docker 的集成工具,用于使用 Dockerfile 文件构建镜像。它需要 Docker 守护进程持续运行。它类似于“docker run”命令,但出于安全原因故意删除了一些功能,例如,没有卷功能(docker run –v 和 docker run -mount)和没有特权模式(docker run -privileged)。Buildkit 旨在成为“docker build”命令和github.com/docker/docker/builder包的下一代后端实现。这并不意味着会对 Dockerfile 文件格式做出任何更改,因为 buildkit 在构建后端和前端之间绘制了边界。Dockerfile 文件将是前端实现之一。当使用 Docker CLI 调用 buildkit 时,它能够将客户端上下文目录作为源进行公开,并将 Docker 容器作为工作节点使用。快照将由 Docker 的层存储(containerD快照驱动程序)支持,构建的最终结果将导出到 docker 镜像。

640?wx_fmt=png


BuildKit 为我们解决了哪些问题?


如果您正在查看 Dockerfile,我们将逐个读取 Dockerfile 文件中从头至尾的的所有命令。修改其中一行总是会使后续行的缓存无效。例如:假设第N行始终依赖于第(N-1)行:

FROM debian

EXPOSE 80

RUN apt update && apt install git


如上所示,修改第二行(EXPOSE 80)始终会为因为错误的依赖关系而使 apt 缓存失效。用户需要为有效的缓存仔细安排指令,这就带来了低效缓存问题。


不仅如此,私有资产不可访问也是旧版 Dockerfile 文件的另一个主要问题。没有安全的途径从构建容器访问私有资产(例如,Git Repos 和 S3)。因此,使用“COPY”手动复制证书可能会意外泄漏证书。Buildkit 通过使用称为 LLB 的 DAG-style 低级语言来解决上述问题。


BuildKit 改进的主要方面是性能、存储管理和可扩展性。从性能方面来看,一个重要的更新是全新的、完全并发的构建图解决程序。它可以在可能的情况下并行运行构建步骤,并优化对最终结果没有影响的命令。我们还优化了对本地源文件的访问。通过仅跟踪重复构建、调用之间对这些文件所做的更新,无需等待本地文件在工作开始之前被读取或上传。


让我们来比较 docker build 和 Buildkit,看看 Buildkit 如何以比传统方法更快的构建 Docker镜像。

$ git clone https://github.com/ajeetraina/hellowhale

Cloning into 'hellowhale'...

remote: Enumerating objects: 28, done.

remote: Total 28 (delta 0), reused 0 (delta 0), pack-reused 28

Unpacking objects: 100% (28/28), done.

~$ cd hellowhale/

~$ ls

Dockerfile  README.md  html  wrapper.sh

:~/hellowhale$ time docker build -t ajeetraina/hellowhale .

Sending build context to Docker daemon  153.1kB

Step 1/4 : FROM nginx:latest

latest: Pulling from library/nginx

6ae821421a7d: Pull complete

da4474e5966c: Pull complete

eb2aec2b9c9f: Pull complete

Digest: sha256:dd2d0ac3fff2f007d99e033b64854be0941e19a2ad51f174d9240dda20d9f534

Status: Downloaded newer image for nginx:latest

 ---> f09fe80eb0e7

Step 2/4 : COPY wrapper.sh /

 ---> 10d671c6cf08

Step 3/4 : COPY html /usr/share/nginx/html

 ---> 3e8a09f56168

Step 4/4 : CMD ["./wrapper.sh"]

 ---> Running in b1f24992f9e5

Removing intermediate container b1f24992f9e5

 ---> 9dae85ca0867

Successfully built 9dae85ca0867

Successfully tagged ajeetraina/hellowhale:latest

real    0m6.359s

user    0m0.035s

sys     0m0.022s


让我们用 buildkit 来构建它:

 time docker build -t ajeetraina/hellowhale .

[+] Building 1.7s (9/9) FINISHED                                                                                                                                                

 => [internal] load build definition from Dockerfile                                                                                                                        0.1s

 => => transferring dockerfile: 135B                                                                                                                                        0.0s

 => [internal] load .dockerignore                                                                                                                                           0.0s

 => => transferring context: 2B                                                                                                                                             0.0s

 => [internal] load metadata for docker.io/library/nginx:latest                                                                                                             0.0s

 => [internal] helper image for file operations                                                                                                                             0.4s

 => => resolve docker.io/docker/dockerfile-copy:v0.1.9@sha256:e8f159d3f00786604b93c675ee2783f8dc194bb565e61ca5788f6a6e9d304061                                              0.7s

 => => sha256:e8f159d3f00786604b93c675ee2783f8dc194bb565e61ca5788f6a6e9d304061 2.03kB / 2.03kB                                                                              0.0s

 => => sha256:a546a4352bcaa6512f885d24fef3d9819e70551b98535ed1995e4b567ac6d05b 736B / 736B                                                                                  0.0s

 => => sha256:494e63343c3f0d392e7af8d718979262baec9496a23e97ad110d62b9c90d6182 766B / 766B                                                                                  0.0s

 => => sha256:df3b4bed1f63b36992540a09e0d10bd3f9d0b082d50810313841d745d7cce368 898.21kB / 898.21kB                                                                          0.2s

 => => sha256:f7b6696c3fee7264ec4486cebe146a6a98aa8d1e46747843107ff473aada8d56 861.00kB / 861.00kB                                                                          0.2s

 => => extracting sha256:df3b4bed1f63b36992540a09e0d10bd3f9d0b082d50810313841d745d7cce368                                                                                   0.1s

 => => extracting sha256:f7b6696c3fee7264ec4486cebe146a6a98aa8d1e46747843107ff473aada8d56                                                                                   0.1s

 => [1/3] FROM docker.io/library/nginx:latest                                                                                                                               0.0s

 => => resolve docker.io/library/nginx:latest                                                                                                                               0.0s

 => [internal] load build context                                                                                                                                           0.0s

 => => transferring context: 34.39kB                                                                                                                                        0.0s

 => [2/3] COPY wrapper.sh /                                                                                                                                                 0.2s

 => [3/3] COPY html /usr/share/nginx/html                                                                                                                                   0.2s

 => exporting to image                                                                                                                                                      0.1s

 => => exporting layers                                                                                                                                                     0.0s

 => => writing image sha256:db60ac4c90d7412b8c9f9382711f0d97a9ad9d4a33c05200aa36dc4c935c8cb3                                                                                0.0s

 => => naming to docker.io/ajeetraina/hellowhale                                                                                                                            0.0s

real    0m1.732s

user    0m0.042s

sys     0m0.019s

~/hellowhale$


与传统 docker 构建方法所花费的 0m6.359秒 相比,Buildkit 只花费了 0m1.732秒。


我将在接下来的文章中详细讨论这些增强。

640?wx_fmt=png


支持在 Kubernetes 上使用 Compose


在 Kubernetes 上使用 Compose 意味着您可以将 Docker Compose 文件部署到 Kubernetes 集群上。Compose on Kubernetes可以安装在 Docker Desktop 和 Docker Enterprise 上。在 Docker Desktop 上,您需要在设置中激活 Kubernetes 才能在 Kubernetes 上使用 Compose。


点击下列文章标题,查看 Compose on Kubernetes 更多内容:


640?wx_fmt=png


使用“docker info”命令可以公开产品信息


在 Docker v18.09.1 下,现在可以验证它属于企业版还是社区版产品,如下图所示:


640?wx_fmt=png

640?wx_fmt=png


首次在 Windows 10 上实现进程隔离


在 Windows Server 上已经可以使用进程隔离容器,但现在它们第一次可以在普通的 Windows 10 笔记本上使用。Windows 10-1809 (“2018年10月更新”)+ Docker 引擎18.09.1 +来自 Dockerhub 的 Windows 1809 基础镜像是第一个允许您在 Windows 10 上运行“真正的”Windows 容器的组合,无需 Hyper-v  虚拟化。


640?wx_fmt=png


需要安装 Docker Desktop Edge 2.0.1.0 或更高版本。请记住,Docker Engine 的版本应为18.09.1或更高版本。您必须从 Dockerhub 中选择与主机 Windows 版本的内核相匹配的 Windows 基础镜像。


让我们通过添加参数“--isolation = process”在进程隔离模式下运行测试容器:

docker run --isolation=process mcr.microsoft.com/windows/nanoserver:1809 cmd.exe /c ping 127.0.0.


如果您使用的是 Windows 10 Build 1706 版本并尝试运行以下命令,那么它将无法正常工作。需要至少 1809 版本才能顺利运行。


640?wx_fmt=png

640?wx_fmt=png


支持使用 SSH 进行远程连接


Docker Engine v18.09为 Docker 客户端提供了通过 SSH 与远程守护进程通信的可能性。Docker客户端通常通过 unix socket /var/run/docker.sock 在本地与守护进程通信,或通过tcp套接字通过网络进行通信。使用 Docker 18.09.1,您现在可以 SSH 到远程 Docker 主机并完美执行 docker CLI。


客户端和引擎之间的这种新连接方法允许简单的、共享的 SSH 配置,这种配置比以前的自定义 CA /证书解决方案通过 docker cli 更常见,更容易管理。通过设置“env var DOCKER_HOST = ssh:// hostname”可以轻松完成或直接在 docker 命令上使用 -H 参数,如:

docker -H ssh://hostname info

$ docker -H ssh://ajeetraina@10.94.26.28 run -ti ubuntu echo “hello”

Unable to find image 'ubuntu:latest' locally

latest: Pulling from library/ubuntu

6cf436f81810: Pull complete

987088a85b96: Pull complete

b4624b3efe06: Pull complete

d42beb8ded59: Pull complete

Digest: sha256:7a47ccc3bbe8a451b500d2b53104868b46d60ee8f5


请注意,您可能需要配置基于 SSH 密钥的登录并运行 SSH 代理,因此只需要输入一次密码。特别是在云平台上,需要 SSH 密码才能让这个命令工作,因为它不允许 SSH 直接从一个云实例到另一个云实例。


我将在未来介绍关于  SSH 进行远程连接的更多详情。

640?wx_fmt=png


结  语


希望这篇文章对您有用,如有任何疑问,可以随时给我们留言。


640?wx_fmt=png


点击下列标题,阅读更多干货



如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!

  640?wx_fmt=png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值