Docker is an open-source software tool designed to automate and ease the process of creating, packaging, and deploying applications using an environment called a container. The use of Linux containers to deploy applications is called containerization. A Container allows us to package an application with all the parts needed to run an application (code, system tools, logs, libraries, configuration settings, and other dependencies) and sends it out as a single standalone package deployable via Ubuntu (in this case 16.04 LTS). Docker can be installed on other platforms as well. Currently, the Docker software is maintained by the Docker community and Docker Inc. Check out the official documentation to find more specifics on Docker. Docker Terms and Concepts.
Docker is made up of several components:
- Docker for Linux: Software that runs the Docker containers on the Ubuntu Linux OS.
- Docker Engine: Used for building Docker images and creating Docker containers.
- Docker Registry: Used to store various Docker images.
- Docker Compose: Used to define applications using multiple Docker containers.
Some other essential terms and concepts you will come into contact with are:
- Containerization: Containerization is a lightweight alternative to full machine virtualization (like VMWare) that involves encapsulating an application within a container with its own operating environment.
Docker also uses images and containers. The two ideas are closely related, but very distinct.
- Docker Image: A Docker Image is the basic unit for deploying a Docker container. A Docker image is essentially a static snapshot of a container, incorporating all the objects needed to run a container.
- Docker Container: A Docker Container encapsulates a Docker image and when it is live and running, it is considered a container. Each container runs isolated in the host machine.
- Docker Registry: The Docker Registry is a stateless, highly scalable server-side application that stores and distributes Docker images. This registry holds Docker images, along with their versions and, it can provide both public and private storage locations. There is a public Docker registry called Docker Hub which provides a free-to-use, hosted Registry, plus additional features like organization accounts, automated builds, and more. Users interact with a registry by using Docker push or pull commands. Example:
docker pull registry-1.docker.io/distribution/registry:2.1.
- Docker Engine: The Docker Engine is a layer that exists between containers and the Linux kernel and runs the containers. It is also known as the Docker daemon. Any Docker container can run on any server that has the Docker-daemon enabled, regardless of the underlying operating system.
- Docker Compose: Docker Compose is a tool that defines, manages and controls multi-container Docker applications. With Compose, a single configuration file is used to set up all of your application’s services. Then, using a single command, you can create and start all the services from that file.
- Dockerfiles: Dockerfiles are merely text documents (.yaml files) that contains all the configuration information and commands needed to assemble a container image. With a Dockerfile, the Docker daemon can automatically build the container image.
Example: The following is a basic Dockerfile which sets up an SSHd service in a container that we can use to connect to, and inspect other containers volumes, or get quick access to a test container.
FROM ubuntu:16.04 RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:THEPASSWORDYOUCREATED' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
There are three versions of Docker available, each with its own unique use:
- Docker CE is the simple, classic Docker Engine.
- Docker EE is Docker CE with certification on some systems and support by Docker Inc.
- Docker CS (Commercially Supported) is kind of the old bundle version of Docker EE for versions <= 1.13.
We will be installing Docker CE.
Step 1 — Checking Prerequisites
To begin, start with the following server environment:
- 64-bit Ubuntu VPS server
- Logged in as the root user
Before installing Docker, we need to set up the repository which contains the latest version of the software (Docker is unavailable in the standard Ubuntu 16.04 repository). Adding the repository allows us to easily update the software later as well.
Step 2 — Installing Docker
The next step is to remove any default Docker packages from the existing system before installing Docker on a Linux VPS. Execute the following commands to start this process:
root@test:~# apt-get remove docker docker-engine docker.io lxc-docker Reading package lists... Done Building dependency tree Reading state information... Done Package 'docker-engine' is not installed, so not removed Package 'docker' is not installed, so not removed Package 'docker.io' is not installed, so not removed E: Unable to locate package lxc-docker
Step 3 — Add required packages
Now, we need to install some required packages on your system. Run the commands below to accomplish this:
root@test:~# apt-get install curl apt-transport-https ca-certificates software-properties-common
Step 4 — Verify, Add and Update Repositories
Add the Docker GPG key to your system:
root@test:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - OK
Next, update the APT sources to add the source:
root@test:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" | tee /etc/apt/sources.list.d/docker.list
Run the update again so the Docker packages are recognized:
root@test:~# apt-get update Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB] Hit:2 http://us.archive.ubuntu.com/ubuntu xenial InRelease Get:3 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB] Get:4 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB] Fetched 323 kB in 0s (827 kB/s) Reading package lists... Done E: The method driver /usr/lib/apt/methods/https could not be found. N: Is the package apt-transport-https installed? E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/xenial/InRelease E: Some index files failed to download. They have been ignored, or old ones used instead.
Let’s rerun the update:
root@test:~# apt-get update Hit:1 http://us.archive.ubuntu.com/ubuntu xenial InRelease Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB] Get:3 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB] Get:4 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB] Hit:5 https://download.docker.com/linux/ubuntu xenial InRelease Fetched 323 kB in 0s (656 kB/s) Reading package lists... Done
Success! Now, verify we are installing Docker from the correct repo instead of the default Ubuntu 16.04 repo:
root@test:~# apt-cache policy docker-ce docker-ce: Installed: (none) Candidate: 18.06.0~ce~3-0~ubuntu Version table: 18.06.0~ce~3-0~ubuntu 500 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
Step 5 — Install Docker
Finally, let’s start the Docker install:
root@test:~# apt-get install -y docker-ce Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: aufs-tools cgroupfs-mount libltdl7 pigz Suggested packages: mountall The following NEW packages will be installed: aufs-tools cgroupfs-mount docker-ce libltdl7 pigz 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. Need to get 40.3 MB of archives. After this operation, 198 MB of additional disk space will be used. Get:1 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 pigz amd64 2.3.1-2 [61.1 kB] Get:2 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 aufs-tools amd64 1:3.2+20130722-1.1ubuntu1 [92.9 kB] Get:3 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 cgroupfs-mount all 1.2 [4,970 B] Get:4 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 libltdl7 amd64 2.4.6-0.1 [38.3 kB] Get:5 https://download.docker.com/linux/ubuntu xenial/stable amd64 docker-ce amd64 18.06.0~ce~3-0~ubuntu [40.1 MB] Fetched 40.3 MB in 1s (38.4 MB/s) ... ...
Docker should now be installed, the daemon started, and the process enabled to start on boot. Let’s check to see if it’s running:
root@test:~# systemctl status docker * docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-08-08 13:51:22 EDT; 2min 13s ago Docs: https://docs.docker.com Main PID: 6519 (dockerd) CGroup: /system.slice/docker.service |-6519 /usr/bin/dockerd -H fd:// `-6529 docker-containerd --config /var/run/docker/containerd/containerd.toml Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.192600502-04:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.192630873-04:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc42020f6a0, CONNECTING" module=grpc Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.192854891-04:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc42020f6a0, READY" module=grpc Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.192867421-04:00" level=info msg="Loading containers: start." Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.340349000-04:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address" Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.397715134-04:00" level=info msg="Loading containers: done." Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.424005987-04:00" level=info msg="Docker daemon" commit=0ffa825 graphdriver(s)=overlay2 version=18.06.0-ce Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.424168214-04:00" level=info msg="Daemon has completed initialization" Aug 08 13:51:22 test.docker.com dockerd: time="2018-08-08T13:51:22.448805942-04:00" level=info msg="API listen on /var/run/docker.sock" Aug 08 13:51:22 test.docker.com systemd: Started Docker Application Container Engine. ~ ~ ~ (press q to quit)
Excellent! Good to go!
If Docker is not started automatically after the installation, run the following commands:
root@test:~# systemctl start docker.service root@test:~# systemctl enable docker.service
Step 6 — Test Docker
Let’s check the new Docker build by downloading the hello-world test image.
To start testing, issue the following command:
root@test:~# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the “hello-world” image from the Docker Hub.
- The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
- The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
Step 7 — The ‘Docker’ Command
With Docker installed and working, now is the time to become familiar with the command-line utility. The ‘Docker’ command consists of using Docker with a chain of options followed by arguments. The syntax takes this form:
root@test:~# docker Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Run 'docker COMMAND --help' for more information on a command.
To view all the available Options and Management Commands, simply type:
To view the switches available for a specific command, type:
docker docker-subcommand --help
Lastly, To view system-wide information about Docker, use:
Docker is a dynamic, robust and responsive tool that makes it very simple to run applications within a containerized environment. It is portable, less resource-intensive, and more reliant on the host operating system which allows for multiple uses. Overall, Docker is a ‘must-have’ system and should be included in your toolkit for automation, deployment, and scaling of your applications!
Our Support Teams are filled with talented admins with an intimate knowledge of multiple web hosting technologies, especially those discussed in this article. If you are uncomfortable walking through the steps outlined here, we are a phone call, chat or ticket away from assisting you with this process. If you’re running one of our Fully Managed Cloud VPS Servers, we can provide more information on directly implementing the software described in this article.