diff --git a/beginner/chapters/setup.md b/beginner/chapters/setup.md index eb5c763075..170884deb5 100644 --- a/beginner/chapters/setup.md +++ b/beginner/chapters/setup.md @@ -6,10 +6,14 @@ There are no specific skills needed for this tutorial beyond a basic comfort wit ### Setting up your computer Getting all the tooling setup on your computer can be a daunting task, but getting Docker up and running on your favorite OS has become very easy. -The *getting started* guide on Docker has detailed instructions for setting up Docker on [Mac](https://docs.docker.com/docker-for-mac/), [Linux](https://docs.docker.com/engine/installation/linux/) and [Windows](https://docs.docker.com/docker-for-windows/). +The *getting started* guide on Docker has detailed instructions for setting up Docker on [Mac](https://docs.docker.com/docker-for-mac/), [Linux](https://docs.docker.com/engine/installation/linux/) and [Windows](https://docs.docker.com/docker-for-windows/). + +*If you're using Docker for Windows* make sure you have [shared your drive](https://docs.docker.com/docker-for-windows/#/shared-drives). *Important note* If you're using an older version of Windows or MacOS you may need to use [Docker Machine](https://docs.docker.com/machine/overview/) instead. +*All commandline work in either bash or Powershell on Windows* + Once you are done installing Docker, test your Docker installation by running the following: ``` $ docker run hello-world diff --git a/beginner/chapters/votingapp.md b/beginner/chapters/votingapp.md index f6c3bb4cdb..820c625374 100644 --- a/beginner/chapters/votingapp.md +++ b/beginner/chapters/votingapp.md @@ -33,15 +33,15 @@ In the folder ```example-voting-app/voting-app``` you need to edit the app.py an Edit the following lines: ``` -option_a = os.getenv('OPTION_A', "Java") -option_b = os.getenv('OPTION_B', "Python") +option_a = os.getenv('OPTION_A', "Cats") +option_b = os.getenv('OPTION_B', "Dogs") ``` substituting two options of your choice. For instance: ``` -option_a = os.getenv('OPTION_A', "Cats") -option_b = os.getenv('OPTION_B', "Dogs") +option_a = os.getenv('OPTION_A', "Java") +option_b = os.getenv('OPTION_B', ".NET") ``` #### 3.2.2 Running your app Now, run your application. To do that, we'll use [Docker Compose](https://docs.docker.com/compose). Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you define a `.yml` file that describes all the containers and volumes that you want, and the networks between them. In the example-voting-app directory, you'll see a `docker-compose.yml file`: @@ -71,9 +71,7 @@ services: - back-tier worker: - image: manomarks/worker - networks: - - back-tier + build: ./worker redis: image: redis:alpine @@ -103,10 +101,10 @@ This Compose file defines - A voting-app container based on a Python image - A result-app container based on a Node.js image - A redis container based on a redis image, to temporarily store the data. -- A Java based worker app based on a Java image +- A .NET based worker app based on a .NET image - A Postgres container based on a postgres image -Note that three of the containers are built from Dockerfiles, while the other two are images on Docker Hub. To learn more about how they're built, you can examine each of the Dockerfiles in the two directories: `voting-app`, `result-app`. We included the code for the Java worker in `worker` but pre-built the image to save on downloads. +Note that three of the containers are built from Dockerfiles, while the other two are images on Docker Hub. To learn more about how they're built, you can examine each of the Dockerfiles in the three directories: `vote`, `result`, `worker`. The Compose file also defines two networks, front-tier and back-tier. Each container is placed on one or two networks. Once on those networks, they can access other services on that network in code just by using the name of the service. To learn more about networking check out the [Networking with Compose documentation](https://docs.docker.com/compose/networking/). diff --git a/beginner/chapters/webapps.md b/beginner/chapters/webapps.md index 9c597c12d3..8a8db12fd8 100644 --- a/beginner/chapters/webapps.md +++ b/beginner/chapters/webapps.md @@ -89,8 +89,8 @@ Now that you've seen how to run a webserver inside a Docker image, how do you cr But first, let's stop and remove the containers since you won't be using them anymore. ``` -$ docker stop static-site static-site -$ docker rm static-site static-site +$ docker stop static-site +$ docker rm static-site ``` Let's use a shortcut to remove the second site: diff --git a/swarm-mode/README.md b/swarm-mode/README.md index dbd77b3bc2..44bbeff121 100644 --- a/swarm-mode/README.md +++ b/swarm-mode/README.md @@ -3,5 +3,4 @@ [Docker Swarm Mode](https://docs.docker.com/engine/swarm/) is a release candidate feature included with Docker Engine 1.12. These tutorials are designed to help you quickly get started testing these new features. * [Docker Swarm Mode full tutorial](beginner-tutorial/README.md) -* [Swarm quickstart tutorial](quickstart/README.md) -* [Service deployment on a swarm](beginner/README.md) \ No newline at end of file +* [Service deployment on a swarm in the Cloud](cloud-quick-start/README.md) diff --git a/swarm-mode/beginner-tutorial/README.md b/swarm-mode/beginner-tutorial/README.md index d83b3a5c8e..d66f7139ab 100644 --- a/swarm-mode/beginner-tutorial/README.md +++ b/swarm-mode/beginner-tutorial/README.md @@ -382,4 +382,5 @@ Successfully removed manager3 ``` ## Next steps -Next, check out the documentation on [Docker Swarm Mode](https://docs.docker.com/engine/swarm/) for more information. +We have a similar tutorial using Docker Machine to do [Service deployment on a swarm in the Cloud](../cloud-quick-start/README.md). +Also check out the documentation on [Docker Swarm Mode](https://docs.docker.com/engine/swarm/) for more information. diff --git a/swarm-mode/beginner/README.md b/swarm-mode/cloud-quick-start/README.md similarity index 99% rename from swarm-mode/beginner/README.md rename to swarm-mode/cloud-quick-start/README.md index c87cf78146..1ca6745462 100644 --- a/swarm-mode/beginner/README.md +++ b/swarm-mode/cloud-quick-start/README.md @@ -1,4 +1,4 @@ -# Service deployment on a swarm +# Service deployment on a swarm in the Cloud Script that create a swarm cluster and deploy a simple service. Swarm is created with Swarm mode of Engine 1.12. Can be created on diff --git a/swarm-mode/beginner/swarm.sh b/swarm-mode/cloud-quick-start/swarm.sh old mode 100755 new mode 100644 similarity index 97% rename from swarm-mode/beginner/swarm.sh rename to swarm-mode/cloud-quick-start/swarm.sh index 0e99439668..6bb89aeb81 --- a/swarm-mode/beginner/swarm.sh +++ b/swarm-mode/cloud-quick-start/swarm.sh @@ -1,3 +1,4 @@ +# This will run in bash on Linux, Mac, and Windows 10 Anniverary Edition # Default cluster: # - 3 manager node # - 5 worker nodes @@ -5,6 +6,7 @@ # - service image: ehazlett/docker-demo # - service port: 8080 (port exposed by the service) # - exposed port: 8080 (port exposed to the outside) + DRIVER="virtualbox" NBR_MANAGER=3 NBR_WORKER=5 @@ -82,7 +84,7 @@ while [ "$#" -gt 0 ]; do --azure-subscription-id) AZURE_SUBSCRIPTION_ID="$2" shift 2 - ;; + ;; -h|--help) usage ;; @@ -116,7 +118,7 @@ if [ "$DRIVER" == "amazonec2" ];then if [ "$EC2_SECURITY_GROUP" == "" ];then error "--amazonec2-security-group must be provided (+ make sure this one allows inter hosts communication and is has opened port $EXPOSED_PORT to the outside" fi - PERMISSION="sudo" + PERMISSION="sudo" ADDITIONAL_PARAMS="--amazonec2-access-key ${EC2_ACCESS_KEY} --amazonec2-secret-key ${EC2_SECRET_KEY} --amazonec2-security-group ${EC2_SECURITY_GROUP} --amazonec2-security-group docker-machine --amazonec2-region eu-west-1 --amazonec2-instance-type t2.micro --amazonec2-ami ami-f95ef58a --engine-install-url=https://test.docker.com" echo "-> about to create a swarm with $NBR_MANAGER manager(s) and $NBR_WORKER workers on $DRIVER machines (eu-west-1 / t2.micro / Ubuntu 14.04)" fi @@ -126,12 +128,12 @@ if [ "$DRIVER" == "azure" ];then if [ "$AZURE_SUBSCRIPTION_ID" == "" ];then error "--azure-subscription-id must be provided" fi - # For Azure Storage Container the Manager and Worker prefix must be lowercase + # For Azure Storage Container the Manager and Worker prefix must be lowercase PREFIX=$(date "+%Y%m%dt%H%M%S") MANAGER=${PREFIX}-manager WORKER=${PREFIX}-worker - PERMISSION="sudo" + PERMISSION="sudo" ADDITIONAL_PARAMS="--driver azure --azure-subscription-id ${AZURE_SUBSCRIPTION_ID} --azure-open-port ${EXPOSED_PORT}" echo "-> about to create a swarm with $NBR_MANAGER manager(s) and $NBR_WORKER workers on $DRIVER machines (westus / Standard_A2 / Ubuntu 15.10)" fi @@ -153,7 +155,7 @@ function getIP { echo $(docker-machine inspect -f '{{ .Driver.PrivateIPAddress }}' $1) elif [ "$DRIVER" == "azure" ]; then echo $(docker-machine ssh $1 ifconfig eth0 | awk '/inet addr/{print substr($2,6)}') - else + else echo $(docker-machine inspect -f '{{ .Driver.IPAddress }}' $1) fi } @@ -176,10 +178,10 @@ function get_worker_token { function create_manager { for i in $(seq 1 $NBR_MANAGER); do echo "-> creating Docker host for manager $i (please wait)" - # Azure needs Stdout for authentication. Workaround: Show Stdout on first Manager. + # Azure needs Stdout for authentication. Workaround: Show Stdout on first Manager. if [ "$DRIVER" == "azure" ] && [ "$i" -eq 1 ];then docker-machine create --driver $DRIVER $ADDITIONAL_PARAMS ${MANAGER}$i - else + else docker-machine create --driver $DRIVER $ADDITIONAL_PARAMS ${MANAGER}$i 1>/dev/null fi done @@ -204,7 +206,7 @@ function join_other_managers { if [ "$((NBR_MANAGER-1))" -ge "1" ];then for i in $(seq 2 $NBR_MANAGER);do echo "-> ${MANAGER}$i requests membership to the swarm" - docker-machine ssh ${MANAGER}$i $PERMISSION docker swarm join --token $(get_manager_token) --listen-addr $(getIP ${MANAGER}$i):2377 --advertise-addr $(getIP ${MANAGER}$i):2377 $(getIP ${MANAGER}1):2377 2>&1 + docker-machine ssh ${MANAGER}$i $PERMISSION docker swarm join --token $(get_manager_token) --listen-addr $(getIP ${MANAGER}$i):2377 --advertise-addr $(getIP ${MANAGER}$i):2377 $(getIP ${MANAGER}1):2377 2>&1 done fi } @@ -249,7 +251,7 @@ function status { echo "-> list tasks" echo docker-machine ssh ${MANAGER}1 $PERMISSION docker service ps demo - echo + echo echo "-> list machines" docker-machine ls | egrep $PREFIX echo diff --git a/swarm-mode/quickstart/README.md b/swarm-mode/quickstart/README.md deleted file mode 100644 index 411583efbc..0000000000 --- a/swarm-mode/quickstart/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# docker swarm - -Get in touch with the new `docker swarm` feature in Docker 1.12. - -## Build a local swarm with Docker Machine - -To create a local swarm with Docker Machine use the following script - -```bash -./buildswarm-vbox.sh -``` - -It will create two VirtualBox machines `sw01` and `sw02`. The machine `sw01` is -the swarm manager, the machine `sw02` joins the swarm. - -To run further commands, just login to the machine `sw01` with - -```bash -docker-machine ssh sw01 -``` - -or run each command through ssh, eg. - -```bash -docker-machine ssh sw01 docker node ls -ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS LEADER -0j9p42jcyur9a * sw01 Accepted Ready Active Reachable Yes -16cznbhxupre5 sw02 Accepted Ready Active -``` - -### Remote swarm with Docker Machine at DigitalOcean - -To build a multi machine swarm at DigitalOcean, run this script with your token. - -```bash -DO_TOKEN=xxxx ./buildswarm-do.sh -``` - -Then control your swarm with commands on your swarm manager node - -```bash -docker-machine ssh do-sw01 docker node ls -``` diff --git a/swarm-mode/quickstart/buildswarm-do.sh b/swarm-mode/quickstart/buildswarm-do.sh deleted file mode 100755 index de24cd026f..0000000000 --- a/swarm-mode/quickstart/buildswarm-do.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -SIZE=2gb -REGION=ams2 -IMAGE=ubuntu-15-10-x64 - -PREFIX=do - -# create swarm manager -docker-machine create \ - --driver=digitalocean \ - --digitalocean-access-token=${DO_TOKEN} \ - --digitalocean-size=${SIZE} \ - --digitalocean-region=${REGION} \ - --digitalocean-private-networking=true \ - --digitalocean-image=${IMAGE} \ - --engine-install-url=https://test.docker.com \ - ${PREFIX}-sw01 -docker-machine ssh ${PREFIX}-sw01 docker swarm init --listen-addr $(docker-machine ip ${PREFIX}-sw01):2377 - -# create another swarm node -docker-machine create \ - --driver=digitalocean \ - --digitalocean-access-token=${DO_TOKEN} \ - --digitalocean-size=${SIZE} \ - --digitalocean-region=${REGION} \ - --digitalocean-private-networking=true \ - --digitalocean-image=${IMAGE} \ - --engine-install-url=https://test.docker.com \ - ${PREFIX}-sw02 -docker-machine ssh ${PREFIX}-sw02 docker swarm join --listen-addr $(docker-machine ip ${PREFIX}-sw02):2377 $(docker-machine ip ${PREFIX}-sw01):2377 - -# list nodes -docker-machine ssh ${PREFIX}-sw01 docker node ls diff --git a/swarm-mode/quickstart/buildswarm-vbox.sh b/swarm-mode/quickstart/buildswarm-vbox.sh deleted file mode 100755 index 52fb648899..0000000000 --- a/swarm-mode/quickstart/buildswarm-vbox.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash - -# Swarm mode using Docker Machine - -managers=3 -workers=3 - -# create manager machines -echo "======> Creating $managers manager machines ..."; -for node in $(seq 1 $managers); -do - echo "======> Creating manager$node machine ..."; - docker-machine create -d virtualbox manager$node; -done - -# create worker machines -echo "======> Creating $workers worker machines ..."; -for node in $(seq 1 $workers); -do - echo "======> Creating worker$node machine ..."; - docker-machine create -d virtualbox worker$node; -done - -# list all machines -docker-machine ls - -# initialize swarm mode and create a manager -echo "======> Initializing first swarm manager ..." -docker-machine ssh manager1 "docker swarm init --listen-addr $(docker-machine ip manager1) --advertise-addr $(docker-machine ip manager1)" - -# get manager and worker tokens -export manager_token=`docker-machine ssh manager1 "docker swarm join-token manager -q"` -export worker_token=`docker-machine ssh manager1 "docker swarm join-token worker -q"` - -echo "manager_token: $manager_token" -echo "worker_token: $worker_token" - -# other masters join swarm -for node in $(seq 2 $managers); -do - echo "======> manager$node joining swarm as manager ..." - docker-machine ssh manager$node \ - "docker swarm join \ - --token $manager_token \ - --listen-addr $(docker-machine ip manager$node) \ - --advertise-addr $(docker-machine ip manager$node) \ - $(docker-machine ip manager1)" -done - -# show members of swarm -docker-machine ssh manager1 "docker node ls" - -# workers join swarm -for node in $(seq 1 $workers); -do - echo "======> worker$node joining swarm as worker ..." - docker-machine ssh worker$node \ - "docker swarm join \ - --token $worker_token \ - --listen-addr $(docker-machine ip worker$node) \ - --advertise-addr $(docker-machine ip worker$node) \ - $(docker-machine ip manager1):2377" -done - -# show members of swarm -docker-machine ssh manager1 "docker node ls" - -# Cleanup -# # Stop machines -# docker-machine stop worker1 worker2 worker3 manager1 manager2 manager3 - -# # remove machines -# docker-machine rm worker1 worker2 worker3 manager1 manager2 manager3 -