如何在Rocky Linux 9上安装和使用Docker
引言
Docker 是一个应用程序,可以在容器中运行应用程序过程,使其简单易用。这些容器类似于虚拟机,但更具移植性、资源友好,并且更依赖于主机操作系统。如果想详细了解 Docker 容器的组成部分,请查看《Docker生态系统:常见组件简介》。
在本教程中,您将学习如何在已有的Rocky Linux 9安装上进行安装和使用。
先决条件
- A Rocky Linux 9 server with a non-root user with sudo privileges set up using Initial Setup Guide for Rocky Linux 9 explains how to set this up.
这个教程中的所有命令都应以非root用户身份运行。如果命令需要root访问权限,则会在之前加上sudo。《Rocky Linux 9初始设置指南》解释了如何添加用户并给予他们sudo访问权限。
步骤1 – 安装Docker
官方Rocky Linux 9库中提供的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命令行。
步骤2 — 执行 Docker 命令(可选),无需使用 Sudo
默认情况下,运行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。
第三步 – 使用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 镜像在 Docker Hub 上,因此大多数应用程序和 Linux 发行版所需的 Docker 容器镜像都托管在 Docker Hub 上。
要检查您是否可以访问并从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] …
在“官方”栏中,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构建。但这是一个非常复杂的过程,超出了本文的范围。我们将在以后的文章中探讨这个问题。
步骤七 – 列举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
通过执行docker ps命令,可以找到容器ID。
第八步 – 将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 9上开始使用它。和大多数开源项目一样,Docker基于一个快速发展的代码库构建,因此习惯上要定期访问该项目的博客页面获取最新信息。
请在 DO 社区中查看其他 Docker 教程。