Define and run multi-container applications with Docker
Go to file
Aanand Prasad 86e551f2e2 Attach with websocket and do manual line buffering
This works around the odd byte sequences we see at the beginning of
every chunk when attaching via the streaming HTTP endpoint and a plain
socket.
2013-12-20 11:13:26 +00:00
plum Attach with websocket and do manual line buffering 2013-12-20 11:13:26 +00:00
tests Add support for differentiating one-off containers 2013-12-20 10:46:55 +00:00
.gitignore yay 2013-12-09 11:41:05 +00:00
.travis.yml Add setup.py install to travis.yml 2013-12-09 16:16:15 +00:00
LICENSE Add license 2013-12-09 12:01:44 +00:00
README.md Change plum up to plum start 2013-12-17 15:42:46 +00:00
requirements.txt Add texttable to requirements.txt 2013-12-18 16:20:03 +00:00
setup.py Add basic CLI 2013-12-11 14:25:32 +00:00

README.md

Plum

WARNING: This is a work in progress and probably won't work yet. Feedback welcome.

Plum is tool for defining and running apps with Docker. It uses a simple, version-controllable YAML configuration file that looks something like this:

db:
  image: orchardup/postgresql

web:
  build: web/
  link: db

Installing

$ sudo pip install plum

Defining your app

Put a plum.yml in your app's directory. Each top-level key defines a "service", such as a web app, database or cache. For each service, Plum will start a Docker container, so at minimum it needs to know what image to use.

The way to get started is to just give it an image name:

db:
  image: orchardup/postgresql

Alternatively, you can give it the location of a directory with a Dockerfile (or a Git URL, as per the docker build command), and it'll automatically build the image for you:

db:
  build: /path/to/postgresql/build/directory

You've now given Plum the minimal amount of configuration it needs to run:

$ plum start
Building db... done
db is running at 127.0.0.1:45678
<...output from postgresql server...>

For each service you've defined, Plum will start a Docker container with the specified image, building or pulling it if necessary. You now have a PostgreSQL server running at 127.0.0.1:45678.

By default, plum start will run until each container has shut down, and relay their output to the terminal. To run in the background instead, pass the -d flag:

$ plum start -d
Building db... done
db is running at 127.0.0.1:45678

$ plum ps
SERVICE  STATE  PORT
db       up     45678

Getting your code in

Some services may include your own code. To get that code into the container, ADD it in a Dockerfile.

plum.yml:

web:
  build: web/

web/Dockerfile:

FROM orchardup/rails
ADD . /code
CMD bundle exec rackup

Communicating between containers

Your web app will probably need to talk to your database. You can use [Docker links] to enable containers to communicate, pass in the right IP address and port via environment variables:

db:
  image: orchardup/postgresql

web:
  build: web/
  link: db

This will pass an environment variable called DB_PORT into the web container, whose value will look like tcp://172.17.0.4:45678. Your web app's code can then use that to connect to the database.

You can pass in multiple links, too:

link:
 - db
 - memcached
 - redis

In each case, the resulting environment variable will begin with the uppercased name of the linked service (DB_PORT, MEMCACHED_PORT, REDIS_PORT).

Container configuration options

You can pass extra configuration options to a container, much like with docker run:

web:
  build: web/

  -- override the default run command
  run: bundle exec thin -p 3000

  -- expose ports - can also be an array
  ports: 3000

  -- map volumes - can also be an array
  volumes: /tmp/cache

  -- add environment variables - can also be a dictionary
  environment:
   RACK_ENV: development

Running a one-off command

If you want to run a management command, use plum run to start a one-off container:

$ plum run db createdb myapp_development
$ plum run web rake db:migrate
$ plum run web bash

Running more than one container for a service

You can set the number of containers to run for each service with plum scale:

$ plum start -d
db is running at 127.0.0.1:45678
web is running at 127.0.0.1:45679

$ plum scale db=0,web=3
Stopped db (127.0.0.1:45678)
Started web (127.0.0.1:45680)
Started web (127.0.0.1:45681)