diff --git a/engine/getstarted-voting-app/images/visualizer-2.png b/engine/getstarted-voting-app/images/visualizer-2.png new file mode 100644 index 0000000000..6b72856039 Binary files /dev/null and b/engine/getstarted-voting-app/images/visualizer-2.png differ diff --git a/engine/getstarted-voting-app/images/visualizer.png b/engine/getstarted-voting-app/images/visualizer.png new file mode 100644 index 0000000000..3b027b4c53 Binary files /dev/null and b/engine/getstarted-voting-app/images/visualizer.png differ diff --git a/engine/getstarted-voting-app/images/vote-results.png b/engine/getstarted-voting-app/images/vote-results.png new file mode 100644 index 0000000000..8dcbb20cf7 Binary files /dev/null and b/engine/getstarted-voting-app/images/vote-results.png differ diff --git a/engine/getstarted-voting-app/images/vote.png b/engine/getstarted-voting-app/images/vote.png new file mode 100644 index 0000000000..0a5b25efc0 Binary files /dev/null and b/engine/getstarted-voting-app/images/vote.png differ diff --git a/engine/getstarted-voting-app/index.md b/engine/getstarted-voting-app/index.md index 805e74ccab..0d7af91ef9 100644 --- a/engine/getstarted-voting-app/index.md +++ b/engine/getstarted-voting-app/index.md @@ -38,8 +38,282 @@ The voting app you are about to deploy is composed of several services: Each service will run in its own container. Using swarm mode, we can also scale the application to deploy replicas of containerized services distributed across multiple nodes. +## docker-stack.yml For this tutorial, you need only have Docker running and the copy of `docker-stack.yml` we provide here. +This file defines all the services, their base images, and provides . You will use this file to deploy the app. + +``` +version: "3" +services: + + redis: + image: redis:alpine + ports: + - "6379" + networks: + - frontend + deploy: + replicas: 2 + update_config: + parallelism: 2 + delay: 10s + restart_policy: + condition: on-failure + db: + image: postgres:9.4 + volumes: + - db-data:/var/lib/postgresql/data + networks: + - backend + deploy: + placement: + constraints: [node.role == manager] + vote: + image: dockersamples/examplevotingapp_vote:before + ports: + - 5000:80 + networks: + - frontend + depends_on: + - redis + deploy: + replicas: 2 + update_config: + parallelism: 2 + restart_policy: + condition: on-failure + result: + image: dockersamples/examplevotingapp_result:before + ports: + - 5001:80 + networks: + - backend + depends_on: + - db + deploy: + replicas: 2 + update_config: + parallelism: 2 + delay: 10s + restart_policy: + condition: on-failure + + worker: + image: dockersamples/examplevotingapp_worker + networks: + - frontend + - backend + deploy: + mode: replicated + replicas: 1 + labels: [APP=VOTING] + restart_policy: + condition: on-failure + delay: 10s + max_attempts: 3 + window: 120s + + visualizer: + image: dockersamples/visualizer:stable + ports: + - "8080:8080" + stop_grace_period: 1m30s + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + +networks: + frontend: + backend: + +volumes: + db-data: +``` + +## Set up Dockerized hosts + +1. Create `manager1` and `worker1` machines: + + ``` + $ docker-machine create --driver virtualbox manager1 + Running pre-create checks... + Creating machine... + (manager1) Copying /Users/victoriabialas/.docker/machine/cache/boot2docker.iso to /Users/victoriabialas/.docker/machine/machines/manager1/boot2docker.iso... + (manager1) Creating VirtualBox VM... + (manager1) Creating SSH key... + (manager1) Starting the VM... + (manager1) Check network to re-create if needed... + (manager1) Waiting for an IP... + Waiting for machine to be running, this may take a few minutes... + Detecting operating system of created instance... + Waiting for SSH to be available... + Detecting the provisioner... + Provisioning with boot2docker... + Copying certs to the local machine directory... + Copying certs to the remote machine... + Setting Docker configuration on the remote daemon... + Checking connection to Docker... + Docker is up and running! + To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env manager1 + ``` + +2. Get the IP addresses of the machines. + + ``` + $ docker-machine ls + NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS + manager1 * virtualbox Running tcp://192.168.99.100:2376 v1.13.0-rc6 + worker1 - virtualbox Running tcp://192.168.99.101:2376 v1.13.0-rc6 + ``` + +## Create a swarm + +1. Log on to the manager. + + ``` + $ docker-machine ssh manager + ## . + ## ## ## == + ## ## ## ## ## === + /"""""""""""""""""\___/ === + ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ + \______ o __/ + \ \ __/ + \____\_______/ + _ _ ____ _ _ + | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ + | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| + | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | + |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| + + WARNING: this is a build from test.docker.com, not a stable release. + + Boot2Docker version 1.13.0-rc6, build HEAD : 5ab2289 - Wed Jan 11 23:37:52 UTC 2017 + Docker version 1.13.0-rc6, build 2f2d055 + ``` + +2. Initialize a swarm. + + ``` + docker@manager:~$ docker swarm init --advertise-addr 192.168.99.100 + Swarm initialized: current node (ro5ak9ybe5qa62h7r81q29z0k) is now a manager. + + To add a worker to this swarm, run the following command: + + docker swarm join \ + --token SWMTKN-1-4bk4romozl9ap5xpt0it6gzdwabtezs399go3fyaw1hy8t1kam-0xnovvmchc4wfe7xmh85faiwe \ + 192.168.99.100:2377 + + To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. + ``` + +### Add a worker node to the swarm + +1. Log into the worker machine. + + ``` + $ docker-machine ssh worker + ## . + ## ## ## == + ## ## ## ## ## === + /"""""""""""""""""\___/ === + ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ + \______ o __/ + \ \ __/ + \____\_______/ + _ _ ____ _ _ + | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ + | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| + | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | + |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| + + WARNING: this is a build from test.docker.com, not a stable release. + + Boot2Docker version 1.13.0-rc6, build HEAD : 5ab2289 - Wed Jan 11 23:37:52 UTC 2017 + Docker version 1.13.0-rc6, build 2f2d055 + ``` + +2. On the worker, run the join command given as the output of the `swarm init` command you ran on the manager. + + ``` + docker@worker:~$ docker swarm join \ + > --token SWMTKN-1-4bk4romozl9ap5xpt0it6gzdwabtezs399go3fyaw1hy8t1kam-0xnovvmchc4wfe7xmh85faiwe \ + > 192.168.99.100:2377 + This node joined a swarm as a worker. + ``` + +If you don't have the command, run `docker swarm join-token worker` on a manager node to retrieve the join command for a worker for this swarm. + + +### List the nodes in the swarm + +Log into the manager and run `docker node ls`. + +``` +docker@manager:~$ docker node ls +ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS +dlosx9b74cgu4lh2qy54ebfp8 worker Ready Active +ro5ak9ybe5qa62h7r81q29z0k * manager Ready Active Leader +``` + +## Deploy the app + +In these steps, you'll use the `docker-stack.yml` file to deploy the application to the swarm you just created. To deploy an app deployed to a swarm You'll run the deploy command from the manager. + +The `docker-stack.yml` file must be located on a manager for the swarm where you want to deploy the application stack. + +1. Get `docker-stack.yml` either from the lab or by copying it from the example given here. + +2. Copy `docker-stack.yml` from your host machine onto the manager. + + ``` + $ docker-machine scp ~/sandbox/voting-app/docker-stack.yml manager:/home/docker/. + docker-stack.yml 100% 1558 1.5KB/s 00:00 + ``` + +3. Log onto the manager. + + ``` + $ docker-machine ssh manager1 + ``` + +4. Check to make sure the `.yml` file is there. + + ``` + docker@manager:~$ ls + docker-stack.yml log.log + ``` + + You can use `vi` or other text editor to inspect it. + +5. Deploy the application stack based on the `.yml`. + + ``` + docker@manager:~$ docker stack deploy --compose-file docker-stack.yml vote + Creating network vote_default + Creating network vote_backend + Creating network vote_frontend + Creating service vote_result + Creating service vote_worker + Creating service vote_visualizer + Creating service vote_redis + Creating service vote_db + Creating service vote_vote + ``` + +6. Verify that the stack deployed as expected with `docker stack services `. + + ``` + docker@manager:~$ docker stack services vote + ID NAME MODE REPLICAS IMAGE + 0y3q6lgc0drn vote_result replicated 2/2 dockersamples/examplevotingapp_result:before + fvsaqvuec4yw vote_redis replicated 2/2 redis:alpine + igev2xk5s3zo vote_worker replicated 1/1 dockersamples/examplevotingapp_worker:latest + vpfjr9b0qc01 vote_visualizer replicated 1/1 dockersamples/visualizer:stable + wctxjnwl22k4 vote_vote replicated 2/2 dockersamples/examplevotingapp_vote:before + zp0zyvgaguox vote_db replicated 1/1 postgres:9.4 + ``` + ## Next topic TBD