Docker is the most famous containerization software. In this artilce, you will learn how to install Docker CE on an offline CentOS 7 machine.
Table of Contents:
What is Docker? :
Docker is a computer software, that performs operating-system-level virtualization, also known as Containerization. Docker is developed by Docker Inc. Docker uses predefined and custom images to create and run containers. These images are provided through Docker Hub (an online Docker registry).
Containers are isolated from each other having their own set of binaries, libraries and configuration files. Unlike virtual machines, containers may or may not have their own operating systems. The containers are run by the host operating system Kernel, therefore, a container is much light weight as compare to a Hypervisor based virtual machine.
Docker is an important part of today’s DevOps environments, where it is mostly used for application virtualization..
Docker is a freemium software. Because a Community Edition (CE) with limited features is available as free while an Enterprise Edition (EE) is available with more features and a license cost.
Docker is also provided with Red Hat Atomic Host 7, which is a RHEL 7 based operating system optimized for hosting containers. You can read our previous guide about installation of Red Hat Atomic Host 7.
Environment Specification:
In this article, we are using two isolated CentOS 7 based Linux servers. One server has access to Internet, while the other server isn’t connected with Internet.
Offline Server | Online Server | |
Hostname: | docker-offline.example.com | docker-online.example.com |
Operating System: | CentOS 7.6 | CentOS 7.6 |
Internet: | No | Yes |
Linux operating systems on both machines must be same, otherwise the software package versions may not matched and it won’t work.
Installing EPEL Yum Repository on CentOS 7:
By using a ssh client, connect with docker-online.example.com as root user.
Docker CE requires some software packages that are available in EPEL (Extra Packages for Enterprise Linux) yum repository. Therefore, we have to install EPEL yum repository first.
[root@docker-online ~]# yum install -y epel-release.noarch
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: repo.inara.pk
* extras: repo.inara.pk
* updates: repo.inara.pk
base | 3.6 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-11 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
epel-release noarch 7-11 extras 15 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 15 k
Installed size: 24 k
Downloading packages:
epel-release-7-11.noarch.rpm | 15 kB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : epel-release-7-11.noarch 1/1
Verifying : epel-release-7-11.noarch 1/1
Installed:
epel-release.noarch 0:7-11
Complete!
EPEL yum repository has been installed.
Installing Docker Yum Repository on CentOS 7:
Install Docker CE yum repository on our CentOS 7 operating system.
[root@docker-online ~]# yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
Enable Docker CE (Nightly) yum repository.
[root@docker-online ~]# yum-config-manager --enable docker-ce-nightly
Loaded plugins: fastestmirror
=========================== repo: docker-ce-nightly ============================
[docker-ce-nightly]
async = True
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7
baseurl = https://download.docker.com/linux/centos/7/x86_64/nightly
cache = 0
cachedir = /var/cache/yum/x86_64/7/docker-ce-nightly
check_config_file_age = True
compare_providers_priority = 80
cost = 1000
deltarpm_metadata_percentage = 100
deltarpm_percentage =
enabled = 1
enablegroups = True
exclude =
failovermethod = priority
ftp_disable_epsv = False
gpgcadir = /var/lib/yum/repos/x86_64/7/docker-ce-nightly/gpgcadir
gpgcakey =
gpgcheck = True
gpgdir = /var/lib/yum/repos/x86_64/7/docker-ce-nightly/gpgdir
gpgkey = https://download.docker.com/linux/centos/gpg
hdrdir = /var/cache/yum/x86_64/7/docker-ce-nightly/headers
http_caching = all
includepkgs =
ip_resolve =
keepalive = True
keepcache = False
mddownloadpolicy = sqlite
mdpolicy = group:small
mediaid =
metadata_expire = 21600
metadata_expire_filter = read-only:present
metalink =
minrate = 0
mirrorlist =
mirrorlist_expire = 86400
name = Docker CE Nightly - x86_64
old_base_cache_dir =
password =
persistdir = /var/lib/yum/repos/x86_64/7/docker-ce-nightly
pkgdir = /var/cache/yum/x86_64/7/docker-ce-nightly/packages
proxy = False
proxy_dict =
proxy_password =
proxy_username =
repo_gpgcheck = False
retries = 10
skip_if_unavailable = False
ssl_check_cert_permissions = True
sslcacert =
sslclientcert =
sslclientkey =
sslverify = True
throttle = 0
timeout = 30.0
ui_id = docker-ce-nightly/x86_64
ui_repoid_vars = releasever,
basearch
username =
We have added two yum repositories in our Linux server. Therefore, we should build cache for yum package manager.
[root@docker-online ~]# yum makecache fast
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 9.1 kB 00:00
* base: repo.inara.pk
* epel: sg.fedora.ipserverone.com
* extras: repo.inara.pk
* updates: repo.inara.pk
base | 3.6 kB 00:00
docker-ce-nightly | 3.5 kB 00:00
docker-ce-stable | 3.5 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
Metadata Cache Created
Downloading Docker CE and Software Dependencies:
Create a directory to download Docker CE and dependent software packages.
[root@docker-online ~]# mkdir ~/docker
[root@docker-online ~]# cd ~/docker
Download Docker CE and dependent packages following Linux command.
[root@docker-online docker]# yumdownloader --resolve docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: repo.inara.pk
* epel: mirrors.aliyun.com
* extras: repo.inara.pk
* updates: repo.inara.pk
--> Running transaction check
---> Package docker-ce.x86_64 3:18.09.1-3.el7 will be installed
--> Processing Dependency: container-selinux >= 2.9 for package: 3:docker-ce-18.09.1-3.el7.x86_64
--> Processing Dependency: libseccomp >= 2.3 for package: 3:docker-ce-18.09.1-3.el7.x86_64
--> Processing Dependency: containerd.io for package: 3:docker-ce-18.09.1-3.el7.x86_64
--> Processing Dependency: docker-ce-cli for package: 3:docker-ce-18.09.1-3.el7.x86_64
--> Processing Dependency: libcgroup for package: 3:docker-ce-18.09.1-3.el7.x86_64
--> Processing Dependency: libseccomp.so.2()(64bit) for package: 3:docker-ce-18.09.1-3.el7.x86_64
--> Running transaction check
---> Package container-selinux.noarch 2:2.74-1.el7 will be installed
--> Processing Dependency: policycoreutils-python for package: 2:container-selinux-2.74-1.el7.noarch
---> Package containerd.io.x86_64 0:1.2.2-3.el7 will be installed
---> Package docker-ce-cli.x86_64 1:18.09.1-3.el7 will be installed
---> Package libcgroup.x86_64 0:0.41-20.el7 will be installed
---> Package libseccomp.x86_64 0:2.3.1-3.el7 will be installed
--> Running transaction check
---> Package policycoreutils-python.x86_64 0:2.5-29.el7_6.1 will be installed
--> Processing Dependency: policycoreutils = 2.5-29.el7_6.1 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: setools-libs >= 3.3.8-4 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: libsemanage-python >= 2.5-14 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: audit-libs-python >= 2.1.3-4 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: python-IPy for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: libqpol.so.1(VERS_1.4)(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: libqpol.so.1(VERS_1.2)(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: libapol.so.4(VERS_4.0)(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: checkpolicy for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: libqpol.so.1()(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Processing Dependency: libapol.so.4()(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64
--> Running transaction check
---> Package audit-libs-python.x86_64 0:2.8.4-4.el7 will be installed
---> Package checkpolicy.x86_64 0:2.5-8.el7 will be installed
---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be installed
---> Package policycoreutils.x86_64 0:2.5-29.el7 will be updated
---> Package policycoreutils.x86_64 0:2.5-29.el7_6.1 will be an update
---> Package python-IPy.noarch 0:0.75-6.el7 will be installed
---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed
--> Finished Dependency Resolution
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/13): container-selinux-2.74-1.el7.noarch.rpm | 38 kB 00:01
(2/13): audit-libs-python-2.8.4-4.el7.x86_64.rpm | 76 kB 00:01
(3/13): checkpolicy-2.5-8.el7.x86_64.rpm | 295 kB 00:02
(4/13): libseccomp-2.3.1-3.el7.x86_64.rpm | 56 kB 00:00
(5/13): libsemanage-python-2.5-14.el7.x86_64.rpm | 113 kB 00:01
(6/13): libcgroup-0.41-20.el7.x86_64.rpm | 66 kB 00:02
(7/13): policycoreutils-python-2.5-29.el7_6.1.x86_64.rpm | 456 kB 00:03
(8/13): python-IPy-0.75-6.el7.noarch.rpm | 32 kB 00:02
(9/13): policycoreutils-2.5-29.el7_6.1.x86_64.rpm | 916 kB 00:14
(10/13): setools-libs-3.3.8-4.el7.x86_64.rpm | 620 kB 00:12
warning: /root/docker/docker-ce-cli-18.09.1-3.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY
Public key for docker-ce-cli-18.09.1-3.el7.x86_64.rpm is not installed
(11/13): docker-ce-cli-18.09.1-3.el7.x86_64.rpm | 14 MB 01:37
(12/13): docker-ce-18.09.1-3.el7.x86_64.rpm | 19 MB 02:23
Public key for containerd.io-1.2.2-3.el7.x86_64.rpm is not installed 00:00 ETA
(13/13): containerd.io-1.2.2-3.el7.x86_64.rpm | 22 MB 02:26
Docker CE and dependent software packages has been downloaded.
[root@docker-online docker]# ls
audit-libs-python-2.8.4-4.el7.x86_64.rpm
checkpolicy-2.5-8.el7.x86_64.rpm
containerd.io-1.2.2-3.el7.x86_64.rpm
container-selinux-2.74-1.el7.noarch.rpm
docker-ce-18.09.1-3.el7.x86_64.rpm
docker-ce-cli-18.09.1-3.el7.x86_64.rpm
libcgroup-0.41-20.el7.x86_64.rpm
libseccomp-2.3.1-3.el7.x86_64.rpm
libsemanage-python-2.5-14.el7.x86_64.rpm
policycoreutils-2.5-29.el7_6.1.x86_64.rpm
policycoreutils-python-2.5-29.el7_6.1.x86_64.rpm
python-IPy-0.75-6.el7.noarch.rpm
setools-libs-3.3.8-4.el7.x86_64.rpm
The above packages versions may be different on your Linux server due to the Kernel version that your are using.
Now, we need to transfer these files to docker-offline.example.com. Therefore, we are creating a tarball of all downloaded software packages.
[root@docker-online docker]# tar cvzf ~/docker.tar.gz *
audit-libs-python-2.8.4-4.el7.x86_64.rpm
checkpolicy-2.5-8.el7.x86_64.rpm
containerd.io-1.2.2-3.el7.x86_64.rpm
container-selinux-2.74-1.el7.noarch.rpm
docker-ce-18.09.1-3.el7.x86_64.rpm
docker-ce-cli-18.09.1-3.el7.x86_64.rpm
libcgroup-0.41-20.el7.x86_64.rpm
libseccomp-2.3.1-3.el7.x86_64.rpm
libsemanage-python-2.5-14.el7.x86_64.rpm
policycoreutils-2.5-29.el7_6.1.x86_64.rpm
policycoreutils-python-2.5-29.el7_6.1.x86_64.rpm
python-IPy-0.75-6.el7.noarch.rpm
setools-libs-3.3.8-4.el7.x86_64.rpm
Now, we have a tarball of Docker CE and dependent software packages.
[root@docker-online docker]# ls ~ -lh
total 58M
-rw-------. 1 root root 1.5K Dec 22 11:29 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4.0K Feb 8 21:32 docker
-rw-r--r--. 1 root root 58M Feb 8 21:39 docker.tar.gz
Installing Docker CE on Offline System:
Transfer the docker.tar.gz tarball to docker-offline.example.com and copy at home directory of root user.
[root@docker-offline ~]# ls -lh
total 58M
-rw-------. 1 root root 1.5K Dec 22 12:23 anaconda-ks.cfg
-rw-r--r--. 1 root root 58M Feb 8 21:39 docker.tar.gz
Extract the docker.tar.gz tarball.
[root@docker-offline ~]# mkdir docker
[root@docker-offline ~]# tar xvf docker.tar.gz -C ~/docker
audit-libs-python-2.8.4-4.el7.x86_64.rpm
checkpolicy-2.5-8.el7.x86_64.rpm
containerd.io-1.2.2-3.el7.x86_64.rpm
container-selinux-2.74-1.el7.noarch.rpm
docker-ce-18.09.1-3.el7.x86_64.rpm
docker-ce-cli-18.09.1-3.el7.x86_64.rpm
libcgroup-0.41-20.el7.x86_64.rpm
libseccomp-2.3.1-3.el7.x86_64.rpm
libsemanage-python-2.5-14.el7.x86_64.rpm
policycoreutils-2.5-29.el7_6.1.x86_64.rpm
policycoreutils-python-2.5-29.el7_6.1.x86_64.rpm
python-IPy-0.75-6.el7.noarch.rpm
setools-libs-3.3.8-4.el7.x86_64.rpm
Install all packages in the ~/docker directory.
[root@docker-offline ~]# cd docker
[root@docker-offline docker]# rpm -ivh --replacefiles --replacepkgs *.rpm
warning: containerd.io-1.2.2-3.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:policycoreutils-2.5-29.el7_6.1 ################################# [ 8%]
2:libcgroup-0.41-20.el7 ################################# [ 15%]
3:setools-libs-3.3.8-4.el7 ################################# [ 23%]
4:python-IPy-0.75-6.el7 ################################# [ 31%]
5:libsemanage-python-2.5-14.el7 ################################# [ 38%]
6:libseccomp-2.3.1-3.el7 ################################# [ 46%]
7:docker-ce-cli-1:18.09.1-3.el7 ################################# [ 54%]
8:containerd.io-1.2.2-3.el7 ################################# [ 62%]
9:checkpolicy-2.5-8.el7 ################################# [ 69%]
10:audit-libs-python-2.8.4-4.el7 ################################# [ 77%]
11:policycoreutils-python-2.5-29.el7################################# [ 85%]
12:container-selinux-2:2.74-1.el7 ################################# [ 92%]
13:docker-ce-3:18.09.1-3.el7 ################################# [100%]
Start and enable Docker service.
[root@docker-offline docker]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@docker-offline docker]# systemctl start docker.service
We have successfully installed Docker CE on an offline Linux server.
Download Docker images from Docker Hub:
To create containers, we required Docker images, that are available via Docker Hub or a Private Docker Registry server.
Since, our Linux server is not connected to Internet, therefore, we cannot pull Docker images directly from Docker Hub.
The workaround of this problem is to download Docker images on an online system and then transfer and load these images to our offline CentOS 7 server.
Note: You must have Docker CE installed on the online system first. Because we will use the docker command to download and save images from Docker Hub.
[root@docker-online ~]# docker pull jenkins/jenkins
Using default tag: latest
latest: Pulling from jenkins/jenkins
741437d97401: Pull complete
34d8874714d7: Pull complete
0a108aa26679: Pull complete
7f0334c36886: Pull complete
aa29d9cbdbf5: Pull complete
e54d29f74413: Pull complete
eb5b24cf4e1f: Pull complete
5edfd6c9b475: Pull complete
b00dabba5e89: Pull complete
9f51dff87c48: Pull complete
0544e8830903: Pull complete
dd2464419c60: Pull complete
78125f701da6: Pull complete
5e3b2221f1a0: Pull complete
8700b2d54fbc: Pull complete
4613d2e35dec: Pull complete
08320da45709: Pull complete
8f947c5bbe77: Pull complete
51cf55002ec2: Pull complete
9537066ae19a: Pull complete
e156275467ac: Pull complete
Digest: sha256:20981c20164347728fca4774b3c45f5d24a73d857e8b9b8e6faf4100cfc0812d
Status: Downloaded newer image for jenkins/jenkins:latest
Similarly, pull more images according to your requirement.
Save Jenkins image in a tar file.
[root@docker-online ~]# docker save jenkins/jenkins > ~/jenkins.tar
[root@docker-online ~]# ls -lh
total 690M
-rw-------. 1 root root 1.5K Dec 22 11:29 anaconda-ks.cfg
-rw-r--r--. 1 root root 690M Feb 12 22:07 jenkins.tar
Transfer jenkins.tar to docker-offline.example.com.
Load jenkins.tar image by using docker command.
[root@docker-offline ~]# docker load < jenkins.tar
13d5529fd232: Loading layer 105.6MB/105.6MB
abc3250a6c7f: Loading layer 24.07MB/24.07MB
578414b395b9: Loading layer 8.005MB/8.005MB
6257fa9f9597: Loading layer 146.4MB/146.4MB
364be905de1c: Loading layer 2.332MB/2.332MB
57eab9d93a79: Loading layer 3.584kB/3.584kB
ad6eaafe7ab3: Loading layer 1.536kB/1.536kB
b98fdbf8cf7f: Loading layer 356.3MB/356.3MB
596ecd570594: Loading layer 1.698MB/1.698MB
f5ee7c2ae54f: Loading layer 338.9kB/338.9kB
349fe2545d85: Loading layer 3.584kB/3.584kB
b2b9702adfd1: Loading layer 9.728kB/9.728kB
ad16984b47fb: Loading layer 868.9kB/868.9kB
c469c008fbc0: Loading layer 4.608kB/4.608kB
5a8ce619bb31: Loading layer 77.33MB/77.33MB
8eae0810e454: Loading layer 4.608kB/4.608kB
5924ca705d38: Loading layer 9.216kB/9.216kB
852edd42bb1e: Loading layer 4.608kB/4.608kB
03b3a4ed2e5a: Loading layer 3.072kB/3.072kB
37dfb8384dfe: Loading layer 7.168kB/7.168kB
8f65ce1dc902: Loading layer 12.29kB/12.29kB
Loaded image: jenkins/jenkins:latest
Jenkins image has been loaded into Docker. You can use following Linux command to verify this.
[root@docker-offline ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins latest 9b74eda1c268 32 hours ago 704MB
Now, we can create and run Docker containers from the Jenkins/Jenkins image.
Conclusion:
Docker CE has been installed on our Offline CentOS 7 server. To start using Docker you should refer to Docker Documentation or buy andread Docker Deep Dive.
The best post !!!! thank you so much
ReplyDeleteThank you.
DeleteIt's great.Thanks.
ReplyDeletehow did you get this package: docker.tar.gz
ReplyDeleteWe have created docker.tar.gz by using tar command. this archive contains the rpms that are required to install Docker CE.
DeleteThank you for this well written article. Very helpful
ReplyDeletesame applicable for centos8?
ReplyDeleteNo, Because yum is replaced with dnf in CentOS 8.
DeleteAlthough, you can try following command.
dnf download docker --resolve
Thanks. Its a great article.
ReplyDeleteI would like to get docker version 18.09, is there a way to get older version not the latest?
Thank you.
Add the following directive in /etc/yum.repos.d/docker-ce.repo to enable old versions of Docker.
Deleteobsoletes=0
Thereafter, execute following command to install your required Docker version.
dnf install docker-ce-18.09*