DigitalOcean — A Perfect Docker Developer’s Cloud

DigitalOcean — A Perfect Docker Developer’s Cloud

Play this article

DigitalOcean (sweetly called “DO”) is “Docker Developer’s Platform”. If you’re a developer & looking out for speedy way to spin up your choice of virtual machine in less than 1 minute, DO is the right platform. With DO, you get chance to build more and spend less time managing your infrastructure with easy-to-use control panel and API.

I stumbled upon DO few weeks back and I have been quite impressed around its offerings. Developers love Droplets. These Droplets are Linux-based virtual machines (VMs) that run on top of virtualized hardware. Each Droplet you create is a new server you can use, either standalone or as part of a larger, cloud-based infrastructure. The DigitalOcean API lets you manage DigitalOcean resources programmatically using conventional HTTP requests. All the functionality available in the DigitalOcean Control Panel is also available through the API.

Doctl is Awesome..

DigitalOcean’s web-based control panel provides a point-and-click interface for managing Droplets. But as Droplets gets piled up, it might become tedious to manage & administer them, hence doctl is a great weapon which you can leverage. It is basically a Python wrapper for the Digital Ocean CLI utility. It is the official DigitalOcean command-line client. It uses the DigitalOcean API to provide access to most account and Droplet features.

Under this blog post, I will showcase how you can build and manage containerized workload on DigitalOcean in 5 Minutes.

Prerequisite:

  • Docker Desktop for Mac 2.1.7.0+
  • Install doctl — doctl is a command line interface for the DigitalOcean API.
brew install doctl

Method #1: Using doctl

[Captains-Bay]? > doctl auth init Using token [<>] Validating token... OK [Captains-Bay]? >

Retrieving DO Account Information

[Captains-Bay]? > doctl account get Email Droplet Limit Email Verified UUID Status contact@collabnix.com 10 true e1785fe2-d4f5-4d54-9e67-47dddddddddf46 active [Captains-Bay]? >

Interacting with all your DO resources

doctl is able to interact with all of your DigitalOcean resources. Below are a few common usage examples.

[Captains-Bay]? > doctl compute droplet list ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags Features Volumes [Captains-Bay]? >

Creating a new Debian Instance

doctl compute droplet create test --size s-1vcpu-1gb --image debian-10-x64 --region nyc1
[Captains-Bay]? > doctl compute droplet list ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags Features Volumes 171726228 test 206.189.207.163 1024 1 25 nyc1 Debian 10.0 x64 active
[Captains-Bay]? > doctl compute droplet list --format "ID,Name,PublicIPv4" ID Name Public IPv4 171726228 test 206.189.207.163

Method-2: Using Docker Machine

Bring up Node #1

docker-machine create --driver digitalocean --digitalocean-access-token 3xxxxxx49ab97229d node1
docker swarm init --advertise-addr <public_ip> --listen-addr <public_ip>

Bring up Node #2

docker-machine create --driver digitalocean --digitalocean-access-token 3xxxxxff149ab97229d node2
docker swarm join <>

Using docker context

sudo systemctl edit docker.service

Add the below entry:

[Service] ExecStart= ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.140.0.6:2375
sudo systemctl daemon-reload Restart Docker. sudo systemctl restart docker.service
[Captains-Bay]? > sudo docker context create --docker host=tcp://167.71.181.46:2375 mydot mydot Successfully created context "mydot" [Captains-Bay]? > sudo docker context ls NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR default * Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://kubernetes.docker.internal:6443 (default) kubernetes mydo tcp://68.183.148.254:2375 mydot tcp://167.71.181.46:2375 [Captains-Bay]? > sudo docker context use mydot mydot Current context is now "mydot" [Captains-Bay]? > sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION w7p4ezqbk13ks4y3sor4ppeml * demo1 Ready Active Leader 19.03.5 dia0ylrodgbn0n1zcv7ckel8n demo2 Ready Active 19.03.5

As shown above, using Docker context CLI, one can now easily deploy containerized workload on remote DigitalOcean platform in just few seconds.

Deploying Redis 6.0 RC1 on 5 Node Swarm Cluster

I assume that 5-Node Swarm Cluster have been up and running on top of DO Platform.

Clone the Repository

git clone https://github.com/collabnix/dockerlabs cd dockerlabs/solution/redis/viz-web-redis
docker stack deploy -c docker-compose.yml myredis

Verifying the Services

$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS ydgp8j56apek myredis_redis replicated 1/1 redis:3.0.6 *:6379->6379/tcp ofqnb4282zo1 myredis_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp bkxd3aklxhj7 myredis_web replicated 5/5 ajeetraina/redis-flask:latest *:8000->8000/tcp
$ docker service ps myredis_redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS robvimouagqj myredis_redis.1 redis:6.0-rc1 manager1 Running Running about a minute ago

Verifying the Redis Volume

$ docker volume inspect myredis_data [ { "CreatedAt": "2019-12-29T02:18:00Z", "Driver": "local", "Labels": { "com.docker.stack.namespace": "myredis" }, "Mountpoint": "/var/lib/docker/volumes/myredis_data/_data", "Name": "myredis_data", "Options": null, "Scope": "local" } ]
[manager1] (local) root@192.168.0.45 ~/dockerlabs/solution/redis/viz-web-redis $ docker service ps myredis_redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS robvimouagqj myredis_redis.1 redis:6.0-rc1 manager1 Running Running about a minute ago
$ docker service ps myredis_redis ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS robvimouagqj myredis_redis.1 redis:6.0-rc1 manager1 Running Running 3 minutes ago
$ docker service inspect myredis_redis [ { "ID": "hmistkdxnirdm5vq2f41aaqr9", "Version": { "Index": 127 }, "CreatedAt": "2019-12-29T02:35:47.7810801Z", "UpdatedAt": "2019-12-29T02:35:47.78773254Z", "Spec": { "Name": "myredis_redis", "Labels": { "com.docker.stack.image": "redis:6.0-rc1", "com.docker.stack.namespace": "myredis" }, "TaskTemplate": { "ContainerSpec": { "Image": "redis:6.0-rc1@sha256:c2227b1e5c4755cb94f18eef10b34fb4eac116ce8c5ea0a40d0ca806927b8311", "Labels": { "com.docker.stack.namespace": "myredis" }, "Args": [ "redis-server", "--appendonly", "yes" ], "Privileges": { "CredentialSpec": null, "SELinuxContext": null }, "Mounts": [ { "Type": "volume", "Source": "myredis_data", "Target": "/home/docker/data", "VolumeOptions": { "Labels": { "com.docker.stack.namespace": "myredis" } } } ], "StopGracePeriod": 10000000000, "DNSConfig": {}, "Isolation": "default" }, "Resources": {}, "RestartPolicy": { "Condition": "any", "Delay": 5000000000, "MaxAttempts": 0 }, "Placement": { "Constraints": [ "node.role == manager" ], "Platforms": [ { "Architecture": "amd64", "OS": "linux" }, { "Architecture": "386", "OS": "linux" }, { "Architecture": "ppc64le", "OS": "linux" }, { "Architecture": "s390x", "OS": "linux" } ] }, "Networks": [ { "Target": "rolenrgn8nqibx2h16wd2tac6", "Aliases": [ "redis" ] } ], "ForceUpdate": 0, "Runtime": "container" }, "Mode": { "Replicated": { "Replicas": 1 } }, "UpdateConfig": { "Parallelism": 1, "FailureAction": "pause", "Monitor": 5000000000, "MaxFailureRatio": 0, "Order": "stop-first" }, "RollbackConfig": { "Parallelism": 1, "FailureAction": "pause", "Monitor": 5000000000, "MaxFailureRatio": 0, "Order": "stop-first" }, "EndpointSpec": { "Mode": "vip", "Ports": [ { "Protocol": "tcp", "TargetPort": 6379, "PublishedPort": 6379, "PublishMode": "ingress" } ] } }, "Endpoint": { "Spec": { "Mode": "vip", "Ports": [ { "Protocol": "tcp", "TargetPort": 6379, "PublishedPort": 6379, "PublishMode": "ingress" } ] }, "Ports": [ { "Protocol": "tcp", "TargetPort": 6379, "PublishedPort": 6379, "PublishMode": "ingress" } ], "VirtualIPs": [ { "NetworkID": "sl1ecujt79razdyhjvmbohhjo", "Addr": "10.255.0.26/16" }, { "NetworkID": "rolenrgn8nqibx2h16wd2tac6", "Addr": "10.0.1.15/24" } ] } } ]

Browse to http://:8000 . Try refreshing “Hello World” page multiple times and it will display the number of times the page have been accessed. Cool, Isn’t it?

Conclusion: DO is a perfect Docker Developer tool which helps in rapidly provisioning one to thousands of Droplets running containerized workloads in seconds.

References:

Originally published at collabnix.com on January 31, 2020.

Did you find this article valuable?

Support Collabnix by becoming a sponsor. Any amount is appreciated!