如何在Rocky Linux 8上安装和使用Docker
简介
Docker是一个应用程序,它可以在一个容器中轻松运行应用程序进程。这些容器类似于虚拟机,但更便携、资源友好,并且更依赖于主机操作系统。要详细了解Docker容器的不同组件,请参阅《Docker生态系统:常见组件简介》。
在本教程中,您将学习如何在已有的Rocky Linux 8安装上安装并使用它。
先决条件
- A Rocky Linux 8 server with a non-root user with sudo privileges set up using Initial Setup Guide for Rocky Linux 8 explains how to set this up.
本教程中的所有命令都应以非 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)
您需要注销vServer,并以相同的用户重新登录,以便启用此更改。
如果你需要将一个用户添加到docker组中,而你没有以该用户登录,请明确地声明该用户名,使用以下命令:
- sudo usermod -aG docker username
本文的其余部分假定您作为docker用户组中的用户运行docker命令。如果您选择不这样做,请在命令前加上sudo。
步骤3 – 使用Docker命令
在安装并运行Docker后,现在是熟悉命令行工具的时候了。使用Docker包括传递给它一系列的选项和子命令,然后是参数。语法形式如下:
- docker [option] [command] [arguments]
查看所有可用子命令,请输入:
- docker
截至Docker 1.11.1版本,可用的子命令完整列表如下:
attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container’s changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container’s filesystem events Get real time events from the server exec Run a command in a running container export Export a container’s filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container update Update configuration of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code
要查看可用于特定命令的开关,请输入:
- 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命令的搜索子命令在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] …
在“官方”栏中,OK表示由该项目背后的公司构建和支持的映像。一旦您确定了要使用的映像,您可以使用拉取子命令将其下载到您的计算机上,如下所示:
- 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
Note
完成了这个操作后,在您的电脑上列出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 教程。