github.com/simonferquel/app@v0.6.1-0.20181012141724-68b7cccf26ac/examples/voting-app/README.md (about)

     1  ## The Docker voting app
     2  
     3  ### Initialize project
     4  
     5  In this example, we will create an app from the existing Docker sample `example-voting-app`. First download the `docker-stack.yml` [here](https://github.com/dockersamples/example-voting-app) ([direct link](https://raw.githubusercontent.com/dockersamples/example-voting-app/master/docker-stack.yml)
     6  
     7  Initialize the project using `docker-app init voting-app --compose-file docker-stack.yml`.
     8  
     9  ### Edit metadata
    10  
    11  Go to `voting-app.dockerapp/` and open `metadata.yml` and fill the following fields:
    12  - description
    13  - maintainers
    14  - namespace
    15  
    16  ### Add variables to the compose file
    17  
    18  Open `docker-compose.yml` and start by changing the version to `3.2` (generated docker-compose are version 3.2+ compatible). Change constants you want by variables, e.g.:
    19  
    20  Change the images used, from:
    21  - `dockersamples/examplevotingapp_vote:before` to `${vote.image.name}:${vote.image.tag}`
    22  - `dockersamples/examplevotingapp_result:before` to `${result.image.name}:${result.image.tag}`
    23  - `dockersamples/examplevotingapp_worker:before` to `${worker.image.name}:${worker.image.tag}`
    24  - `dockersamples/examplevotingapp_visualizer:before` to `${visualizer.image.name}:${visualizer.image.tag}`
    25  
    26  Change exposed ports, from:
    27  - `<value:5000>` to `${vote.port}`
    28  - `<value:5001>` to `${result.port}`
    29  - `<value:8080>` to `${visualizer.port}`
    30  
    31  Change default replicas, from:
    32  - `<value:2>` to `${vote.replicas}`
    33  - `<value:1>` to `${result.replicas}`
    34  - `<value:1>` to `${worker.replicas}`
    35  
    36  ---
    37  
    38  [voting-app.dockerapp/docker-compose.yml](voting-app.dockerapp/docker-compose.yml):
    39  ```yml
    40  [...]
    41    vote:
    42      image: ${vote.image.name}:${vote.image.tag}
    43      ports:
    44        - ${vote.port}:80
    45      networks:
    46        - frontend
    47      depends_on:
    48        - redis
    49      deploy:
    50        replicas: ${vote.replicas}
    51        update_config:
    52          parallelism: 2
    53        restart_policy:
    54          condition: on-failure
    55  
    56    result:
    57      image: ${result.image.name}:${result.image.tag}
    58      ports:
    59        - ${result.port}:80
    60      networks:
    61        - backend
    62      depends_on:
    63        - db
    64      deploy:
    65        replicas: ${result.replicas}
    66        update_config:
    67          parallelism: 2
    68          delay: 10s
    69        restart_policy:
    70          condition: on-failure
    71  
    72    worker:
    73      image: ${worker.image.name}:${worker.image.tag}
    74      networks:
    75        - frontend
    76        - backend
    77      deploy:
    78        mode: replicated
    79        replicas: ${worker.replicas}
    80        labels: [APP=VOTING]
    81        restart_policy:
    82          condition: on-failure
    83          delay: 10s
    84          max_attempts: 3
    85          window: 120s
    86        placement:
    87          constraints: [node.role == manager]
    88  
    89    visualizer:
    90      image: ${visualizer.image.name}:${visualizer.image.tag}
    91      ports:
    92        - ${visualizer.port}:8080
    93      stop_grace_period: 1m30s
    94      volumes:
    95        - "/var/run/docker.sock:/var/run/docker.sock"
    96      deploy:
    97        placement:
    98          constraints: [node.role == manager]
    99  [...]
   100  ```
   101  
   102  ### Give variables their default value
   103  
   104  Open `settings.yml` and add every variables with the default value you want, e.g.:
   105  
   106  ---
   107  
   108  [voting-app.dockerapp/settings.yml](voting-app.dockerapp/settings.yml):
   109  ```yml
   110  # Vote.
   111  vote:
   112    image:
   113      name: dockersamples/examplevotingapp_vote
   114      tag: latest
   115    port: 8080
   116    replicas: 1
   117  
   118  # Result.
   119  result:
   120    image:
   121      name: dockersamples/examplevotingapp_result
   122      tag: latest
   123    port: 8181
   124    replicas: 1
   125  
   126  # Visualizer.
   127  visualizer:
   128    image:
   129      name: dockersamples/visualizer
   130      tag: latest
   131    port: 8282
   132  
   133  # Worker.
   134  worker:
   135    image:
   136      name: dockersamples/examplevotingapp_worker
   137      tag: latest
   138    replicas: 1
   139  ```
   140  
   141  Test your application by running `docker-app render`.
   142  
   143  ### Add settings for production and development environments
   144  
   145  Create `settings/development.yml` and `settings/production.yml` and add your target-specific variables.
   146  
   147  ---
   148  
   149  [voting-app.dockerapp/settings/development.yml](voting-app.dockerapp/settings/development.yml):
   150  ```yml
   151  # Vote.
   152  vote:
   153    image:
   154      name: vote
   155  
   156  # Result.
   157  result:
   158    image:
   159      name: result
   160  ```
   161  ---
   162  
   163  [voting-app.dockerapp/settings/production.yml](voting-app.dockerapp/settings/production.yml):
   164  ```yml
   165  # Vote.
   166  vote:
   167    port: 80
   168    replicas: 3
   169  
   170  # Result.
   171  result:
   172    port: 80
   173    replicas: 5
   174  ```
   175  
   176  ### Wrap everything in a Makefile
   177  
   178  Add a Makefile to simplify rendering, deploying and killing your app, see [Makefile](Makefile).