fabricio
Project description
Fabricio is a Docker deploy automation tool used along with the Fabric.
Features
build Docker images
create containers from images with provided tags
unlimited infrastructures
Fabric’s parallel execution mode compatibility
rollback containers to previous version
public and private Docker registries support
tasks groups
migrations apply and rollback
data backup and restore
Basic example
The most basic fabfile.py
you can use with the Fabricio is something like this:
from fabricio import docker, tasks
class NginxContainer(docker.Container):
image = docker.Image('nginx:stable')
ports = '80:80'
nginx = tasks.DockerTasks(
container=NginxContainer('nginx'),
hosts=['user@example.com'],
)
Type and execute fab --list
in your terminal to see available Fabric commands:
Available commands:
nginx deploy[:force=no,tag=None,migrate=yes,backup=yes] - backup -> pull -> migrate -> update
nginx.deploy deploy[:force=no,tag=None,migrate=yes,backup=yes] - backup -> pull -> migrate -> update
nginx.pull pull[:tag=None] - pull Docker image from registry
nginx.revert revert - revert Docker container to previous version
nginx.rollback rollback[:migrate_back=yes] - migrate_back -> revert
nginx.update update[:force=no,tag=None] - recreate Docker container
Finally, to deploy such configuration you simly have to execute following bash command:
fab nginx
Install
pip install --upgrade fabricio
Roles and infrastructures
You can define as many roles and infrastructures as you need. The following example shows ‘production’ and ‘staging’ configurations for two-roles deploy configuration:
from fabric import colors, api as fab
from fabricio import docker, tasks
@tasks.infrastructure
def staging():
fab.env.roledefs.update(
balancer=['user@staging.example.com'],
web=['user@staging.example.com'],
)
@tasks.infrastructure(color=colors.red)
def production():
fab.env.roledefs.update(
balancer=['user@balancer.example.com'],
web=['user@web1.example.com', 'user@web2.example.com'],
)
class BalancerContainer(docker.Container):
image = docker.Image('registry.example.com/nginx:balancer')
ports = ['80:80', '443:443']
volumes = '/etc/cert:/etc/cert:ro'
class WebContainer(docker.Container):
image = docker.Image('registry.example.com/nginx:cdn')
ports = '80:80'
volumes = '/media:/media'
balancer = tasks.DockerTasks(
container=BalancerContainer('balancer'),
roles=['balancer'],
)
web = tasks.DockerTasks(
container=BalancerContainer('web'),
roles=['web'],
)
Here is the list of available commands:
Available commands:
production
staging
balancer deploy[:force=no,tag=None,migrate=yes,backup=yes] - backup -> pull -> migrate -> update
balancer.deploy deploy[:force=no,tag=None,migrate=yes,backup=yes] - backup -> pull -> migrate -> update
balancer.pull pull[:tag=None] - pull Docker image from registry
balancer.revert revert - revert Docker container to previous version
balancer.rollback rollback[:migrate_back=yes] - migrate_back -> revert
balancer.update update[:force=no,tag=None] - recreate Docker container
web deploy[:force=no,tag=None,migrate=yes,backup=yes] - backup -> pull -> migrate -> update
web.deploy deploy[:force=no,tag=None,migrate=yes,backup=yes] - backup -> pull -> migrate -> update
web.pull pull[:tag=None] - pull Docker image from registry
web.revert revert - revert Docker container to previous version
web.rollback rollback[:migrate_back=yes] - migrate_back -> revert
web.update update[:force=no,tag=None] - recreate Docker container
‘production’ and ‘staging’ are available infrastructures here. To deploy to a particular infrastructure just provide it before any other Fabric command. For example:
fab staging balancer web
Rollback
To return container to previous version execute command fab app.rollback
.
Forced update
fab app.update:force=yes
Forced update forces creation of new container.
Local Docker registry
It is often when production infrastructure has limited access to the Internet. In such case Fabricio offers ablity to use local Docker registry which can be used as an intermediate registry for the selected infrastructure. To use this option you have to have local Docker registry running within your LAN and also Docker client on your work PC. You can up your own Docker registry by executing following command on the PC with Docker installed:
docker run --name registry --publish 5000:5000 --detach --restart always registry:2
When your local Docker registry is up and run you can use special tasks class to bypass infrastructure network limitations:
from fabricio import docker, tasks
class NginxContainer(docker.Container):
image = docker.Image('nginx:stable')
ports = '80:80'
nginx = tasks.PullDockerTasks(
container=NginxContainer('nginx'),
hosts=['user@example.com'],
)
List of commands in this case updated with additional two commands:
nginx.prepare prepare[:tag=None] - prepare Docker image
nginx.push push[:tag=None] - push Docker image to registry
The first one pulls Image from the original registry and the second pushes it to the local registry which is used as main registry for all configuration’s infrastructures.
Building Docker images
Using local Docker registry you can also build Docker images from local sources. This examples shows how this can be set up:
from fabricio import docker, tasks
class AppContainer(docker.Container):
image = docker.Image('app')
app = tasks.BuildDockerTasks(
container=AppContainer('app'),
hosts=['user@example.com'],
build_path='src',
)
Commands list for BuildDockerTasks
is same as for PullDockerTasks
. The only difference is that ‘prepare’ builds image instead of pulling it from the original registry.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.