Rocky Linux 8 Docker安装与使用教程:从入门到精通
简介
Docker是一个应用程序,它可以在一个容器中轻松运行应用程序进程。这些容器类似于虚拟机,但更便携、资源占用更少,并且更依赖于主机操作系统。要详细了解Docker容器的不同组件,请参阅《Docker生态系统:常见组件简介》。
在本教程中,您将学习如何在已有的Rocky Linux 8安装上安装并使用Docker。
先决条件
- 一台已安装Rocky Linux 8的服务器,并配置了具有sudo权限的非root用户。您可以参考《Rocky Linux 8 初始设置指南》了解如何进行设置。
本教程中的所有命令都应以非root用户身份运行。如果某个命令需要root权限,将在命令前加上sudo
。《Rocky Linux 8 初始设置指南》详细解释了如何添加用户并赋予他们sudo权限。
第一步 – 安装Docker
官方Rocky Linux 8仓库中提供的Docker安装包可能不是最新版本。为了获取最新版本,您需要从官方的Docker仓库安装Docker。本节将向您展示如何操作。
首先,让我们更新软件包数据库:
sudo dnf check-update
接下来,添加官方的Docker存储库:
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
尽管Docker没有专门针对Rocky Linux的存储库,但由于Rocky Linux基于CentOS,因此可以使用相同的存储库。添加存储库后,安装Docker,它由三个软件包组成:
sudo dnf install docker-ce docker-ce-cli containerd.io
安装完成后,启动Docker守护进程:
sudo systemctl start docker
确认它正在运行:
sudo systemctl status docker
输出应该类似于以下内容,显示该服务正在运行且处于活动状态:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago
Docs: https://docs.docker.com
Main PID: 749 (docker)
最后,确保它在每次服务器重新启动时都能自动启动:
sudo systemctl enable docker
现在,安装Docker不仅会提供Docker服务(守护进程),还会提供Docker命令行实用工具,也就是Docker客户端。在本教程后面我们会详细介绍如何使用docker
命令。
第二步 — 在不使用sudo的情况下执行Docker命令(可选)
默认情况下,运行docker
命令需要root权限,也就是说,您必须在命令前加上sudo
。它也可以由docker
组中的用户运行,这个组是在安装Docker时自动生成的。如果您尝试在没有加sudo
前缀或不在docker
组中的情况下运行docker
命令,您将得到如下输出:
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.
如果您想避免每次运行docker
命令时都输入sudo
,请将您的用户名添加到docker
组中:
sudo usermod -aG docker $(whoami)
您需要注销服务器,并以相同的用户重新登录,以便启用此更改。
如果您需要将一个用户添加到docker
组中,而您没有以该用户登录,请明确地声明该用户名,使用以下命令:
sudo usermod -aG docker username
本文的其余部分假定您作为docker
用户组中的用户运行docker
命令。如果您选择不这样做,请在命令前加上sudo
。
第三步 – 使用Docker命令
在安装并运行Docker后,现在是熟悉命令行工具的时候了。使用Docker包括传递给它一系列的选项和子命令,然后是参数。语法形式如下:
docker [option] [command] [arguments]
查看所有可用子命令,请输入:
docker
截至Docker 1.11.1版本,可用的子命令完整列表如下:
attach 连接到正在运行的容器
build 从Dockerfile构建镜像
commit 从容器的更改创建新镜像
cp 在容器和本地文件系统之间复制文件/文件夹
create 创建一个新容器
diff 检查容器文件系统上的更改
events 从服务器获取实时事件
exec 在正在运行的容器中执行命令
export 将容器的文件系统导出为tar归档文件
history 显示镜像的历史记录
images 列出镜像
import 从tarball导入内容以创建文件系统镜像
info 显示系统范围的信息
inspect 返回容器或镜像的低级信息
kill 杀死正在运行的容器
load 从tar归档文件或STDIN加载镜像
login 登录到Docker注册表
logout 从Docker注册表注销
logs 获取容器的日志
network 管理Docker网络
pause 暂停容器内的所有进程
port 列出容器的端口映射或特定映射
ps 列出容器
pull 从注册表拉取镜像或仓库
push 将镜像或仓库推送到注册表
rename 重命名容器
restart 重启容器
rm 删除一个或多个容器
rmi 删除一个或多个镜像
run 在新容器中运行命令
save 将一个或多个镜像保存到tar归档文件
search 在Docker Hub上搜索镜像
start 启动一个或多个已停止的容器
stats 显示容器资源使用情况统计信息的实时流
stop 停止正在运行的容器
tag 将镜像标记到仓库中
top 显示容器的运行进程
unpause 取消暂停容器内的所有进程
update 更新一个或多个容器的配置
version 显示Docker版本信息
volume 管理Docker卷
wait 阻塞直到容器停止,然后打印其退出代码
要查看可用于特定命令的开关,请输入:
docker docker-subcommand --help
要查看系统范围的信息,请使用以下方法:
docker info
第四步 – 使用Docker镜像进行工作
Docker容器是通过Docker镜像运行的。默认情况下,它从Docker Hub拉取这些镜像,Docker Hub是Docker项目管理的Docker注册表。任何人都可以在Docker Hub上构建和托管他们的Docker镜像,所以大多数应用程序和Linux发行版都需要在Docker Hub上托管其镜像以运行Docker容器。
要检查您是否可以访问和下载Docker Hub中的镜像,请键入:
docker run hello-world
输出应包括以下内容,以表明Docker正常工作。
Hello from Docker. This message shows that your installation appears to be working correctly. ...
您可以使用docker
命令的search
子命令在Docker Hub上搜索可用的镜像。例如,要搜索Rocky Linux镜像,输入以下命令:
docker search rockylinux
脚本将爬取Docker Hub,并返回与搜索字符串匹配的所有镜像的列表。在这种情况下,输出将类似于以下内容:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 2224 [OK] jdeathe/centos-ssh CentOS-6 6.7 x86_64 / CentOS-7 7.2.1511 x8… 22 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.7 x86_64 / Apache / PHP / PHP M… 17 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h… 11 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif… 10 [OK] torusware/speedus-centos Always updated official CentOS docker imag… 8 [OK] nickistre/centos-lamp LAMP on centos setup 3 [OK] …
在“官方”(OFFICIAL)栏中,“OK”表示该镜像由项目背后的公司构建和支持。一旦您确定了要使用的镜像,您可以使用 `pull` 子命令将其下载到您的计算机上,如下所示:
- docker pull rockylinux
下载镜像后,您可以使用 `run` 子命令运行已下载的镜像。如果在使用 `run` 子命令执行 Docker 时没有下载镜像,则 Docker 客户端将首先下载镜像,然后使用它运行一个容器。
- docker run rockylinux
要查看已下载到您计算机上的镜像,请键入:
- docker images
输出应该类似于以下内容:
[secondary_lable Output]
REPOSITORY TAG IMAGE ID CREATED SIZE
rockylinux latest 778a53015523 5 weeks ago 196.7 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
在本教程的后面部分,您将会看到,用于运行容器的镜像可以被修改并用于生成新的镜像,然后可以被上传(在技术术语中叫做推送)到 Docker Hub 或其他 Docker 注册表中。
步骤5 — 运行一个 Docker 容器
在前一步中,您运行的 `hello-world` 容器是一个示例,它在发出测试消息后运行并退出。然而,容器可以比那更有用,并且它们可以交互。毕竟,它们类似于虚拟机,只是更节省资源。
以 Rocky Linux 的最新镜像为例,让我们运行一个容器。通过使用 `-i` 和 `-t` 开关的组合,您可以进入容器的交互式 shell 访问。
- docker run -it rockylinux
您的命令提示符应该改变以反映您现在在容器内工作,并应采用以下形式:
[root@59839a1b7de2 /]#
重要提示:请在命令提示符中注意容器 ID。在上面的示例中,容器 ID 是 `59839a1b7de2`。
现在您可以在容器内运行任何命令。例如,让我们在正在运行的容器中安装 MariaDB 服务器。无需使用 `sudo` 前缀任何命令,因为您是以具有 root 权限的容器内操作。
- dnf install mariadb-server
步骤6 — 将容器中的更改提交为 Docker 镜像
当你启动一个 Docker 镜像时,你可以像虚拟机一样创建、修改和删除文件。你所做的更改只适用于该容器。你可以启动和停止它,但一旦你使用 `docker rm` 命令将其销毁,这些更改将永久丢失。
本节介绍了如何将容器的状态保存为一个新的 Docker 镜像。
在 Rocky Linux 容器内安装 MariaDB 服务器后,您现在有一个基于镜像运行的容器,但该容器与您用于创建它的镜像不同。
为了把容器的状态保存为一张新的镜像,请先退出容器。
- exit
然后使用以下命令将更改提交到一个新的 Docker 镜像实例。`-m` 开关用于提交消息,以帮助您和其他人了解您所做的更改,而 `-a` 用于指定作者。容器的 ID 是您在教程开始交互式 Docker 会话时注意到的那个。除非您在 Docker Hub 上创建了其他仓库,否则仓库通常是您的 Docker Hub 用户名。
- docker commit -m “What did you do to the image” -a “Author Name” container-id repository/new_image_name
举个例子:
- docker commit -m “added mariadb-server” -a “Sunday Ogwu-Chinuwa” 59839a1b7de2 sammy/rockylinux-mariadb
注意:当你提交一个镜像时,新镜像会保存在本地,也就是你的电脑上。后面在本教程中,你将学习如何将镜像推送到 Docker Hub 等 Docker 注册表中,以便你和其他人可以访问和使用。
完成此操作后,在您的电脑上列出 Docker 镜像,您将看到新的镜像以及它衍生的旧镜像。
- docker images
输出应类似以下内容:
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/rockylinux-mariadb latest 23390430ec73 6 seconds ago 424.6 MB
rockylinux latest 778a53015523 5 weeks ago 196.7 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
在上面的示例中,rockylinux-mariadb
是一个新镜像,它是从 Docker Hub 上的现有 Rocky Linux 镜像衍生出来的。大小的差异反映了所做的更改。在这个示例中,变化是安装了 MariaDB 服务器。所以下次当你需要运行一个使用预安装了 MariaDB 服务器的 Rocky Linux 容器时,你可以直接使用这个新镜像。镜像也可以从一个叫做 Dockerfile 的文件构建出来。但那是一个非常复杂的过程,超出了本文的范围。我们将在以后的文章中探讨这一点。
步骤 7 — 列出 Docker 容器
使用 Docker 一段时间后,您的计算机上会有许多活跃(正在运行)和非活跃容器。要查看活跃容器,请使用:
- docker ps
您会看到类似以下的输出结果。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7c79cc556dd rockylinux “/bin/bash” 3 hours ago Up 3 hours silly_spence
要查看所有容器(包括活动和非活动容器),请传递 -a
开关。
- docker ps -a
要查看您最新创建的容器,请使用 -l
开关。
- docker ps -l
停止运行或活动容器就像输入以下命令一样简单。
- docker stop container-id
容器 ID 可以在 docker ps
命令的输出中找到。
步骤 8 — 将 Docker 镜像推送到 Docker 仓库
从现有镜像创建新镜像之后的下一步是与您的朋友、Docker Hub 上的全世界,或其他您可以访问的 Docker 注册表分享它。要将镜像推送到 Docker Hub 或任何 Docker 注册表,您必须在那里拥有一个账户。
本部分向您展示如何将 Docker 镜像推送到 Docker Hub。
要在 Docker Hub 上创建一个账户,请在 Docker Hub 上注册。之后,要推送您的镜像,首先登录 Docker Hub。您将被提示进行身份验证。
- docker login -u docker-registry-username
如果您输入了正确的密码,验证应该成功。然后,您可以使用以下方式推送您自己的镜像:
- docker push docker-registry-username/docker-image-name
完成需要一些时间,完成后的输出将是这样的。
The push refers to a repository [docker.io/sammy/rockylinux-mariadb]
670194edfaf5: Pushed
5f70bf18a086: Mounted from library/rockylinux
6a6c96337be1: Mounted from library/rockylinux
…
将镜像推送到仓库后,它应该在您的账户仪表盘上列出,如下图所示。

如果推送尝试以此错误结果结束,那么很可能是您未登录。
The push refers to a repository [docker.io/sammy/rockylinux-mariadb]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
登录后,重复推送尝试。
结论
在这篇文章中,对 Docker 所涵盖的内容远不止这些,不过这些已经足够让您在 Rocky Linux 8 上开始使用它了。和大多数开源项目一样,Docker 是基于一个快速发展的代码库构建的,所以应该养成定期访问项目博客页面以获取最新信息的习惯。
还要看看 DO 社区中的其他 Docker 教程。