Cloud native applications typically use different technologies, each with their own packaging formats. For example, If you’re working on Microsoft Azure then it would be ARM templates, or if its Kubernetes, then its Helm charts, or if it’s on AWS then it would be CloudFormation and so on.
Distributed applications usually comprise executable units and supporting API-based services. Executable units could span across environments like IaaS (like OpenStack or Azure), container orchestrators (like Kubernetes or Nomad), container runtimes (like local Docker or ACI), cloud platform services (like object storage or Database as a Service) and Functions-as-a-Service (FaaS), as well as higher-level PaaS services. Along with these components, many managed cloud services (e.g. load balancers, routers to databases) are provisioned and interconnected via REST APIs.
In the industry, currently, there is no single solution for defining and packaging multi-service, multi-format distributed applications.
In this article, we will look at how the CNAB packaging format provides application providers and developers with a way of installing a multi-component application into a distributed computing environment, supporting all of the above types, and makes it easy to deliver apps across teams, organizations and marketplaces.
Cross posted from : InfoQ.com
CNAB is an open-source, cloud-agnostic specification for packaging and running distributed applications. Created by Microsoft, Docker, HashiCorp, Bitnami, Pivotal, and many others. It unifies the management of multi-service, distributed applications across different toolchains into a single all-in-one packaging format.
Simplifies complex deployments. | With CNAB, you can package multi-service, multi-format distributed applications. So deployments can be done with ease & simplified. |
Open Source, Cloud Agnostic | CNAB bundles can have varied infrastructure components or services that you need. CNABs is the right choice for your multi-cloud strategy. |
Shareable Apps | Enables Developers/Application Providers to share/deliver apps across teams, organizations, and marketplaces. |
Key benefits of CNAB
According to the CNAB Spec, CNAB packaging format brings in:
There are two ways in which you can install Docker App, either as standalone or as a CLI plugin. Pre-built static binaries are available on GitHub releases for Windows, Linux, and macOS. Here I’m going to use the Linux version and install Docker app as standalone utility.
In the below example, we are going to check how to convert an existing Compose app into a Docker App project.
We have got the Docker App setup, use the existing Docker compose file (below) which launches an HTTP echo server that prints the specified text when hit on the configured port.
version: '3.2'
services:
hello:
image: hashicorp/http-echo
command: ["-text", "hello world"]
ports:
- 5678:5678
Run docker-app init command from the folder where compose file is located to Create a new Application Package:
docker app init --single-file hello
If you check the Docker Application Package hello.dockerapp, it will contain three YAML documents:
If you prefer having the three core documents in separate YAML files, omit the –single-file option to the docker app init
command. This will create a new directory instead of a single file.
Let’s modify the Compose file section in helloworld.dockerapp
, by introducing variables $text and $port.
version: '3.2'
services:
hello:
image: hashicorp/http-echo
command: ["-text", "${text}"]
ports:
- ${port}:5678
Before launching the modified Docker Application Package, let’s do inspect and check if everything looks good.
Docker App also provides validate command to check syntax and other aspects of the configuration. We are going to skip & render the app.
Render command will display the compose file with the default values.
All set now, the next step is to deploy the Docker App project. Here we have 2 options, either we can launch it as a Native Docker app application or as a Compose app application.
We are going to use the Compose app option and then push the application to the DockerHub registry.
Although Docker Compose configuration has default ports & text values, we can set the values at runtime and deploy them.
Let us try different configurations with different values for port & text.
You can also check the status of the app with the docker app status <app-name> command.
With a new Docker application package, compose configuration with default values can be pushed to DockerHub and be shared across developers/teams.
Application can also be installed by running docker app deploy or can use the rendered version and run docker stack deploy render/docker-compose.yml or docker-compose –f up.
Once your Application Packages are in DockerHub or registry, you can use commands like install, upgrade, uninstall, etc.,
In the next section, we will take another example that has Angular, SpringBoot & PostgreSQL stack, and create Docker Application Package out of it.
Below is the compose file for the Angular, SpringBoot & PostgreSQL application that we are going to use.
version: '3'
services:
ui:
build:
context: .
dockerfile: UIDockerfile
ports:
- '4200:4200'
networks:
- samplenet
links:
- 'api:api'
api:
build:
context: .
dockerfile: AppDockerfile
ports:
- '8080:8080'
depends_on:
- db
networks:
- samplenet
links:
- 'db:db'
db:
build:
context: .
dockerfile: DBDockerfile
volumes:
- 'postgresdb:/var/lib/postgresql/data'
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: testdb
ports:
- '5432:5432'
healthcheck:
test:
- CMD-SHELL
- 'pg_isready -U postgres'
interval: 10s
timeout: 5s
retries: 5
networks:
- samplenet
networks:
samplenet: null
volumes:
postgresdb: {}
Above compose file defines 4 services:
ui
: Is for Angular application runs on port 4200
.api
: Is for Spring boot application runs on port 8080
.db
: Is for postgresdb application runs on port 5432
.samplenet
network andpostgresdb
definition is for db servicedepends_on
denotes the service dependencies. When you start the services, compose would start the dependent services as well.Run docker-app init
command from the folder where compose file is located to Create a new Application Package:
Let’s do inspect and check if everything is proper
Use render option to start the application using Docker Compose up command
Once you push it to DockerHub, you can share it with the team and they would be able to do all tasks like install, upgrade & uninstall tasks, etc.,
Application can then be installed by running docker app deploy or can use the rendered version and run docker stack deploy render/docker-compose.yml or docker-compose –f up.
Compose files are not easy to share between environments or across teams, Docker Application Packages solves these problems and make Compose Application reusable across multiple environments (Development/QA/Staging/Production). Docker App is currently in experimental mode and it must not be used in production environments.
Like this post? Don’t forget to share it!
In today's digital-first world, businesses must adopt effective strategies to stay competitive. Social media marketing…
62% of UX designers now use AI to enhance their workflows. Artificial intelligence (AI) rapidly…
The integration of artificial intelligence into graphic design through tools like Adobe Photoshop can save…
The cryptocurrency trading world has grown significantly in recent years, with automation playing a key…
The non-fungible token (NFT) market has witnessed explosive growth over the past few years, transforming…
There are few things as valuable to a business as well-designed software. Organizations today rely…
This website uses cookies.