Tech Lead, Full-Stack & DevOps - @Appknox http://dhilipsiva.com [email protected]
- Meetup #3 - Dockerizing Applications
- Docker Orchestration tools
- https://www.meetup.com/Container-Developers-Meetup-Bangalore/events/233529360/
- Tech Lead, Full-Stack & DevOps - @Appknox
- I code for Web, Mobile, Embedded & IoT. Open-Source Fanatic. Big Data & Machine Learning Enthusiast. Dad. Atheist
- So primarily a Developer + little bit of this & that
- Jack of all trades & Master of none
- If you think that I got something wrong, then I probably am. So please feel free to correct me
- After all, it is the mistakes and the lessons we learn from it - are the very things that define us
- Constructive criticism is more than welcomed! 😄
Orchestration is the automated arrangement, coordination, and management of computer systems, middleware, and services (From Wikipedia)
- Process Discovery
- Scheduling
- Cluster Management
- Unified way of installing backing services
- Easy way to Update / rollback applications
- Etc,.
Kubernetes, Marathon, Chef Ironfan, Rancher, Helios, Ansible Container, Swarm & SwarmKit, Shipper, Azk, maestro-ng, Maestro,
Ansible, OpenStack Heat, Python Fabric, Chef, Puppet, Serf, Archipel, governor, Gru, Circuit, Rex
- There is a detailed Hands-On sessions on Kubernetes this Afternoon
- Docker Basics is an absolute requirement.
- If you are not comfortable with Basics of Docker, please attend Anand Gothe's Docker by example Session
- Apache Mesos (Or on Mesoshpere's DCOS)
- Apache Zookeeper
- Install Marathon on the Cluster
- Create
marathon-demo.json
file - run
curl -X POST http://marthon-master:PORT/v2/apps -d @marathon-demo.json -H "Content-type: application/json"
basic-3.json
{
"id": "marathon-demo",
"cmd": "python3 -m http.server 8080",
"cpus": 0.5,
"mem": 32.0,
"container": {
"type": "DOCKER",
"docker": {
"image": "python:3",
"network": "BRIDGE",
"portMappings": [
{ "containerPort": 8080, "hostPort": 0 }
]
}
}
}
- Mostly GUI Based
- You can experiment with it yourself by pulling the Docker Image & running it:
docker run -d --restart=always -p 8080:8080 rancher/server
Installation
# install helios-solo on Debian/Ubuntu
$ curl -sSL https://spotify.github.io/helios-apt/go | sudo sh -
$ sudo apt-get install helios-solo
# install helios-solo on OS X
$ brew tap spotify/public && brew install helios-solo
# launch a helios cluster in a Docker container
$ helios-up
# check if it worked and the solo agent is registered
$ helios-solo hosts
# Create an nginx job using the nginx container image,
# exposing it on the host on port 8080
$ helios create nginx:v1 nginx:1.7.1 -p http=80:8080
# Check that the job is listed
$ helios jobs
# List helios hosts
$ helios hosts
# Deploy the nginx job on one of the hosts
$ helios deploy nginx:v1 <host>
# Check the job status
$ helios status
# Curl the nginx container when it's started running
$ curl <host>:8080
# Undeploy the nginx job
$ helios undeploy -a nginx:v1
# Remove the nginx job
$ helios remove nginx:v1
$ [sudo] pip install ansible-container
$ ansible-container init
$ ansible-container build
$ ansible-container run
$ ansible-container push
$ ansible-container shipit
- Both are very similar
- Swarm is stand-alone
- SwarmKit comes with Docker 1.12 (Swarm Mode)
# Creating a service
$ swarmctl service create --name redis --image redis:3.0.5
$ swarmctl service ls
$ swarmctl service inspect redis
$ swarmctl service update redis --replicas 6
$ swarmctl service update redis --image redis:3.0.6
# Rolling update
$ swarmctl service update redis --image redis:3.0.7 --update-parallelism 2 --update-delay 10s
shipper is a fabric for docker - tool for orchestrating docker containers. Supports parallel execution and can generate command line interface
from shipper import Shipper, run, command
@command
def build(tag, path):
s = Shipper()
s.build(tag=tag, path=path)
@command
def ps(all=False, running=True):
s = Shipper(["host-a", "host-b"])
print s.containers(pretty=True, all=all, running=running)
@command
def start(image, command, ports=None):
if ports:
ports = ports.split(",")
s = Shipper()
s.run(image, command, ports=ports, once=True)
@command
def stop(image=None):
s = Shipper()
s.stop(*s.containers(image=image, running=True))
run()
$ python env.py ps --all
$ python env.py build base ~/images/base
$ python env.py build stop --image dev/.*
templates:
nodejs:
config:
command: /usr/bin/node /var/www/app.js
ports:
- '80'
environment:
- PORT=80
buildspec:
url: github.com/toscanini/docker-nodejs
require:
mongodb:
port: '27017'
mongodb:
config:
command: /usr/bin/mongod --config /etc/mongodb.conf
buildspec:
url: github.com/toscanini/docker-mongodb
Maestro provides the ability to easily launch, orchestrate and manage mulitple Docker containers as single unit.
maestro build
maestro start [node_name]
maestro stop [node_name]
maestro run template [commandline]
maestro ps
maestro destroy
Use azk and easily orchestrate development environments on your own machine and then just code.
$ brew install azukiapp/azk/azk
$ azk agent start
$ azk init
$ azk start -vv
$ azk status
# Access http://azkdemo.dev.azk.io
/**
* Documentation: http://docs.azk.io/Azkfile.js
*/
// Adds the systems that shape your system
systems({
azkdemo: {
// Dependent systems
depends: [],
// More images: http://images.azk.io
image: {"docker": "azukiapp/node:0.12"},
// Steps to execute before running instances
provision: [
"npm install",
],
workdir: "/azk/#{manifest.dir}",
shell: "/bin/bash",
command: ["npm", "start"],
wait: {"retry": 20, "timeout": 1000},
mounts: {
'/azk/#{manifest.dir}': path("."),
'/azk/#{manifest.dir}/node_modules': persistent("node-modules-#{system.name}"),
},
scalable: {"default": 2},
http: {
domains: [ "#{system.name}.#{azk.default_domain}" ]
},
ports: {
// exports global variables
http: "3000/tcp",
},
envs: {
// Make sure that the PORT value is the same as the one
// in ports/http below, and that it's also the same
// if you're setting it in a .env file
NODE_ENV: "dev",
PORT: "3000",
},
},
});
Dokku, Deis, Flynn, Fabric8, Tsuru, Empire, PAZ, Paasta, Cocaine, AWSbox
Copyright © 2016 dhilipsiva
This copy is released under the MIT License