出品丨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 更多内容:
- Kubernetes 实战教学,手把手教您如何在 K8s 平台上使用 Compose(一);
- Kubernetes 实战教学,手把手教您如何在 K8s 平台上使用 Compose(二);
- Kubernetes 实战教学,手把手教您用2个脚本在 PWK 上启用 Compose;
使用“docker info”命令可以公开产品信息
在 Docker v18.09.1 下,现在可以验证它属于企业版还是社区版产品,如下图所示:
首次在 Windows 10 上实现进程隔离
在 Windows Server 上已经可以使用进程隔离容器,但现在它们第一次可以在普通的 Windows 10 笔记本上使用。Windows 10-1809 (“2018年10月更新”)+ Docker 引擎18.09.1 +来自 Dockerhub 的 Windows 1809 基础镜像是第一个允许您在 Windows 10 上运行“真正的”Windows 容器的组合,无需 Hyper-v 虚拟化。
需要安装 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 版本才能顺利运行。
支持使用 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 进行远程连接的更多详情。
结 语
希望这篇文章对您有用,如有任何疑问,可以随时给我们留言。