DockerCon 2017: Docker新特性初体验

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
时间: 2025-01-02 01:05:29

DockerCon 2017: Docker新特性初体验的相关文章

C# 3.0中新匿名类型特性初体验

在去年PDC2005上,在发布C#2.0 (C# Whidbey)的同时,微软也同时展示了它们在C# 3.0上的一些计划.在提到一系列新的语言特性如语言集成查询(LINQ)等,Redmond同时也介绍了一个新的特性--匿名类型.本文详细介绍了匿名类型. 匿名类型定义 C#3.0规范将匿名类型描述为从对象初始化器(object initializer)自动推断和生成的元组类型.在你能够充分领会这一定义之前,你需要了解"对象初始化器"的概念,它是匿名类型特性的基础. 对象初始化器给一个对象

2015WWDC:iOS9.0中Siri新功能初体验

iOS 9中Siri的新功能 在iOS 9中,Siri会有全新的UI.Siri技术背后有着每周处理10亿次请求的支持,是当今世界上最先进的只能语音引擎之一--仅有5%的词句错误率. Siri看穿你的应用 新一代的Siri可以"看到"你应用,你甚至能够设置"当我回家的时候提醒我做事"的提醒,以免到家之后忘记你的重要事项.   Siri日历的交通提醒功能 新一代Siri的日历功能可以根据实时交通情况进行提醒,非常类似安卓中Google Now的功能.   新一代Siri

【DockerCon2017最新技术解读】Docker最新特性介绍

摘要:在云栖TechDay34期:DockerCon2017最新的技术解读中,阿里巴巴技术专家谭林华为大家介绍了Docker的最新特性以及与传统场景相比,这些新特性所具有的优势和所能够解决的问题. 以下内容根据演讲嘉宾现场视频以及速记整理而成. 演讲嘉宾介绍: 谭林华(花名:霖华),阿里云容器服务团队技术专家,具有多年PaaS产品研发经验,在平台设计.基础架构等方面具有深厚的功底,Docker技术实践者,目前负责阿里云容器服务镜像构建等功能. 本次将分享关于Docker新特性如下的几个点: 多阶

HTML5超酷新特性WebSockets初体验

人人网Web前端开发工程师暴风彬彬(网名),在个人网站彬Go上发表了一篇博文<HTML5 WebSockets 基础使用教程>,和大家一起分享了如何利用HTML5超酷新特性WebSockets进行服务器端开发,文中给出了较详细的源代码及图片,现将本文转载于此,供大家借鉴学习: HTML5之中一个很酷的新特性就是WebSockets,它可以让我们无需AJAX请求即可与服务器端对话.今天彬Go将让大家通过Php环境的服务器端运行WebSocket,创建客户端并通过WebSockets协议发送和接收

Docker 容器初体验

Docker 容器初体验 在本文中,我们将迈出使用Docker的第一步,学习第一个Docker容器.本章还会介绍如何与Docker进行交互的基本知识. 1 确保Docker已经就绪 首先,我们会查看Docker是否能正常工作,然后学习基本的Docker的工作流:创建并管理容器.我们将浏览容器的典型生命周期:从创建.管理到停止,直到最终删除. 第一步,查看docker程序是否存在,功能是否正常,如代码清单3-1所示. 代码清单3-1 查看docker程序是否正常工作 $ sudo docker i

Docker管理工具Shipyard初体验

本文讲的是Docker管理工具Shipyard初体验,[编者的话]Shipyard是一个Docker管理工具,有WEB界面也可以通过CLI来管理Docker主机.镜像.容器 .要方便的管理Docker相关服务,基于Web的方式来管理肯定是首选.本文介绍了Shipyard的使用方式. Shipyard是一个Docker的管理工具,你可以用它管理在不同机器上Docker镜像和容器的部署,但是在本篇博文中,我将会向你展示如何在你的本地机器上使用Shipyard. 在你机器上安装Shipyard的时候会

Visual Studio 2017 针对移动开发的新特性介绍

Visual Studio是世界上最好的IDE之一,如果是 .NET世界,那就没有之一了(^_^),而最近推出的Visual Studio 2017在移动平台方面更是加强了这一点.这个版本包含了一些非常棒的功能,包括实时单元测试.新的重构.代码提示.C#7.0的支持,以及帮助移动开发人员构建更好的移动应用程序的功能. 下面,就让我们一起来看看Visual Studio 2017中有哪些功能使得移动开发变得更加容易. Visual Studio 2017的安装体验有所提升 Visual Studi

体验Adobe Dreamweaver CS3新特性

   GoLiver和Dreamweaver同为网页设计工具,目前Adobe 发布了Dreamweaver CS3新版本,让我们看看加入Adobe大家庭的Dreamweaver有什么新特性. Dreamweaver 8的CSS设计工具对于那些没有任何编程经验,设计背景出身的用户而言仍然遥不可及.Dreamweaver CS3则修正了这些问题,对于没有太多编程经验的人来说,上手起来也比较容易.然而由于CSS和Ajax自身所含有的复杂因素等问题,导致使用这两种技术绝非像使用老掉牙的HTML进行网页设

Docker的Windows容器初体验

系列文章 第一篇 Docker的Windows容器初体验 - 本文 第二篇 阿里云Windows Server 2016环境Docker试用 最近微软发布了Windows Server 2016,其中最让广大开发者和运维同学期待的就是Docker对Windows容器的支持. Windows支持两种不同类型的容器,即 Windows Server 容器和 Hyper V 容器. 这两种类型的容器的使用方式相同,也支持相同的容器映像. 但是它们的实现机制不同,提供了不同的安全隔离级别 Windows