What is Docker?
Before we begin, let’s describe what Docker is. Docker is a set of virtualization tools that allows us to create, test, and deploy containerized applications quickly and easily on a dedicated server. It has become very popular and used almost everywhere in our daily lives. Thanks to containerization, we can quickly launch applications on different private cloud host platforms utilizing small bundles which contain all the needed packages, libraries and configuration file to run an application. These docker packages communicate via established network channels.
Docker has two main versions:
- Docker CE (Community Edition)
- Docker EE (Enterprise Edition)
We will not be discussing many of the new features of CentOS 8 that function with Docker, as RedHat has decided not to provide official support for Docker. But, Redhat does offer several built-in tools for creating and managing container images within a server cluster, more specifically Buildah and Podman. These tools are docker compatible, but they require a server/client architecture. Many prefer to use Docker containerization, and in this tutorial, we want to demonstrate how to install Docker on CentOS using an external repository. So let’s begin!
Install Docker CE
To get started, we should remove all existing docker applications (that might currently be installed) in order to make sure we are using a clean installation. You may not have some of these components installed.
[root@host ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine Modular dependency problems: Problem 1: conflicting requests - nothing provides module(perl:5.26) needed by module perl-DBD-SQLite:1.58:8010020191114033549:073fa5fe-0.x86_64 Problem 2: conflicting requests - nothing provides module(perl:5.26) needed by module perl-DBI:1.641:8010020191113222731:16b3ab4d-0.x86_64 No match for argument: docker No match for argument: docker-client No match for argument: docker-client-latest No match for argument: docker-common No match for argument: docker-latest No match for argument: docker-latest-logrotate No match for argument: docker-logrotate No match for argument: docker-engine No packages marked for removal. Dependencies resolved. Nothing to do. Complete! [root@host ~]#
Next, we want to add an external repository that will help us obtain the Docker software.
[root@host ~]# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo [root@host ~]#
Now, let’s check what versions of docker we have in the repository.
[root@host ~]# dnf list docker-ce CentOS-8 - AppStream 7.7 kB/s | 4.3 kB 00:00 CentOS-8 - Base 32 kB/s | 3.8 kB 00:00 CentOS-8 - Extras 4.0 kB/s | 1.5 kB 00:00 Docker CE Stable - x86_64 55 kB/s | 22 kB 00:00 Available Packages docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable [root@host ~]#
Unfortunately, the latest version of Docker is not always in the available in all repositories. To resolve this and obtain the most suitable, and stable release version, we will use the “nobest” flag. We will use this option because it will allow CentOS 8 to install the most appropriate version for our needs. If we need to install the latest version of docker, this option would not the right choice for us. We will, however, continue to install the version that best matches our CentOS server version.
Verify Docker Version
Now, we can double-check if the installation was successful by using the version command.
[root@host ~]# docker -v Docker version 19.03.7, build 7141c199a2 [root@host ~]#
Next, lets start the Docker daemon with the systemctl command.
[root@host ~]# systemctl enable --now docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. [root@host ~]#
Next, we can finally confirm that Docker has started and is working with the following command.
[root@host ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor pres> Active: active (running) since Thu 2020-03-05 06:30:02 EST; 2min 30s ago Docs: https://docs.docker.com Main PID: 2798 (dockerd) Tasks: 21 Memory: 140.7M CGroup: /system.slice/docker.service ├─2798 /usr/bin/dockerd -H fd:// └─2805 containerd --config /var/run/docker/containerd/containerd.tom> Mar 05 06:29:52 localhost.localdomain dockerd: time="2020-03-05T06:29:52.> Mar 05 06:29:52 localhost.localdomain dockerd: time="2020-03-05T06:29:52.> Mar 05 06:29:52 localhost.localdomain dockerd: time="2020-03-05T06:29:52.> Mar 05 06:29:52 localhost.localdomain dockerd: time="2020-03-05T06:29:52.> Mar 05 06:29:57 localhost.localdomain dockerd: time="2020-03-05T06:29:57.> Mar 05 06:29:59 localhost.localdomain dockerd: time="2020-03-05T06:29:58.> Mar 05 06:30:01 localhost.localdomain dockerd: time="2020-03-05T06:30:01.> Mar 05 06:30:01 localhost.localdomain dockerd: time="2020-03-05T06:30:01.> Mar 05 06:30:02 localhost.localdomain dockerd: time="2020-03-05T06:30:02.> Mar 05 06:30:02 localhost.localdomain systemd: Started Docker Application Co> [root@host ~]#
The next step is to add a user to the Docker user group employing the “usermod” command.
Additionally, when we use the “id root” command after adding the user, this will show us whether the user is now included within the docker group.
[root@host ~]# usermod -aG docker root [root@host ~]# id root uid=0(root) gid=0(root) groups=0(root),976(docker) [root@host ~]#
Next, we are going to temporarily turn off firewalld to allow Docker containers to work internally.
[root@host ~]# systemctl disable firewalld Removed /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@host ~]#
Caution:We recommend you perform a reboot after this step.
Deploy Test App
In our last step, we will install a test application called “hello-world” to ensure our installation is working as expected. We will deploy the program using the following “docker” command.
[root@host ~]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752 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: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 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 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/get-started/ [root@host ~]#
Install Docker Compose
As an additional step, we will install Docker Compose. Docker Compose is a very useful application which allows us to connect several containers together using minimal commands, or when we need to run several containers together which depend on each other.
We will start the installation using the following “dnf“command.
[root@host ~]# dnf install curl -y Last metadata expiration check: 0:42:26 ago on Thu 05 Mar 2020 06:08:47 AM EST. Package curl-7.61.1-11.el8.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! [root@host ~]#
Obtaining the Docker Compose Package
We will obtain the Docker Compose package from GitHub.
[root@host ~]# curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 100 617 0 0 1672 0 --:--:-- --:--:-- --:--:-- 1672 100 16.2M 100 16.2M 0 0 3914k 0 0:00:04 0:00:04 --:--:-- 4990k [root@host ~]
Next, we will adjust the permissions for the file using the “chmod” command to make it executable.
[root@host ~]# chmod +x /usr/local/bin/docker-compose [root@host ~]#
To check which version we have installed, run the following command.
[root@host ~]# docker-compose -v docker-compose version 1.25.0, build 0a186604 [root@host ~]#
In this article, we have discussed the basic concepts of Docker and how to install it in CentOS 8. Additionally, we installed Docker compose. Docker is one of the most useful tools when a modern containerization platform is needed.