DockerCon 2017: Docker新特性初体验

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 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
相关文章
|
27天前
|
存储 数据管理 Docker
docker中数据卷的特性
【10月更文挑战第10天】
32 2
|
4月前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
70 1
|
6月前
|
Dubbo Java Docker
微服务框架(一)Spring Boot + Dubbo + Docker 框架特性简述
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为此微服务框架的特性简述。 本系列文章中所使用的框架版本为Spring Boot 2.0.3-RELEASE,Spring 5.0.7-RELEASE,Dubbo 2.6.2。
微服务框架(一)Spring Boot + Dubbo + Docker 框架特性简述
|
存储 Cloud Native 应用服务中间件
【云原生】一文学会Docker存储所有特性
【云原生】一文学会Docker存储所有特性
98 1
|
XML 缓存 网络协议
「Spring Boot 2.4 新特性」一键构建Docker镜像
在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,通过简单的配置,自动生成镜像并推送到仓库中。
561 0
|
容器 Docker 调度
【DockerCon2017技术解读】Docker特性介绍
在云栖TechDay34期:DockerCon2017的技术解读中,阿里巴巴技术专家谭林华为大家介绍了Docker的最新特性以及与传统场景相比,这些新特性所具有的优势和所能够解决的问题。
402 0
|
应用服务中间件 网络安全 Docker
Docker Engine v18.09.1 新版本特性解读,全新功能先睹为快(二)
Docker Engine v18.09.1 提供了许多新功能、改进和 Bug 修复。接下来,让我们来继续看看在升级到 Docker 18.09.1 版本时值得注意的主要功能。
2674 0
|
Ubuntu Linux Shell
Docker Engine v18.09.1 新版本特性解读,全新功能先睹为快(一)
Docker Engine v18.09.1 上个月推出了 GA。社区版和企业版用户都可以使用它。它包含了缺陷修复程序,您可以在出于一致性和兼容性原因而无法快速采用新功能的环境中使用这些缺陷修复程序。
3452 0
|
UED Docker 容器
Docker Hub 迎来大幅改版整合,全新特性先睹为快!
Docker 近日宣布将 Docker Store 和 Docker Cloud 集成到 Docker Hub 中,为用户提供一种集查找、存储以及共享容器镜像的一站式体验。
2002 0
|
Kubernetes Docker 容器
Kubernetes1.7新特性:支持绕过Docker,直接通过Containerd管理容器
背景情况 从Docker1.11版本开始,Docker依赖于containerd和runC来管理容器,containerd是控制runC的后台程序,runC是docker公司按照OCI标准规范编写的一个操作容器的命令行工具,containerd这个后台程序还可以操作满足OCI标准规范的其他容器工具,也就意味着以后只要是按照OCI标准规范开发的容器工具,都可以被containerd使用起来。
1727 0