Docker is an open source project supported by a commercial entity of the same name that makes it super-easy to run an application process inside a relatively isolated environment called a container. Unlike a virtual machine (VM), which has its own kernel, a container is dependent on the host operating system’s kernel.

As a result, it’s much lighter and boots up much faster. It’s the simplest tool that puts enterprise-class application deployment and management capabilities right on your desktop (laptop). By default, Docker containers are run using application images hosted on Docker Hub.

In this article, we’ll go through the process of installing and using it to run containers on any desktop flavor of Fedora 25.

Install Docker on Fedora 25

Every task will be completed from the command line, so fire up a terminal emulator. The latest version of Docker is in the Fedora official repository, so all you need to install Docker is type the following command:

# Installing Docker on Fedora 25

sudo dnf install docker

#

That installs the latest Docker Engine (version 1.12.3), which consists of the Docker daemon and Docker client. Because one needs the other to do anything useful, you first need to start the daemon and configure the system to start it every time the computer is (re)booted. The following pair of commands will accomplish that.

# Start the Docker daemon

sudo systemctl start docker

# Enable Docker to start on boot

sudo systemctl enable docker

#

Run Docker Containers on Fedora 25

The Docker daemon is now up and running, so you can run your first container. By default, the Docker is pointed to Docker Hub, which holds hundreds (perhaps thousands) of images waiting to be used to run containers. But let’s start by running the famous Hello World of the (Docker) container universe.

# Run your first Docker container

sudo docker run hello-world

#

The container will run and exit, because that’s how it was configured to behave. In the output, you’ll see lines like those below.

# Output of running a Docker container

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. 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

#

The above output tells you each step involved, and what else you can run, so let’s try running the suggested container, using an official Ubuntu image. Unlike the first container you just ran, this one will not exit soon after running. Instead, the command will run the container, keep it running, and give you interactive tty access inside it, with the Bash shell.

# Run your first Docker container

sudo docker run -it ubuntu bash

#

What I’m sure you observed with that container is how fast it took to start. As noted earlier, that’s one difference between a software container and a virtual machine instance – speed. Containers boot up really, really fast. And they can be killed just as quickly.

You’ll notice that your command prompt has changed to something like root@131a58505d2d:/#, where the string after the @ sign is the unique id of the container. So your host machine is powered by your favorite desktop flavor of Fedora 25, but you’re now operating from inside an Ubuntu container.

With command line access inside the container, you can do anything you want, like just exit the container, or do somethings more interesting, like update the package database, upgrade the system, and install any software you feel like installing. Note that because you’re operating from inside Ubuntu, the package management command is apt, not dnf. For now, you may exit the container by typing exit. In a future article, we’ll go into details of how to install applications inside a container, commit the changes, and push the new image derived from that to Docker Hub.

Let’s end this by running another container using the official Nginx image. By default, running the Nginx container will expose its ports 80 (http) and 443 (https). What this command does is map port 80 on the host machine to the equivalent port inside the container.

# Run Nginx container

sudo docker run -p 80:80 nginx

# Alternatively, you can force the container to detach by running this command

sudo docker run -d -p 80:80 nginx

#

Mapping the port in that fashion makes it possible to access the default Nginx page by pointing your browser to the host machine’s IP address. If you did that, you should see the default Nginx page, and if you ran the command without the -d option, you should see some output indicating that the page has been accessed.

Depending on the host machine’s resources, you can run as many containers as you want – at the same time. To search for images available on Docker Hub that you may use to run containers, type the following command:

# To search for an image on Docker Hub

sudo docker search 

# For example, to search for a Redis image

sudo docker search redis

#

Clean Up After Yourself

Whenever you run a container, the Docker client has to download an image from (by default) Docker Hub. The images are stored on your computer, and will remain there even after you’ve stopped or killed the container. With time, those images can take up a significant chunk of your computer’s storage space.

So a good habit to adopt is to delete those images you’ll not be using anytime soon. To list the images stored on your computer, type:

# Listing Docker images

sudo docker images

#

You should get an output like the following:

# Listing Docker images

REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
sematext/sematext-agent-docker   swarm3k             d0b840c91025        6 weeks ago         146.5 MB
alpine                           latest              4e38e38c8ce0        5 months ago        4.799 MB
cassandra                        latest              075b7d5e2ed5        5 months ago        385.2 MB
nginx                            latest              0d409d33b27e        6 months ago        182.8 MB
finid/ubuntu-nodejs              latest              925bbd11e0d7        6 months ago        206.7 MB
finid/ubuntu-nodejs              v2                  5a33c83a0835        6 months ago        206.6 MB
ubuntu-do                        latest              62359544c9ba        6 months ago        206.6 MB
ubuntu                           latest              c5f1cf30c96b        7 months ago        120.8 MB
hello-world                      latest              94df4f0ce8a4        7 months ago        967 B
redis                            latest              0f0e96f1f267        7 months ago        177.5 MB
swarm                            latest              0f1a3829719c        7 months ago        18.71 MB

#

Don’t think you’ll be needing an image anytime soon? Delete it:

# Deleting Docker images

sudo docker rmi 

# For example, to delete the Cassandra image shown in the previous output, type:

sudo docker rmi cassandra

#

Note that a container image can be deleted only if no container is using it, so if you get an error after attempting to delete an image, first stop and/or delete the container.

Running individual Docker containers like you just read in this article is fun, but that’s just the beginning. Docker has built-in support for load balancing, orchestration, service discovery and a host of other features. I’ll be exploring those in future articles. More on Docker here

Fedora 25 GNOME 3 applications