今天我们发布了Docker CE 17.06,它包含了诸多新特性、优化和bug修复。我们在四月份的DockeCon上公布了Moby项目,Docker CE 17.06是第一个完全构建在它基础上的Docker版本。变更日志中能看到完整的更新列表,我们来看看它的一些新特性。
我们也为这篇文章制作了一个视频版本。
多阶段构建
17.06 CE最大的特性是它的多阶段构建(multi-stage builds),它最初在四月的DockerCon被公布,现在已经达到了稳定版本。多阶段构建能从一个Dockerfile中构建出更加简洁、体积更小的Docker镜像。
多阶段构建通过构建过渡镜像并产生输出。这样就能在一个过渡镜像中编译代码,在最终的镜像中只使用它的输出。例如,Java开发者通常使用Apache Maven来构建应用,但是运行应用却不需要Maven。多阶段构建能大幅度的减小镜像的体积:
REPOSITORY TAG IMAGE ID CREATED SIZE maven latest 66091267e43d 2 weeks ago 620MB java 8-jdk-alpine 3fd9dd82815c 3 months ago
来看一个能创建店铺首页的AtSea示例应用:
AtSea使用了多阶段构建,并包含两个过渡阶段:用一个node.js基础镜像构建ReactJS应用,用一个Maven基础镜像将Sprint Boot应用编译成单个镜像。
FROM node:latest AS storefront WORKDIR /usr/src/atsea/app/react-app COPY react-app/package.json . RUN npm install COPY . /usr/src/atsea/app RUN npm run build FROM maven:latest AS appserver WORKDIR /usr/src/atsea COPY pom.xml . RUN mvn -B -f pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve COPY . . RUN mvn -B -s /usr/share/maven/ref/settings-docker.xml package -DskipTests FROM java:8-jdk-alpine WORKDIR /static COPY --from=storefront /usr/src/atsea/app/react-app/build/ . WORKDIR /app COPY --from=appserver /usr/src/atsea/target/AtSea-0.0.1-SNAPSHOT.jar . ENTRYPOINT ["java", "-jar", "/app/AtSea-0.0.1-SNAPSHOT.jar"] CMD ["--spring.profiles.active=postgres"]
最终的镜像大小只有209M,其中不包含Maven或node.js。
还有其他的一些构建器方面的优化,包括在FROM指令中使用构建时参数。
日志和指标
指标
目前通过一个daemon的API端点提供日志的支持。可以将docker的/metrics端点暴露给插件:
$ docker plugin install --grant-all-permissions cpuguy83/docker-metrics-plugin-test:latest $ curl http://127.0.0.1:19393/metrics
这个插件仅用于示范。它在主机的网络上运行了一个反向代理,能将请求转发给插件中的本地的指标套接字。在真实场景中,可能会将收集的指标数据发送给外部的服务,或者使它可以被一个服务如Prometheus访问并收集。
注意尽管指标插件在非实验性的daemon中可以使用,指标标签(metrics label)仍应该被看作是实验性的,可能在Docker未来的版本中发生改动。
日志驱动插件
添加了对日志驱动器插件的支持。
Service日志
docker service logs从实验版本改进到了稳定版,你可以轻松地获取Swarm上运行的一个服务的完整日志。同时也添加了服务中单个任务日志的端点。
网络
Service中节点本地的网络支持
Docker支持很多的网络选择。在Docker 17.06 CE中,可以将服务追加到节点本地的网络(node-local networks)。这包括如Host、Macvlan,IPVlan,Bridge和本地作用域的插件。例如对于一个Macvlan网络,可以在worker节点上创建一个节点特定的网络配置,然后在manager节点上创建一个加入了这些配置的网络:
[Wrk-node1]$ docker network create —config-only —subnet=10.1.0.0/16 local-config [Wrk-node2]$ docker network create —config-only —subnet=10.2.0.0/16 local-config [Mgr-node2]$ docker network create —scope=swarm —config-from=local-config -d macvlan mynet [Mgr-node2]$ docker service create —network=mynet my_new_service
Swarm Mode
Swarm mode添加了很多的新特性,这里是一部分:
配置对象
swarm mode的一个新的配置对象,允许安全地像传递密码一样传递配置信息:
$ echo "This is a config" | docker config create test_config - $ docker service create --name=my-srv —config=test_config … $ docker exec -it 37d7cfdff6d5 cat test_config This is a config
证书轮换的优化
Swarm mode中内置的公钥基础设施(PKI)系统使得可以安全地部署一个容器调度系统。Swarmz中的节点使用双边TLS来认证、授权和加密他们之间,以及和Swarm其他节点的通讯。因为这些都依赖于证书,所以经常轮换很重要。自从Swarm mode伴随Docker 1.12发布以来,已经能以一小时一次的频次来安排证书轮换。有了Docker CE 17.06,添加了立即强制证书轮换的一次性操作:
docker swarm ca --rotate
Swarm Mode事件
docker events可以用来从Docker中获取实时的信息。在编写自动化和监控应用时很有用。但是直到Dcoker CE 17.06,都不支持swarm mode的事件。现在docker events将会返回服务、节点、网络和和secret的信息。
专用的数据路线
docker init中添加了新的--datapath-addr标签,可以把swarm mode的管理任务和应用传递的数据隔离开来。这能把集群从IO贪婪的应用中拯救出来。如你用这种方式初始化集群:
docker swarm init —advertise-addr=eth0 —datapath-addr=eth1
集群管理的流量(Raft、grpc和gossip)将会通过eth0,而服务将会彼此通过eth1来通讯。
桌面版本
Docker for Mac和Docker for Windows添加了三个新特性:
GUI中新增了重置Docker数据而不需要丢失所有的设置
现在重置数据不会丢失设置。
为主机添加一个实验性的DNS
如果在Docker for Mac或者Docker for Windows上运行容器,并且想访问其他的容器,你可以使用一个新的实验性主机:docker.for.mac.localhost和docker.for.win.lcoalhost来访问开放的端口。例如:
$ docker run -d -it -p 80:80 nginx 9a41b199e86cc4730f470aba1091530cfdc26d6f956964492b0d0b06a0ab9046 $ docker run -it curlubuntu root@85664afff468:/# curl docker.for.mac.localhost:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a rel="external nofollow" target="_blank" href="http://nginx.org/" >nginx.org</a>.<br/> Commercial support is available at <a rel="external nofollow" target="_blank" href="http://nginx.com/" >nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> root@85664afff468:/#
用来认证注册表访问的登录证书
可以在Docker for Mac和Docker for Windows中添加证书来访问注册表,而不仅仅是使用用户名和密码。这能让访问Docker Trusted Registery和开源的注册表和其他任何的注册应用快速而简单。
云版本
Cloudstor卷插件可以在Docker for AWS和Docker for Azure中使用。在Docker for AWS中,对于持久化卷(对于全局的EFS和可添加的EBS)的支持现在是稳定的了)。并且我们能跨可用区支持EBS卷。
对于Docker for Azure来说,我们现在支持部署到Azure Gov,通过Cloustor支持持久性卷现在是稳定的,可以通缉你广化寺用在Azure Public和Azure Gov中。
废弃
在dockerd的命令行中,--api-enable-core标识已经被废弃很久了,而采用--api-cors-header。对于--api-enable-cors还没有完全去掉。
Ubuntu 12.04 "precise pangolin"已经完结了生命周期,所以它现在不是Docker支持的操作系统。Ubuntu的后期版本仍旧是支持的。
下一步
要体验这些新特性:
- 下载Docker CE的最新版
- 查看Docker文档
- 在Play with Docker中尝试新特性
- 在论坛或者在Slack的Docker社区频道中提问
- 参加6月28日的 CE 17.06在线聚会
原文链接:ANNOUNCING DOCKER 17.06 COMMUNITY EDITION (CE)(翻译:钟最龙)