Docker应用
预计阅读时间:12分钟
这是一项实验功能。
实验性功能提供了对未来产品功能的早期访问。这些功能仅用于测试和反馈,因为它们可能在版本之间更改而不会发出警告,或者可以从将来的版本中完全删除。实验功能不得在生产环境中使用。Docker不提供对实验功能的支持。
有关Docker CLI中当前实验功能的列表,请参阅Docker CLI实验功能。
概述
Docker App是一个CLI插件,它引入了一个顶级docker app
命令来将容器体验带给应用程序。下表将Docker容器与Docker应用程序进行了比较。
目的 | 配置文件 | 建立 | 执行 | 和。。分享 |
---|---|---|---|---|
容器 | Docker文件 | docker镜像构建 | docker容器运行 | 泊坞窗图片推送 |
应用程序 | 应用程式套件 | 码头工人应用程序捆绑 | docker应用安装 | 泊坞窗应用程序推送 |
借助Docker App,现在可以像管理图像和容器一样轻松地管理整个应用程序。例如,Docker App可让您 使用命令构建,验证和部署应用程序docker app
。您甚至可以利用安全的供应链功能,例如签名push
和pull
操作。
注意:
docker app
适用于Docker 19.03
或更高版本。
本指南将引导您完成以下两种情况:
- 从头开始初始化和部署新的Docker App项目。
- 将现有的Compose应用程序转换为Docker App项目(在beta版本的过程中稍后添加)。
第一种情况通过工具和工作流描述了Docker App的基本组件。
从头开始初始化并部署新的Docker App项目
本节介绍了创建新的Docker App项目的步骤,以使您熟悉工作流程和最重要的命令。
- 先决条件
- 初始化一个空的新项目
- 填充项目
- 验证应用
- 部署应用
- 将应用程序推送到Docker Hub
- 直接从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.yml
YAML文件并使用以下信息对其进行更新:
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-echo
Web服务器映像运行单个容器的应用程序。该映像执行一条命令,该命令显示一些文本并将其自身公开在网络端口上。
按照最佳实践,使用变量将应用程序的配置与应用程序本身分离。在这种情况下,应用程序显示的文本以及将在其上发布的端口由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
。此标志也可用于命令status
,upgrade
和uninstall
。
$ 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应用程序的过程包括两个主要步骤:
- 将Docker应用项目渲染为
docker-compose.yml
文件。 - 使用部署应用程序
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应用程序非常相似。
- 将Docker应用项目渲染为
docker-compose.yml
文件。 - 使用部署应用程序
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 push
和docker app pull
。其他docker app
命令,例如install
,upgrade
,inspect
,和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安装应用程序
现在将应用程序推送到注册表,请尝试对它执行inspect
andinstall
命令。您的应用程序的位置与示例中提供的位置不同。
$ 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的名称。