github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/examples/dockercoins/README.md (about) 1 # Example: Dockercoins 2 3 In this example, we will create a Docker App where service images are built along with the App image. 4 5 The [dockercoins](https://github.com/dockersamples/dockercoins) demo application is made up of five services: 6 7 * `rng` is a web service generating random bytes 8 * `hasher` is a web service computing hash of POSTed data 9 * `worker` is a background process using rng and hasher 10 * `webui` is the web interface to watch progress 11 * `redis` is handling storage 12 13 ## App Definition 14 15 The App definition for this example is ready to use and can be found in the [coins.dockerapp](coins.dockerapp) directory in this folder. 16 17 Open the `coins.dockerapp/docker-compose.yml` file in a text editor: 18 19 ```yaml 20 version: "3.7" 21 22 services: 23 rng: 24 build: rng 25 ports: 26 - "${rng.port}:80" 27 28 hasher: 29 build: hasher 30 ports: 31 - "${hasher.port}:80" 32 33 webui: 34 build: webui 35 ports: 36 - "${webui.port}:80" 37 38 redis: 39 image: redis 40 41 worker: 42 build: worker 43 ``` 44 45 You can notice that the `rng`, `webui`, `hasher` and `worker` services all have a `build` field, i.e. each service has a Dockerfile describing how the service image must be built. 46 47 ```shell 48 ├── coins.dockerapp 49 │ ├── docker-compose.yml 50 │ ├── metadata.yml 51 │ └── parameters.yml 52 ├── hasher 53 │ ├── Dockerfile 54 │ └── hasher.rb 55 ├── rng 56 │ ├── Dockerfile 57 │ └── rng.py 58 ├── webui 59 │ ├── Dockerfile 60 │ ├── files 61 │ │ ├── d3.min.js 62 │ │ ├── index.html 63 │ │ ├── jquery-1.11.3.min.js 64 │ │ ├── jquery.js -> jquery-1.11.3.min.js 65 │ │ ├── rickshaw.min.css 66 │ │ └── rickshaw.min.js 67 │ └── webui.js 68 └── worker 69 ├── Dockerfile 70 └── worker.py 71 ``` 72 73 ## App Image 74 75 Now we are going to build an App image from this App definition. At build time, Docker App is going to build each service image then build the App image embedding the service images. 76 77 ```shell 78 $ docker app build -f coins.dockerapp -t myrepo/coins:0.1.0 . 79 [+] Building 10.5s (37/37) FINISHED 80 => [rng internal] load build definition from Dockerfile 0.0s 81 (...) (some build output) 82 => [webui internal] load build definition from Dockerfile 0.1s 83 => [hasher internal] load build definition from Dockerfile 0.1s 84 => [worker internal] load build definition from Dockerfile 0.1s 85 (...) (rest of build output) 86 sha256:ee61121d6bff0266404cc0077599c1ef7130289fec721 87 ``` 88 89 If you browse the `docker app build` command output, you will see that: 90 * the `rng`, `webui`, `hasher` and `worker` service images have been built from a Dockerfile 91 * if you don't have it already loacally, the `redis` image will be pulled 92 93 ## Running App 94 95 You can now run this App using the `docker app run` command. 96 97 ```shell 98 $ docker app run myrepo/coins:0.1.0 99 Creating network dreamy_albattani_default 100 Creating service dreamy_albattani_hasher 101 Creating service dreamy_albattani_webui 102 Creating service dreamy_albattani_redis 103 Creating service dreamy_albattani_worker 104 Creating service dreamy_albattani_rng 105 App "dreamy_albattani" running on context "default" 106 ``` 107 108 *Note: if you don't pass the `--name` flag to the `docker app run` command, a name for the running App will be automatically generated.* 109 110 You list the running Apps using the `docker app ls` command. 111 112 ```shell 113 $ docker app ls 114 RUNNING APP APP NAME LAST ACTION RESULT CREATED MODIFIED REFERENCE 115 dreamy_albattani coins (0.1.0) install success About a minute ago About a minute ago docker.io/myrepo/coins:0.1.0 116 ``` 117 118 ## Inspect the running App 119 120 Get detailed information about the 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. 121 122 ```shell 123 $ docker app inspect dreamy_albattani --pretty 124 Running App: 125 Name: dreamy_albattani 126 Created: 3 minutes ago 127 Modified: 3 minutes ago 128 Revision: 01DT9CAEJ6TY48YMRKB4EWW357 129 Last Action: install 130 Result: success 131 132 App: 133 Name: coins 134 Version: 0.1.0 135 Image Reference: docker.io/myrepo/coins:0.1.0 136 137 Parameters: 138 hasher.port: "8002" 139 rng.port: "8001" 140 webui.port: "8000" 141 142 ID NAME MODE REPLICAS IMAGE PORTS 143 adpmt82ejfrm dreamy_albattani_worker replicated 1/1 sha256:8c016797b7042227d224ce058ed099f3838904a8f8a259d0e000440851c648a1 144 r5a8ukf2j17a dreamy_albattani_redis replicated 1/1 redis 145 sffx1pe1b04u dreamy_albattani_hasher replicated 1/1 sha256:7ab1468f5e2b6ff8ece16b56832fa6b3547bf71375b6d71c55211e2dbe24ba11 *:8002->80/tcp 146 uk8cixh15pob dreamy_albattani_webui replicated 1/1 sha256:75279ded158d53fc69ef7570f3e8d5e2646479bb50ddf03b9b06d24d39815ce3 *:8000->80/tcp 147 ypx32ze6b0wt dreamy_albattani_rng replicated 1/1 sha256:9bc51dbbbdffb342468289b5bf8ad411fe2d6bdbac044cc69075c33df54919a2 *:8001->80/tcp 148 ``` 149 150 ## Remove running App and App image 151 152 Now, let's remove the running App. 153 154 ```shell 155 $ docker app rm dreamy_albattani 156 Removing service dreamy_albattani_hasher 157 Removing service dreamy_albattani_redis 158 Removing service dreamy_albattani_rng 159 Removing service dreamy_albattani_webui 160 Removing service dreamy_albattani_worker 161 Removing network dreamy_albattani_default 162 ``` 163 164 And finally, let's remove the App image. 165 166 ```shell 167 $ docker app image rm myrepo/coins:0.1.0 168 Deleted: myrepo/coins:0.1.0 169 ```