您现在的位置是:首页 > 文章详情

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

日期:2019-02-28点击:411

screenshot

出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五,与您不见不散!


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 镜像。


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秒。

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


支持在 Kubernetes 上使用 Compose

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

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


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

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

screenshot


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

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

screenshot

需要安装 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 版本才能顺利运行。

screenshot


支持使用 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 进行远程连接的更多详情。


结 语

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

原文链接:https://yq.aliyun.com/articles/691836
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章