Skip to content

Commit 6c525c3

Browse files
committed
avoid jq requirement in swarm example
1 parent b2993bc commit 6c525c3

File tree

1 file changed

+109
-94
lines changed

1 file changed

+109
-94
lines changed

README.md

Lines changed: 109 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,6 @@ You will need a Linode APIv4 Personal Access Token. Get one here: <https://deve
4646
docker-machine create -d linode --linode-token=<linode-token> --linode-root-pass=<linode-root-pass> linode
4747
```
4848

49-
### Full Example
50-
51-
```bash
52-
LINODE_TOKEN=e332cf8e1a78427f1368a5a0a67946ad1e7c8e28e332cf8e1a78427f1368a5a0 # Should be 65 lowercase hex chars
53-
LINODE_ROOT_PASSWORD=$(openssl rand -base64 32); echo Password for root: $LINODE_ROOT_PASSWORD
54-
55-
docker-machine create -d linode --linode-token=$LINODE_TOKEN --linode-root-pass=$LINODE_ROOT_PASSWORD linode
56-
eval $(docker-machine env linode)
57-
docker run --rm -it debian bash
58-
```
59-
60-
```bash
61-
$ docker-machine ls
62-
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
63-
linode * linode Running tcp://45.79.139.196:2376 v18.05.0-ce
64-
65-
$ docker-machine rm linode
66-
About to remove linode
67-
WARNING: This action will delete both local reference and remote instance.
68-
Are you sure? (y/n): y
69-
(default) Removing linode: 8753395
70-
Successfully removed linode
71-
```
72-
7349
### Options
7450

7551
| Argument | Env | Default | Description
@@ -97,85 +73,124 @@ Detailed run output will be emitted when using the LinodeGo `LINODE_DEBUG=1` opt
9773
LINODE_DEBUG=1 docker-machine --debug create -d linode --linode-token=$LINODE_TOKEN --linode-root-pass=$ROOT_PASS machinename
9874
```
9975

100-
## Provisioning Docker Swarm
101-
102-
Let's create a docker swarm with master and worker node using private networking. Before starting make sure you have `docker-machine` and `jq` installed.
76+
## Examples
10377

104-
1. Create install.sh bash script and replace LINODE_TOKEN with your actual linode access token.
105-
```sh
106-
#!/bin/bash
107-
set -e
78+
### Simple Example
10879

109-
LINODE_TOKEN=<YOUR LINODE TOKEN>
80+
```bash
81+
LINODE_TOKEN=e332cf8e1a78427f1368a5a0a67946ad1e7c8e28e332cf8e1a78427f1368a5a0 # Should be 65 lowercase hex chars
11082
LINODE_ROOT_PASSWORD=$(openssl rand -base64 32); echo Password for root: $LINODE_ROOT_PASSWORD
111-
LINODE_REGION=eu-central
112-
113-
create_node() {
114-
local name=$1
115-
docker-machine create \
116-
-d linode \
117-
--linode-label=$name \
118-
--linode-instance-type=g6-nanode-1 \
119-
--linode-image=linode/ubuntu18.04 \
120-
--linode-region=$LINODE_REGION \
121-
--linode-token=$LINODE_TOKEN \
122-
--linode-root-pass=$LINODE_ROOT_PASSWORD \
123-
--linode-create-private-ip \
124-
$name
125-
}
126-
127-
get_private_ip() {
128-
local name=$1
129-
echo $(docker-machine inspect $name | jq -r '.Driver.PrivateIPAddress')
130-
}
131-
132-
init_swarm_master() {
133-
local name=$1
134-
local ip=$(get_private_ip $name)
135-
docker-machine ssh $name "docker swarm init --advertise-addr ${ip}"
136-
}
137-
138-
init_swarm_worker() {
139-
local master_name=$1
140-
local worker_name=$2
141-
local master_addr=$(get_private_ip $master_name):2377
142-
local join_token=$(docker-machine ssh $master_name "docker swarm \join-token worker -q")
143-
docker-machine ssh $worker_name "docker swarm join --token=${join_token} ${master_addr}"
144-
}
145-
146-
# create master node
147-
create_node master01
148-
149-
# create worker node
150-
create_node worker01
151-
152-
# init swarm master
153-
init_swarm_master master01
154-
155-
# init swarm worker
156-
init_swarm_worker master01 worker01
157-
```
158-
159-
2. After provision is successful check docker swarm status.
16083

161-
```sh
162-
docker-machine ssh master01 "docker node ls"
84+
docker-machine create -d linode --linode-token=$LINODE_TOKEN --linode-root-pass=$LINODE_ROOT_PASSWORD linode
85+
eval $(docker-machine env linode)
86+
docker run --rm -it debian bash
16387
```
16488

165-
Output should show active swarm leader and worker.
89+
```bash
90+
$ docker-machine ls
91+
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
92+
linode * linode Running tcp://45.79.139.196:2376 v18.05.0-ce
16693

167-
```
168-
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
169-
f8x7zutegt2dn1imeiw56v9hc * master01 Ready Active Leader 18.09.0
170-
ja8b3ut6uaivz5hf98gah469y worker01 Ready Active 18.09.0
94+
$ docker-machine rm linode
95+
About to remove linode
96+
WARNING: This action will delete both local reference and remote instance.
97+
Are you sure? (y/n): y
98+
(default) Removing linode: 8753395
99+
Successfully removed linode
171100
```
172101

173-
3. Cleanup resources
174-
175-
```sh
176-
docker-machine rm worker01 -y
177-
docker-machine rm master01 -y
178-
```
102+
### Provisioning Docker Swarm
103+
104+
The following script serves as an example for creating a [Docker Swarm](https://docs.docker.com/engine/swarm/) with master and worker nodes using the Linode Docker machine driver and private networking.
105+
106+
This script is provided for demonstrative use. A production swarm environment would require hardening.
107+
108+
1. Create an `install.sh` bash script using the source below. Run `bash install.sh` and provide a Linode APIv4 Token when prompted.
109+
110+
```sh
111+
#!/bin/bash
112+
set -e
113+
114+
read -p "Linode Token: " LINODE_TOKEN
115+
# LINODE_TOKEN=...
116+
LINODE_ROOT_PASSWORD=$(openssl rand -base64 32); echo Password for root: $LINODE_ROOT_PASSWORD
117+
LINODE_REGION=eu-central
118+
119+
create_node() {
120+
local name=$1
121+
docker-machine create \
122+
-d linode \
123+
--linode-label=$name \
124+
--linode-instance-type=g6-nanode-1 \
125+
--linode-image=linode/ubuntu18.04 \
126+
--linode-region=$LINODE_REGION \
127+
--linode-token=$LINODE_TOKEN \
128+
--linode-root-pass=$LINODE_ROOT_PASSWORD \
129+
--linode-create-private-ip \
130+
$name
131+
}
132+
133+
get_private_ip() {
134+
local name=$1
135+
docker-machine inspect -f '{{.Driver.PrivateIPAddress}}' $name
136+
}
137+
138+
init_swarm_master() {
139+
local name=$1
140+
local ip=$(get_private_ip $name)
141+
docker-machine ssh $name "docker swarm init --advertise-addr ${ip}"
142+
}
143+
144+
init_swarm_worker() {
145+
local master_name=$1
146+
local worker_name=$2
147+
local master_addr=$(get_private_ip $master_name):2377
148+
local join_token=$(docker-machine ssh $master_name "docker swarm join-token worker -q")
149+
docker-machine ssh $worker_name "docker swarm join --token=${join_token} ${master_addr}"
150+
}
151+
152+
# create master node
153+
create_node master01
154+
155+
# create worker node
156+
create_node worker01
157+
158+
# init swarm master
159+
init_swarm_master master01
160+
161+
# init swarm worker
162+
init_swarm_worker master01 worker01
163+
```
164+
165+
1. After provisioning succeeds, check the Docker Swarm status. The output should show active an swarm leader and worker.
166+
167+
```sh
168+
$ eval $(docker-machine env master01)
169+
$ docker node ls
170+
171+
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
172+
f8x7zutegt2dn1imeiw56v9hc * master01 Ready Active Leader 18.09.0
173+
ja8b3ut6uaivz5hf98gah469y worker01 Ready Active 18.09.0
174+
```
175+
176+
1. [Create and scale Docker services](https://docs.docker.com/engine/reference/commandline/service_create/) (left as an excercise for the reader).
177+
178+
```bash
179+
$ docker service create --name my-service --replicas 3 nginx:alpine
180+
$ docker node ps master01 worker01
181+
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
182+
7cggbrqfqopn \_ my-service.1 nginx:alpine master01 Running Running 4 minutes ago
183+
7cggbrqfqopn \_ my-service.1 nginx:alpine master01 Running Running 4 minutes ago
184+
v7c1ni5q43uu my-service.2 nginx:alpine worker01 Running Running 4 minutes ago
185+
2w6d8o3hdyh4 my-service.3 nginx:alpine worker01 Running Running 4 minutes ago
186+
```
187+
188+
1. Cleanup the resources
189+
190+
```sh
191+
docker-machine rm worker01 -y
192+
docker-machine rm master01 -y
193+
```
179194

180195
## Discussion / Help
181196

0 commit comments

Comments
 (0)