今天我们发布了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示例应用(https://github.com/dockersamples/atsea-sample-shop-app):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 href=”http://nginx.org/” rel=”external nofollow” target=”_blank”>nginx.org</a>.<br/>
Commercial support is available at
<a href=”http://nginx.com/” rel=”external nofollow” target=”_blank”>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;原文链接:https://blog.docker.com/2017/06/announcing-docker-17-06-community-edition-ce/
本文链接:http://www.yunweipai.com/21066.html
原文链接:http://www.yunweipai.com/21066.html