GitHub - linode/docker-machine-driver-linode: Linode Driver Plugin for Docker Machine using Linode APIv4 (original) (raw)

docker-machine-driver-linode

GoDoc Go Report Card GitHub release

Linode Driver Plugin for docker-machine.

Install

docker-machine is required, see the installation documentation.

Then, install the latest release for your environment from the releases list.

Installing from source

If you would rather build from source, you will need to have a working go 1.11+ environment,

eval $(go env) export PATH="$PATH:$GOPATH/bin"

You can then install docker-machine from source by running:

go get github.com/docker/machine cd $GOPATH/src/github.com/docker/machine make build

And then compile the docker-machine-driver-linode driver:

go get github.com/linode/docker-machine-driver-linode cd $GOPATH/src/github.com/linode/docker-machine-driver-linode make install

Run

You will need a Linode APIv4 Personal Access Token. Get one here: https://www.linode.com/docs/products/tools/api/guides/manage-api-tokens/

docker-machine create -d linode --linode-token= linode

Options

Argument Env Default Description
linode-token LINODE_TOKEN None required Linode APIv4 Token (see here)
linode-root-pass LINODE_ROOT_PASSWORD generated The Linode Instance root_pass (password assigned to the root account)
linode-authorized-users LINODE_AUTHORIZED_USERS None Linode user accounts (separated by commas) whose Linode SSH keys will be permitted root access to the created node
linode-label LINODE_LABEL generated The Linode Instance label, unless overridden this will match the docker-machine name. This label must be unique on the account.
linode-region LINODE_REGION us-east The Linode Instance region (see here)
linode-instance-type LINODE_INSTANCE_TYPE g6-standard-4 The Linode Instance type (see here)
linode-image LINODE_IMAGE linode/ubuntu18.04 The Linode Instance image which provides the Linux distribution (see here).
linode-ssh-port LINODE_SSH_PORT 22 The port that SSH is running on, needed for Docker Machine to provision the Linode.
linode-ssh-user LINODE_SSH_USER root The user as which docker-machine should log in to the Linode instance to install Docker. This user must have passwordless sudo.
linode-docker-port LINODE_DOCKER_PORT 2376 The TCP port of the Linode that Docker will be listening on
linode-swap-size LINODE_SWAP_SIZE 512 The amount of swap space provisioned on the Linode Instance
linode-stackscript LINODE_STACKSCRIPT None Specifies the Linode StackScript to use to create the instance, either by numeric ID, or using the form username/label.
linode-stackscript-data LINODE_STACKSCRIPT_DATA None A JSON string specifying data that is passed (via UDF) to the selected StackScript.
linode-create-private-ip LINODE_CREATE_PRIVATE_IP None A flag specifying to create private IP for the Linode instance.
linode-tags LINODE_TAGS None A comma separated list of tags to apply to the Linode resource
linode-ua-prefix LINODE_UA_PREFIX None Prefix the User-Agent in Linode API calls with some 'product/version'

Notes

Docker Volume Driver

The Docker Volume plugin for Linode Block Storage can be installed while reusing the docker-machine properties:

MACHINE=my-docker-machine

docker-machine create -d linode $MACHINE

eval (docker−machineenv(docker-machine env (dockermachineenvMACHINE)

Region and Label are not needed. They would be inferred. Included here for illustration purposes.

docker plugin install --alias linode linode/docker-volume-linode:latest
linode-token=$(docker-machine inspect $MACHINE -f "{{ .Driver.APIToken }}")
linode-region=$(docker-machine inspect $MACHINE -f "{{ .Driver.Region }}")
linode-label=$(docker-machine inspect $MACHINE -f "{{ .Driver.InstanceLabel }}")

docker run -it --rm --mount volume-driver=linode,source=test-vol,destination=/test,volume-opt=size=25 alpine

docker volume rm test-vol

Debugging

Detailed run output will be emitted when using the LinodeGo LINODE_DEBUG=1 option along with the docker-machine --debug option.

LINODE_DEBUG=1 docker-machine --debug create -d linode --linode-token=$LINODE_TOKEN machinename

Examples

Simple Example

LINODE_TOKEN=e332cf8e1a78427f1368a5a0a67946ad1e7c8e28e332cf8e1a78427f1368a5a0 # Should be 65 lowercase hex chars

docker-machine create -d linode --linode-token=$LINODE_TOKEN linode eval $(docker-machine env linode) docker run --rm -it debian bash

$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS linode * linode Running tcp://45.79.139.196:2376 v18.05.0-ce

$ docker-machine rm linode About to remove linode WARNING: This action will delete both local reference and remote instance. Are you sure? (y/n): y (default) Removing linode: 8753395 Successfully removed linode

Provisioning Docker Swarm

The following script serves as an example for creating a Docker Swarm with master and worker nodes using the Linode Docker machine driver and private networking.

This script is provided for demonstrative use. A production swarm environment would require hardening.

  1. Create an install.sh bash script using the source below. Run bash install.sh and provide a Linode APIv4 Token when prompted.

#!/bin/bash
set -e
read -p "Linode Token: " LINODE_TOKEN

LINODE_TOKEN=...

LINODE_ROOT_PASSWORD=$(openssl rand -base64 32); echo Password for root: $LINODE_ROOT_PASSWORD
LINODE_REGION=eu-central
create_node() {
local name=$1
docker-machine create \
-d linode \
--linode-label=$name \
--linode-instance-type=g6-nanode-1 \
--linode-image=linode/ubuntu18.04 \
--linode-region=$LINODE_REGION \
--linode-token=$LINODE_TOKEN \
--linode-root-pass=$LINODE_ROOT_PASSWORD \
--linode-create-private-ip \
$name
}
get_private_ip() {
local name=$1
docker-machine inspect -f '{{.Driver.PrivateIPAddress}}' $name
}
init_swarm_master() {
local name=$1
local ip=$(get_private_ip $name)
docker-machine ssh name"dockerswarminit−−advertise−addrname "docker swarm init --advertise-addr name"dockerswarminitadvertiseaddr{ip}"
}
init_swarm_worker() {
local master_name=$1
local worker_name=$2
local master_addr=$(get_private_ip $master_name):2377
local join_token=$(docker-machine ssh $master_name "docker swarm join-token worker -q")
docker-machine ssh workername"dockerswarmjoin−−token=worker_name "docker swarm join --token=workername"dockerswarmjointoken={join_token} ${master_addr}"
}

create master and worker node

create_node swarm-master-01 & create_node swarm-worker-01

init swarm master

init_swarm_master swarm-master-01

init swarm worker

init_swarm_worker swarm-master-01 swarm-worker-01

install the docker-volume-linode plugin on each node

for NODE in swarm-master-01 swarm-worker-01; do
eval (docker−machineenv(docker-machine env (dockermachineenvNODE)
docker plugin install --alias linode linode/docker-volume-linode:latest linode-token=$LINODE_TOKEN
done 2. After provisioning succeeds, check the Docker Swarm status. The output should show active an swarm leader and worker.
$ eval $(docker-machine env master01)
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
f8x7zutegt2dn1imeiw56v9hc * master01 Ready Active Leader 18.09.0
ja8b3ut6uaivz5hf98gah469y worker01 Ready Active 18.09.0 3. Create and scale Docker services (left as an excercise for the reader).
$ docker service create --name my-service --replicas 3 nginx:alpine
$ docker node ps master01 worker01
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
7cggbrqfqopn _ my-service.1 nginx:alpine master01 Running Running 4 minutes ago
7cggbrqfqopn _ my-service.1 nginx:alpine master01 Running Running 4 minutes ago
v7c1ni5q43uu my-service.2 nginx:alpine worker01 Running Running 4 minutes ago
2w6d8o3hdyh4 my-service.3 nginx:alpine worker01 Running Running 4 minutes ago 4. Cleanup the resources
docker-machine rm worker01 -y
docker-machine rm master01 -y

Discussion / Help

Join us at #linodego on the gophers slack

License

MIT License

Contribution Guidelines

Want to improve docker-machine-driver-linode? Please start here.