DockerCon 2017: Docker新特性初体验

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: DockerCon2017已经结束了,从去年的版本到现在,Docker产生了很多的变化。Docker的开发者们一直强调他们希望Docker的体验越简单越好。观察下最近几个月Docker的新特性,你会发现所言非虚,DockerCon2017大会也向我们展示了这一点。

DockerCon2017已经结束了,从去年的版本到现在,Docker产生了很多的变化。Docker的开发者们一直强调他们希望Docker的体验越简单越好。观察下最近几个月Docker的新特性,你会发现所言非虚,DockerCon2017大会也向我们展示了这一点。下面介绍下Docker最近几个月发布的新特性

多阶段构建

构建一个镜像一般需要多个阶段。

  • 编译你的应用
  • 然后跑测试
  • 当测试通过时,你将你的应用打包成可部署的软件包
  • 最后你把软件包添加到镜像里面

你可以将这些步骤都放进一个Dockerfile中,但是这会导致镜像膨胀,加入了很多最终产品不需要的内容。例如编译和构建的框架,Docker镜像存储需要的空间也会变得很大。
一个解决方法是在Docker外面编译测试打包应用程序,或者使用多个Dockerfile。你可以用一个Dockerfile来编译测试打包你的应用,用另外一个Dockerfile来添加之前打好的软件包,并做最终的交付。
然而,整个构建的过程通过一个脚本捆绑在一起,而并不是以Docker的方式来执行构建。
Docker对于添加新的特性或者语法到Dockerfile中是谨慎的,当他们最终决定着手通过一个简单而优雅的方式来解决这个构建的问题。通过引入多阶段构建(multi-stage builds),使得通过使用多个FROM指令来定义多个构建的阶段成为可能。示例如下

# First stage to build the application
FROM maven:3.5.0-jdk-8-alpine AS build-env # build-env构建阶段的开始
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package # build-env 构建阶段在此结束

# Final stage to define our minimal runtime
FROM FROM openjdk:8-jre  # 新的构建阶段的开始
COPY --from=build-env target/app.jar app.jar
RUN java -jar app.jar

每一次使用FROM指令时,相当于定义了一个新的构建阶段,一直到下一个FROM指令之前或者到文件的结束为止,执行的指令均属于该构建阶段。通过AS指令来给这一构建阶段命名,同时指定了该阶段使用的基础镜像。在接下来的构建阶段,可以使用COPY --from=<stage>指令来拷贝之前构建阶段的软件制成品到当前构建阶段,继续进行构建,直到最后一个构建阶段生成的镜像,才是最终的交付镜像。通过对最终构建阶段的基础镜像选择,可以只让交付镜像包含最小的运行时和需要交付软件制成品,使得镜像变小,上传下载更加迅速。
该特性是Docker 17.05版本的一部分,敬请期待,待版本稳定后,容器服务也会支持该特性

FROM指令中使用参数指定镜像版本

在Dockerfile中使用参数,并不是一件新鲜的事物,我们已经可以使用ARG指令来传递参数给构建过程,这些参数的值在Dockerfile中是可变的,经常被用来传递版本号,密码,例如SSH的密钥等。现在通过参数来指定基础镜像的版本也成为了可能,示例如下:

ARG GO_VERSION=1.8
FROM golang:${GO_VERSION}
ADD . /src
WORKDIR /src
RUN go build
CMD ["/bin/app"]

通过使用上面的Dockerfile,我们可以构建基于另外一个GO语言版本的镜像:

$ docker build --arg=GO_VERSION=1.7 .

清理Docker资源

使用Docker的开发者经常会抱怨Docker占用了太多的存储空间,如果不定期清理,这确实是个问题。Docker增加了docker system子命令来检查磁盘的使用空间,同时清理无用的资源。
下面的命令列出了磁盘使用情况:

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              7                   5                   1.247GB             769MB (61%)
Containers          7                   2                   115.9MB             99.23MB (85%)
Local Volumes       1                   1                   85.59MB             0B (0%)

你可以使用prune来清理不再需要的资源:

$ docker system prune
WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all dangling images
Are you sure you want to continue? [y/N] y

只清理特定子系统的资源也是支持的:

$ docker image/container/volume/network prune

指定端口时增加可读性

由于指定端口的语法让人困惑,Docker的使用者经常在理解和定义一个容器发布的端口时有困难。当你在使用或者定义容器的端口时,可能的格式如下:

ports:
 - 3000
 - 3000-3005
 - 49100:22
 - 9090-9091:8080-8081
 - 127.0.0.1:8001:8080-8081
 - 6060:7060/udp

当使用客户端时,这些语法还比较容易理解,但是当你需要在一个compose模版中定义许多这样的端口时,可读性就会变得很差。为了解决这一问题,现在你可以使用一个更加详细的格式来定义端口:

ports:
  - target: 6060 # 容器端口
    published: 7060 # 映射到主机暴露的端口
    protocol: udp   # 使用的协议

指定数据卷时增加可读性

跟端口一样,数据卷(volume)也有类似的语法:

volumes:
  - /var/lib/mysql
  - /opt/data:/var/lib/mysql
  - ./cache:/tmp/cached
  - datavolume:/var/lib/mysql
  - ~/configs/etc/configs/:ro

也增加了一个更加详细的语法来声明和指定数据卷(volume)

volumes:
  - type: bind
    source: ~/configs
    target: /etc/configs
    read_only: true
相关文章
|
XML 缓存 网络协议
「Spring Boot 2.4 新特性」一键构建Docker镜像
在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,通过简单的配置,自动生成镜像并推送到仓库中。
508 0
|
Kubernetes Docker 容器
Kubernetes1.7新特性:支持绕过Docker,直接通过Containerd管理容器
背景情况 从Docker1.11版本开始,Docker依赖于containerd和runC来管理容器,containerd是控制runC的后台程序,runC是docker公司按照OCI标准规范编写的一个操作容器的命令行工具,containerd这个后台程序还可以操作满足OCI标准规范的其他容器工具,也就意味着以后只要是按照OCI标准规范开发的容器工具,都可以被containerd使用起来。
1681 0
|
安全 开发者 Docker
DockerCon 2015:Docker公司提出将重点关注容器安全
本文讲的是DockerCon 2015:Docker公司提出将重点关注容器安全,【编者的话】本文是对11.16欧洲DockerCon大会的简短报道。重点在Docker容器安全领域的新特性,对于在生产环境中更安全使用Docker有很大的参考价值。
1183 0
|
监控 网络协议 应用服务中间件
|
新零售 安全 关系型数据库
DockerCon 2017 Day2: 安全、生态、敏捷-Docker企业应用的全方位升级
如往年的DockerCon一样,第一天的重点在Docker技术上的布局,无论是LinuxKit还是新的Moby项目。而第二天则会由Docker的CEO Ben介绍Docker的商业拓展和企业级市场。 如果说去年的Docker在企业生产环境可用只是一个开始,而今年Docker则憋了一个大招,展示了大量企业安全特性和成功客户故事。
7062 0
|
Docker 容器
Docker 1.13 新特性 —— Docker服务编排相关
近期发布的1.13的版本中,Docker对Docker Engine内置的编排能力做了很多的更新,使用新的这些特性,我们能更好的编排和迭代我们的应用。
5111 0
|
数据安全/隐私保护 Docker 容器
Docker 1.13 新特性 —— Docker系统相关
Docker随着1.13版本的发布,Docker对Daemon的API和命令行做了一系列的改造,除了对容器,镜像等命令做了二级的命令(containers,images)的改造完,还增加了很多的系统或集群的管理的接口和命令,包含system,plugin,secret,分别用于管理Docker Daemon的系统状态,Docker插件的管理,以及集群中的敏感信息的管理。
3679 0
|
安全 Docker 容器
Docker 1.13 新特性 —— 网络相关
Docker 1.13 新特性 —— 网络相关
4787 0
|
运维 监控 开发者
DockerCon 2016 深度解读:Docker监控厂商之Sysdig
Docker 技术社区不断升温,稳定性是成熟应用的首要考虑因素,国内外围绕Docker监控涌现出了很多优秀的厂商,为整个Docker生态提供了坚实可靠的工具与服务。我们会以一个系列的文章来介绍这些Docker监控厂商,分析对比它们在监控方面的侧重点,让开发者能够根据自己的需求做出合适的选择。
5881 0
|
安全 Linux 虚拟化
DockerCon 2016 深度解读: Docker安全
前端时间在乌云上出现了一篇很火的文章,从网上可以扫描到很多暴露控制端口到公网的Docker,并且没有配置认证策略,攻击者可以直接通过Docker Remote API控制Docker,而Docker通常又是用root权限启动的,所以攻击者等于完全获取的整个系统的权限。这件事...
7671 0