Docker Cheat Sheet
I don't care, I just want a dev environment
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
Install VirtualBox and Vagrant using Brew Cask: https://github.com/phinze/homebrew-cask
brew tap phinze/homebrew-cask
brew install brew-cask
brew cask install virtualbox
brew cask install vagrant
We use the pre-built vagrant box: http://blog.phusion.nl/2013/11/08/docker-friendly-vagrant-boxes/
vagrant init docker https://oss-binaries.phusionpassenger.com/vagrant/boxes/ubuntu-12.04.3-amd64-vbox.box
In the Vagrant:
sudo su -
sh -c "curl https://get.docker.io/gpg | apt-key add -"
sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-get install -y lxc-docker
docker run -i -t ubuntu /bin/bash
That's it, you have a running Docker container.
Your basic isolated Docker process. Think of it as a chroot on steroids.
Some common misconceptions it's worth correcting:
- Containers are not transient.
docker rundoesn't do what you think.
- Containers are not limited to running a single command or process. It's just encouraged.
If you want to interact with a container,
docker ps -a to see the list, then
docker start and
docker attach to get in.
docker runcreates a container.
docker stopstops it.
docker startwill start it again.
docker restartrestarts a container.
docker rmdeletes a container.
docker attachwill connect to a running container.
docker waitblocks until container stops.
docker psshows running containers.
docker ps -ashows running and stopped containers.
docker inspectlooks at all the info on a container (including IP address).
docker logsgets logs from container.
docker eventsgets events from container.
docker portshows public facing port of container.
docker topshows running processes in container.
Import / Export
Images are just templates for docker containers.
docker importcreates an image from a tarball
docker buildcreates image from Dockerfile
docker commitcreates image from a container
docker rmiremoves an image
docker imagesshows all images
docker historyshows history of image
docker insertinserts a file from URL into image
docker tagtags an image to a name (local or registry)
Import / Export
docker searchsearches registry for image
docker pullpulls an image from registry to local machine
docker pushpushes an image to the registry from local machine.
Best to look at http://github.com/wsargent/docker-devenv and the best practices for more details.
A repository is a hosted collection of tagged images that together create the file system for a container.
A registry is a host -- a server that stores repositories and provides an HTTP API for managing the uploading and downloading of repositories.
Docker.io hosts its own index to a central registry which contains a large number of repositories.
The filesystem in Docker is based on layers. They're kind of like git commits or changesets for filesystems.
Docker volumes are free-floating filesystems. They don't have to be connected to a particular container.
You can mount them in several docker containers at once, using
docker run -volume-from
See advanced volumes for more details.
Links are how Docker containers talk to each other. Linking into Redis is the only real example.
If you have a docker container with the name CONTAINER (specified by
docker run -name CONTAINER) and in the Dockerfile, it has an exposed port:
Then if we create another container called LINKED like so:
docker run -d -link CONTAINER:ALIAS -name LINKED user/wordpress
Then the exposed ports and aliases of CONTAINER will show up in LINKED with the following environment variables:
And you can connect to it that way.