In this example, we will create a Docker App which is a single service application deploying a web server with a configurable text message.
First, we create an App definition using the docker app init command:
$ docker app init hello-world
Created "hello-world.dockerapp"
$ tree
.
├── hello-world.dockerapp
├── docker-compose.yml
├── metadata.yml
└── parameters.ymlA new folder named hello-world.dockerapp now exists, which contains three YAML documents:
- metadata
- a Compose file
- parameters to be used at runtime
The metadata.yml file should display as follows:
# Version of the application
version: 0.1.0
# Name of the application
name: hello-world
# A short description of the application
description:
# List of application maintainers with name and email for each
maintainers:
- name: user
email:The docker-compose.yml should contain the following:
version: "3.6"
services: {}The parameters.ymlfile should be empty.
Open hello-world.dockerapp with your favorite text editor.
Open the metadata.yml file and edit the description and maintainers fields in the metadata section.
Open the docker-compose.yml file and add a hello service to the services section.
version: "3.6"
services:
hello:
image: hashicorp/http-echo
command: ["-text", "${text}"]
ports:
- ${port}:5678In the parameters.yml file, add variables with their default value:
port: 8080
text: Hello, World!Next, build an App image from the App definition we have created:
$ docker app build . -f hello-world.dockerapp -t myrepo/hello:0.1.0
[+] Building 0.6s (6/6) FINISHED
(...) (Build output)
sha256:7b48c121fcafa0543b7e88c222304f9fada9911011694b041a7f0e096536db6cAt this point, an App image with the myrepo/hello:1.0.1 tag has been built from the hello-world.dockerapp App definition. This immutable App image includes all the service images at fixed versions that you can run or share.
Now let's get detailed information about the App image we just built using the docker app image inspect command. Note that the --pretty option allows to get a human friendly output rather than the default JSON output.
$ docker app image inspect myrepo/hello-world:0.1.0 --pretty
version: 0.1.0
name: hello-world
description: This is an Hello World example
maintainers:
- name: user
email: user@email.com
SERVICE REPLICAS PORTS IMAGE
hello 1 8080 docker.io/hashicorp/http-echo:latest@sha256:ba27d460cd1f22a1a4331bdf74f4fccbc025552357e8a3249c40ae216275de96
PARAMETER VALUE
port 8080
text Hello, World!Share your App image by pushing it to a container registry such as Docker Hub.
$ docker app push myrepo/hello:0.1.0Now run your App:
$ docker app run myrepo/hello:0.1.0 --name myhelloworld
Creating network myhelloworld_default
Creating service myhelloworld_hello
App "myhelloworld" running on context "default"You can specify the Docker endpoint where an application is installed using a context. By default, your App will run on the currently active context. You can select another context with the docker context use command, and the docker app run command will thereafter run your app on this particular context.
Next, you can check the list of running Apps:
$ docker app ls
RUNNING APP APP NAME LAST ACTION RESULT CREATED MODIFIED REFERENCE
myhelloworld hello-world (0.1.0) install success About a minute ago About a minute ago docker.io/myrepo/hello-world:0.1.0Finally you can get detailed information about a running App using the docker app inspect command. Note that the --pretty option allows to get a human friendly output rather than the default JSON output.
$ docker app inspect myhelloworld --pretty
Running App:
Name: myhelloworld
Created: 3 minutes ago
Modified: 3 minutes ago
Revision: 01DSQMWWABCM27K3FWSCES3H76
Last Action: install
Result: success
Ochestrator: swarm
App:
Name: hello-world
Version: 0.1.0
Image Reference: docker.io/myrepo/hello-world:0.1.0
Parameters:
port: "8080"
text: Hello, World!
ID NAME MODE REPLICAS IMAGE PORTS
mocfqnkadxw3 myhelloworld_hello replicated 1/1 hashicorp/http-echo *:8080->5678/tcpFinally, remove the current running App using the docker app rmcommand.
$ docker app rm myhelloworld
Removing service myhelloworld_hello
Removing network myhelloworld_default