Installing Docker
In last few recipes, we learned about LXD, an operating system container service. Now, we will look at a hot new technology called Docker. Docker is an application container designed to package and run a single service. It enables developers to enclose an app with all dependencies in an isolated container environment. Docker helps developers create a reproducible environment with a simple configuration file called a Dockerfile. It also provides portability by sharing the Dockerfile, and developers can be sure that their setup will work the same on any system with the Docker runtime.
Docker is very similar to LXC. Its development started as a wrapper around the LXC API to help DevOps take advantage of containerization. It added some restrictions to allow only a single process to be running in a container, unlike a whole operating system in LXC. In subsequent versions, Docker changed its focus from LXC and started working on a new standard library for application containers, known as libcontainer.
It still uses the same base technologies, such as Linux namespaces and control groups, and shares the same kernel with the host operating system. Similarly, Docker makes use of operating system images to run containers. Docker images are a collection of multiple layers, with each layer adding something new to the base layer. This something new can include a service, such as a web server, application code, or even a new set of configurations. Each layer is independent of the layers above it and can be reused to create a new image.
Being an application container, Docker encourages the use of a microservice-based distributed architecture. Think of deploying a simple WordPress blog. With Docker, you will need to create at least two different containers, one for the MySQL server and the other for the WordPress code with PHP and the web server. You can separate PHP and web servers in their own containers. While this looks like extra effort, it makes your application much more flexible. It enables you to scale each component separately and improves application availability by separating failure points.
While both LXC and Docker use containerization technologies, their use cases are different. LXC enables you to run an entire lightweight virtual machine in a container, eliminating the inefficiencies of virtualization. Docker enables you to quickly create and share a self-dependent package with your application, which can be deployed on any system running Docker.
In this recipe, we will cover the installation of Docker on Ubuntu Server. The recipes after that will focus on various features provided by Docker.
Getting ready
You will need access to the root account or an account with sudo
privileges.
How to do it…
Recently, Docker released version 1.11 of the Docker engine. We will follow the installation steps provided on the Docker site to install the latest available version:
- First, add a new gpg key:
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
- Next, add a new repository to the local installation sources. This repository is maintained by Docker and contains Docker packages for 1.7.1 and higher versions:
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | \ sudo tee /etc/apt/sources.list.d/docker.list
Note
If you are using an Ubuntu version other than 16.04 (Xenial), then make sure that you replace the repository path with the respective codename. For example, on Ubuntu 14.04 (Trusty), use the following repository:
deb https://apt.dockerproject.org/repo ubuntu-trusty main
- Next, update the
apt
package list and install Docker with the following commands:$ sudo apt-get update $ sudo apt-get install docker-engine
- Once the installation completes, you can check the status of the Docker service, as follows:
$ sudo service docket status
- Check the installed Docker version with
docker version
:$ sudo docker version Client: Version: 1.11.1 API version: 1.23 ... Server: Version: 1.11.1 API version: 1.23 ...
- Download a test container to test the installation. This container will simply print a welcome message and then exit:
$ sudo docker run hello-world
- At this point, you need to use
sudo
with every Docker command. To enable a non-sudo user to use Docker, or to simply avoid the repeated use ofsudo
, add the respective usernames to thedocker
group:$ sudo gpasswd -a ubuntu docker
Note
The
docker
group has privileges equivalent to the root account. Check the official Docker installation documentation for more details.Now, update group membership, and you can use Docker without the
sudo
command:$ newgrp docker
How it works…
This recipe installs Docker from the official Docker repository. This way, we can be sure to get the latest version. The Ubuntu 16.04 repository also contains the package for Docker with version 1.10. If you prefer to install from the Ubuntu repository, it's an even easier task with a single command, as follows:
$ sudo apt-get install docker.io
As of writing this, Docker 1.11 is the latest stable release and the first release to have been built on Open Container Initiative standards. This version is built on runc and containerd.
There's more…
Docker provides a quick installation script, which can be used to install Docker with a single command. This scripts reads the basic details of your operating system, such as the distribution and version, and then executes all the required steps to install Docker. You can use the bootstrap script as follows:
$ sudo curl -sSL https://get.docker.com | sudo sh
Note that with this command, the script will be executed with sudo
privileges. Make sure you cross-check the script's contents before executing it. You can download the script without executing it, as follows:
$ curl -sSL https://get.docker.com -o docker_install.sh
See also
- The Docker installation guide: http://docs.docker.com/installation/ubuntulinux/
- Operating system containers versus application containers: https://blog.risingstack.com/operating-system-containers-vs-application-containers/
- What Docker adds to lxc-tools: http://stackoverflow.com/questions/17989306/what-does-docker-add-to-lxc-tools-the-userspace-lxc-tools
- A curated list of Docker resources: https://github.com/veggiemonk/awesome-docker