Introduction to Docker
An open platform for distributed applications for developers and sysadmins
by Brian DeRocher / @openbrian
Dock What?!
Docker is a container which developers build around their applications in order to ship them into operating environments such as the cloud.
https://www.docker.com/
Executive Summary
- Reduce uncertainty when building and deploying software
- Standardize your deployments
- Deploy more often without anxiety
- Reap value of new features earlier
- Integrate with the cloud
- AWS Elastic Beanstalk
- Google Container Engine
- Joyent, IBM Softlayer, Microsoft Azure, Rackspace
Have you ever had these issues?
- App works in Dev but not in Prod. Why?
- As a developer, your new project depends on Python 2.3, but previous project depends on Python 2.2
- Developer says "Please deploy on Apache 2.2". Sysadmin deploys to "more secure" Apache 2.4
- Developer says "Deploy on Ubuntu, Nginx, Memcache, Oracle, libgd, libcrypt...., and put this file here". Sysadmin says "no".
- Push to build server (CI), QA server, local network (dogfood), public cloud, mobile, on premise
Solution: Docker
- Isolated environment from other projects
- Consistent environment across developers
- Consistent environment from dev to ops
- Image contains all dependencies
Context
- build environment, like Python's virtualenv
- 1982 - chroot , bsd jails - filesystem protection only
- LXC adds userspace isolotion
- Docker - cgroups
- virtual machine
- Vagrant
Docker: In a Nutshell
Daemon
Images
Containers
Hub
See also: Kitematic
Daemon
$ apt-get install docker
Images
Pull pre-existing imags from the Hub
$ docker pull django
django
Build images from a Dockerfile
$ docker build -t noblis/grailsapp .
List your docker images
$ docker images
Containers
Start an independent container from an image
$ docker run -it -p 3000:80 -V /home/amr/app:/opt noblis/grailsapp
List the running and non-running containers
$ docker ps -a
Save container changes as a new image
$ docker commit CONTAINER_ID noblis/grailsapp:version3
Hub
Publish new images on the Docker Hub
$ apt-get push
Docker Link
Each docker container may EXPOSE ports. "Linking" will bridge the port from one container to a port on another. For example EXPOSE 5432 PostgreSQL database with tag db. On web container use
docker run --name web --link db:thedb noblis/webapp python app.py
Then web container has environment variables defiend THEDB_NAME, THEDB_HOST, THEDB_PORT. And in the web app configuration connect to tcp://$THEDB_HOST:$THEDB_PORT/$THEDB_NAME.
Brian DeRocher
@openbrian
Introduction to Docker
An open platform for distributed applications for developers and sysadmins
by Brian DeRocher / @openbrian