Docker应用

预计阅读时间:12分钟

这是一项实验功能。

实验性功能提供了对未来产品功能的早期访问。这些功能仅用于测试和反馈,因为它们可能在版本之间更改而不会发出警告,或者可以从将来的版本中完全删除。实验功能不得在生产环境中使用。Docker不提供对实验功能的支持。

有关Docker CLI中当前实验功能的列表,请参阅Docker CLI实验功能

概述

Docker App是一个CLI插件,它引入了一个顶级docker app命令来将容器体验带给应用程序。下表将Docker容器与Docker应用程序进行了比较。

目的 配置文件 建立 执行 和。。分享
容器 Docker文件 docker镜像构建 docker容器运行 泊坞窗图片推送
应用程序 应用程式套件 码头工人应用程序捆绑 docker应用安装 泊坞窗应用程序推送

借助Docker App,现在可以像管理图像和容器一样轻松地管理整个应用程序。例如,Docker App可让您 使用命令构建验证部署应用程序docker app。您甚至可以利用安全的供应链功能,例如签名pushpull操作。

注意docker app适用于Docker 19.03或更高版本。

本指南将引导您完成以下两种情况:

  1. 从头开始初始化和部署新的Docker App项目。
  2. 将现有的Compose应用程序转换为Docker App项目(在beta版本的过程中稍后添加)。

第一种情况通过工具和工作流描述了Docker App的基本组件。

从头开始初始化并部署新的Docker App项目

本节介绍了创建新的Docker App项目的步骤,以使您熟悉工作流程和最重要的命令。

  1. 先决条件
  2. 初始化一个空的新项目
  3. 填充项目
  4. 验证应用
  5. 部署应用
  6. 将应用程序推送到Docker Hub
  7. 直接从Docker Hub安装应用程序

先决条件

您需要至少一个以Swarm模式运行的Docker节点。您还需要带有App CLI插件的最新版Docker CLI。

根据您的Linux发行版和安全性上下文,您可能需要在命令前加上sudo

初始化一个新的空项目

docker app init命令用于初始化新的Docker应用程序项目。如果您单独运行它,它将初始化一个新的空项目。如果将其指向现有docker-compose.yml文件,它将基于Compose文件初始化一个新项目。

使用以下命令初始化一个名为“ hello-world”的新空项目。

$ docker app init hello-world
Created "hello-world.dockerapp"

该命令将生成一个包含三个YAML文件的新目录。目录的名称是.dockerapp附加了项目的名称,三个YAML文件是:

  • docker-compose.yml
  • metadata.yml
  • parameters.yml

使用以下命令检查YAML文件。

$ cd hello-world.dockerapp/

$ cat docker-compose.yml
version: "3.6"
services: {}

$ cat metadata.yml
version: 0.1.0
name: hello-world
description:

$ cat parameters.yml

您的文件可能会更详细。

让我们快速描述每个文件。

docker-compose.yml 描述应用程序。

metadata.yml指定标识元数据,例如名称,版本,描述和维护者。它接受键值对。

parameters.yml 指定应用程序参数的默认值。

填充项目

本节介绍如何编辑项目YAML文件,使其运行一个简单的Web应用程序。

使用首选的编辑器来编辑docker-compose.ymlYAML文件并使用以下信息对其进行更新:

version: "3.6"
services:
  hello:
    image: hashicorp/http-echo
    command: ["-text", "${hello.text}"]
    ports:
      - ${hello.port}:5678

parameters.yml文件更新为以下内容:

hello:
  port: 8080
  text: Hello world!

保存更改。

该应用程序已更新为基于hashicorp/http-echoWeb服务器映像运行单个容器的应用程序。该映像执行一条命令,该命令显示一些文本并将其自身公开在网络端口上。

按照最佳实践,使用变量将应用程序的配置与应用程序本身分离。在这种情况下,应用程序显示的文本以及将在其上发布的端口由Parameters文件部分中定义的两个变量控制。

Docker App提供了inspect子命令,以提供应用程序配置的美化摘要。这是一种在部署前检查如何配置应用程序的快速方法,而无需阅读Compose file。重要的是要注意,此时应用程序尚未运行,并且该inspect操作将检查配置文件。

$ docker app inspect hello-world.dockerapp
hello-world 0.1.0

Service (1) Replicas Ports Image
----------- -------- ----- -----
hello       1        8080  hashicorp/http-echo

Parameters (2) Value
-------------- -----
hello.port     8080
hello.text     Hello world!

docker app inspect如果该Parameters部分未为app部分中表示的每个参数指定默认值,则操作将失败。

该应用程序已准备好进行验证和呈现。

验证应用

Docker App提供了validate子命令来检查语法和配置的其他方面。如果应用通过验证,则该命令不返回任何参数。

$ docker app validate hello-world.dockerapp
Validated "hello-world.dockerapp"

docker app validate如果该Parameters部分未为app部分中表示的每个参数指定默认值,则操作将失败。

由于validate操作没有返回任何问题,因此可以部署该应用程序。

部署应用

部署Docker App项目有多种选择。

  • 部署为本地Docker App应用程序
  • 部署为Compose应用程序
  • 部署为Docker Stack应用程序

从部署为本地Docker App应用程序开始,讨论了所有三个选项。

部署为本地Docker App

部署为本地Docker应用程序的过程如下:

使用docker app install部署应用程序。

使用以下命令来部署(安装)该应用程序。

$ docker app install hello-world.dockerapp --name my-app
Creating network my-app_default
Creating service my-app_hello
Application "my-app" installed on context "default"

默认情况下,docker app使用当前上下文来运行安装容器,并使用目标上下文来部署应用程序。您可以使用标志--target-context或使用环境变量来覆盖第二个上下文DOCKER_TARGET_CONTEXT。此标志也可用于命令statusupgradeuninstall

$ docker app install hello-world.dockerapp --name my-app --target-context=my-big-production-cluster
Creating network my-app_default
Creating service my-app_hello
Application "my-app" installed on context "my-big-production-cluster"

注意:部署在同一目标上下文上的两个应用程序不能共享相同的名称,但是如果它们部署在不同的目标上下文上,则这是有效的。

您可以使用docker app status <app-name>命令检查应用程序的状态。

$ docker app status my-app
INSTALLATION
------------
Name:         my-app
Created:      35 seconds
Modified:     31 seconds
Revision:     01DCMY7MWW67AY03B029QATXFF
Last Action:  install
Result:       SUCCESS
Orchestrator: swarm

APPLICATION
-----------
Name:      hello-world
Version:   0.1.0
Reference:

PARAMETERS
----------
hello.port: 8080
hello.text: Hello, World!

STATUS
------
ID              NAME            MODE          REPLICAS    IMAGE             PORTS
miqdk1v7j3zk    my-app_hello    replicated    1/1         hashicorp/http-echo:latest   *:8080->5678/tcp

该应用程序是使用堆栈协调器部署的。这意味着您也可以使用常规docker stack命令对其进行检查。

$ docker stack ls
NAME                SERVICES            ORCHESTRATOR
my-app              1                   Swarm

现在该应用程序正在运行,您可以将Web浏览器指向端口8080上Docker节点的DNS名称或公共IP并查看该应用程序。您必须确保从浏览器到Docker主机的连接上允许进入端口8080的流量。

现在,使用docker app upgrade <app-name>命令更改应用程序的端口。

$ docker app upgrade my-app --set hello.port=8181
Upgrading service my-app_hello
Application "my-app" upgraded on context "default"

您可以使用卸载应用程序docker app uninstall my-app

部署为Docker Compose应用

部署为Compose应用程序的过程包括两个主要步骤:

  1. 将Docker应用项目渲染为docker-compose.yml文件。
  2. 使用部署应用程序docker-compose up

您需要最新版本的Docker Compose才能完成这些步骤。

渲染是读取整个应用程序配置并将其输出为单个docker-compose.yml文件的过程。无论参数是否指定为变量,这都会创建一个具有硬编码值的Compose文件。

使用以下命令将应用程序渲染docker-compose.yml为当前目录中名为Compose的文件。

$ docker app render --output docker-compose.yml hello-world.dockerapp

检查结果docker-compose.yml文件的内容。

$ cat docker-compose.yml
version: "3.6"
services:
  hello:
    command:
    - -text
    - Hello world!
    image: hashicorp/http-echo
    ports:
    - mode: ingress
      target: 5678
      published: 8080
      protocol: tcp

请注意,该文件包含硬编码的值,这些值基于Parameters 项目的YAML文件的部分内容进行了扩展。例如,${hello.text}已扩展为“ Hello world!”。

注意:几乎所有docker app命令都建议使用该--set key=value标志来覆盖默认参数。

尝试用不同的文本呈现应用程序:

$ docker app render hello-world.dockerapp --set hello.text="Hello whales!" 
version: "3.6"
services:
  hello:
    command:
    - -text
    - Hello whales!
    image: hashicorp/http-echo
    ports:
    - mode: ingress
      target: 5678
      published: 8080
      protocol: tcp

使用docker-compose up部署的应用。

$ docker-compose up --detach
WARNING: The Docker Engine you're using is running in swarm mode.
<Snip>

该应用程序现在作为Docker Compose应用程序运行,应该可以8080在Docker主机上的端口上访问。您必须确保从8080浏览器到Docker主机的连接上允许端口通信。

您可以docker-compose down用来停止和删除该应用程序。

部署为Docker堆栈

将应用程序部署为Docker堆栈是一个分为两个步骤的过程,与将其部署为Docker Compose应用程序非常相似。

  1. 将Docker应用项目渲染为docker-compose.yml文件。
  2. 使用部署应用程序docker stack deploy

完成上一部分中的步骤以将Docker应用程序项目呈现为Compose文件,并确保您已准备好将其部署为Docker Stack。您的Docker主机必须处于Swarm模式。

$ docker stack deploy hello-world-app -c docker-compose.yml
Creating network hello-world-app_default
Creating service hello-world-app_hello

现在,该应用程序已作为Docker堆栈部署,可以8080在Docker主机上的端口上进行访问。

使用docker stack rm hello-world-app命令停止并卸下堆栈。您必须确保从8080浏览器到Docker主机的连接上允许端口通信。

将应用程序推送到Docker Hub

如简介中所述,docker app您可以使用与当前管理容器映像相同的方式来管理整个应用程序。例如,你可以推拉从像泊坞枢纽与注册整个应用程序docker app pushdocker app pull。其他docker app命令,例如installupgradeinspect,和render可直接应用,同时它们被存储在一个注册表进行。

将应用程序推送到Docker Hub。要完成此步骤,您需要一个有效的Docker ID,并且必须登录到将应用程序推送到的注册表中。

默认情况下,所有平台体系结构都推送到注册表。如果您将正式的Docker映像作为应用程序的一部分推送,则可能会发现您的应用程序包变得很大,并且嵌入了所有映像架构。要仅推送所需的体系结构,可以添加--platform标志。

$ docker login 

$ docker app push my-app --platform="linux/amd64" --tag <hub-id>/<repo>:0.1.0

直接从Docker Hub安装应用程序

现在将应用程序推送到注册表,请尝试对它执行inspectandinstall命令。您的应用程序的位置与示例中提供的位置不同。

$ docker app inspect myuser/hello-world:0.1.0
hello-world 0.1.0

Service (1) Replicas Ports Image
----------- -------- ----- -----
hello       1        8080  myuser/hello-world@sha256:ba27d460cd1f22a1a4331bdf74f4fccbc025552357e8a3249c40ae216275de96

Parameters (2) Value
-------------- -----
hello.port     8080
hello.text     Hello world!

该操作是直接针对注册表中的应用程序执行的。

现在,通过使用不同的端口在注册表中引用应用程序,将其安装为本地Docker应用程序。

$ docker app install myuser/hello-world:0.1.0 --set hello.port=8181
Creating network hello-world_default
Creating service hello-world_hello
Application "hello-world" installed on context "default"

测试该应用程序是否正常运行。

这些示例中使用的应用程序是一个简单的Web服务器,它显示文本“ Hello world!”。在端口8181上,您的应用程序可能有所不同。

$ curl http://localhost:8181
Hello world!

卸载应用程序。

$ docker app uninstall hello-world
Removing service hello-world_hello
Removing network hello-world_default
Application "hello-world" uninstalled on context "default"

您可以使用以下docker stack ls命令查看Docker App的名称。

Docker App应用程序撰写编排