前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大胆预测:docker-app 会是docker-compose的替代者

大胆预测:docker-app 会是docker-compose的替代者

作者头像
pollyduan
发布2019-12-16 10:45:22
9620
发布2019-12-16 10:45:22
举报
文章被收录于专栏:云架构修炼手册

Docker 19.03 推出了一个实验特性:app,这是docker的一个指令,就像 image 、run 、exec 、swarm...

官方文档:https://docs.docker.com/engine/reference/commandline/app/

docker-app 将docker容器编排为一个bundle,命名为 application 应用程序。希望将一组docker容器打包为一个应用程序进行分发。

启用app插件

app 是一个体验特性,默认不会启用,最低版本为 19.03 ,因此首先要确保docker引擎不低于此版本。

编辑 ~/.docker/config.json ,增加:

代码语言:javascript
复制
{
  "experimental": "enabled",
  "debug": true
}

检查:

代码语言:javascript
复制
docker
...
app*        Docker Application (Docker Inc., v0.8.0)
builder     Manage builds
buildx*     Build with BuildKit (Docker Inc., v0.3.1-tp-docker)
checkpoint  Manage checkpoints
...

标记 * 的指令为体验特性指令。

代码语言:javascript
复制
# docker app version
Version:               v0.8.0
Git commit:            7eea32b
Built:                 Wed Nov 13 07:28:05 2019
OS/Arch:               linux/amd64
Experimental:          off
Renderers:             none
Invocation Base Image: docker/cnab-app-base:v0.8.0

创建app

在当前工作目录初始化一个docker应用程序。

代码语言:javascript
复制
# docker app init myapp
# tree .
.
└── myapp.dockerapp
    ├── docker-compose.yml
    ├── metadata.yml
    └── parameters.yml

1 directory, 3 files

默认地,会在工作目录创建一个项目目录,其中包含了三个文件:

代码语言:javascript
复制
docker-compose.yml 服务的编排文件
metadata.yml 项目的基本配置文件
parameters.yml 服务compose引用的变量

创建单文件项目:众做周知,分发一个目录比分发单个文件要麻烦的多,因此docker-app 支持将应用程序的项目文件整合为一个独立的文件。

代码语言:javascript
复制
# docker app init demo --single-file
# ll
-rw-r--r--. 1 root root 508 Dec  2 07:13 demo.dockerapp

项目文件并不是创建后就不可更改了,你随时可以将目录格式的应用转换为单文件:

代码语言:javascript
复制
docker app merge myapp

反过来讲单文件项目转换为目录格式:

代码语言:javascript
复制
docker app split myapp

编辑服务

vi myapp.dockerapp/docker-compose.yml

代码语言:javascript
复制
version: "3.6"
services: {
  "nginx": {
    "image": "nginx"
  }
}

安装app

  • app 需要在swarm环境中运行,最简单的测试环境就是在一个单机环境执行:docker swarm init --advertise-addr=你的IP地址
代码语言:javascript
复制
# docker app install myapp

# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
i2ceu8f82bsh        myapp_nginx         replicated          1/1                 nginx:latest

# docker app ls
INSTALLATION APPLICATION   LAST ACTION RESULT  CREATED   MODIFIED  REFERENCE
myapp        myapp (0.1.0) install     success 6 seconds 4 seconds

查看服务

使用render 子命令可以查看docker应用的服务编排:

代码语言:javascript
复制
# docker app render myapp
version: "3.6"
services:
  nginx:
    deploy:
      replicas: 2
    image: nginx

如果myapp 项目文件不在当前目录,和镜像一样,docker引擎会首先去中央仓库拉取。

使用参数

修改parameters.json 文件:

代码语言:javascript
复制
"DEPLOY_REPLICAS": 5

修改docker-compose引用该变量:

代码语言:javascript
复制
version: "3.6"
services: {
  "nginx": {
    "image": "nginx",
    "deploy": {
      "replicas": "${DEPLOY_REPLICAS}"
    }
  }
}

查看服务:

代码语言:javascript
复制
# docker app render myapp
version: "3.6"
services:
  nginx:
    deploy:
      replicas: 5
    image: nginx

多级变量:参数配置文件是yaml格式,很容易想到 —— 可以使用多级参数名,这样就可以对不同的变量进行分组。

代码语言:javascript
复制
deploy:
  replicas: 2

对应的compose中:

代码语言:javascript
复制
"replicas": "${deploy.replicas}"
  • image 中不允许使用变量。

更新app

  • upgrade 只能更新变量里的值。
  • upgrade 不会重新加载app的配置文件,只能通过 --set-s 传入变量的键值。

执行更新:

代码语言:javascript
复制
# docker app upgrade myapp -s DEPLOY_REPLICAS=2
Updating service myapp_nginx (id: t9n7hcic2ek42qhn35kyfh2lj)
Application "myapp" upgraded on context "default"

# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ud4sms7cx9yx        myapp_nginx         replicated          2/2                 nginx:latest

删除应用

代码语言:javascript
复制
docker app uninstall myapp

发布应用

代码语言:javascript
复制
docker login 192.168.33.10:5000
docker app push myapp
  • login成功
  • 修改了metadata中的name: 192.168.33.10:5000/library/myapp
  • 已经配置了insecure-registries.

但是失败了:

代码语言:javascript
复制
# docker app push myapp
192.168.33.10:5000/library/myapp:0.1.0-invoc
fixing up "192.168.33.10:5000/library/myapp:0.1.0" for push: failed to resolve "192.168.33.10:5000/library/myapp:0.1.0-invoc", push the image to the registry before pushing the bundle: failed to do request: Head https://192.168.33.10:5000/v2/library/myapp/manifests/0.1.0-invoc: http: server gave HTTP response to HTTPS client
  • 看起来还是找https,insecure-registries 没有效果。

尝试不修改metadata中的name,在命令行中使用tag参数:

代码语言:javascript
复制
# docker app push myapp -t 192.168.33.10:5000/library/myapp
192.168.33.10:5000/library/myapp:latest-invoc
fixing up "192.168.33.10:5000/library/myapp:latest" for push: failed to resolve "192.168.33.10:5000/library/myapp:latest-invoc", push the image to the registry before pushing the bundle: failed to do request: Head https://192.168.33.10:5000/v2/library/myapp/manifests/latest-invoc: http: server gave HTTP response to HTTPS client

- 可以在docker images中看到指定tag的镜像,但是push还是失败

使用https协议的仓库,仍然失败。

对于私服,暂时没办法解决,官网文档不多。

常用推送到中央仓库,通过:

代码语言:javascript
复制
docker app push myapp -t pollyduan/myapp

红蓝日志闪烁,看起来正常了。但结局还是残酷的:

代码语言:javascript
复制
fixing up "docker.io/pollyduan/myapp:latest" for push: failed commit on ref "manifest-sha256:f5dc44557f1d666381791c3d01300d64899ba7b74dc26f4d681bd1827caf61ca": no response

登录hub.docker.com查看,镜像存在了。

回头看看harbor私服,镜像也存在了,只是那个报错让人无语。

回头找找更多的文档再回来补充。

大胆预测:docker-app 会是docker-compose的替代者,就像swarm 之于 docker-swarm,立字为证。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 启用app插件
  • 创建app
  • 编辑服务
  • 安装app
  • 查看服务
  • 使用参数
  • 更新app
  • 删除应用
  • 发布应用
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档