如何在Rocky Linux 9上安装和使用Docker

2,622 阅读11分钟

简介

Docker是一个应用程序,它使在容器中运行应用程序进程变得简单和容易,这就像虚拟机一样,只是更容易携带,更容易获得资源,并且更依赖于主机操作系统。

在本教程中,你将学习如何在现有的Rocky Linux 9的安装上安装和使用它。

前提条件

本教程中的所有命令都应该以非root用户的身份运行。如果命令需要root权限,前面会有sudoRocky 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

输出结果应该与下面类似,显示该服务已被激活并运行。

Output
 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步 - 不使用Sudo执行Docker命令(可选)

默认情况下,运行docker 命令需要root权限--也就是说,你必须在命令前加上sudo 。它也可以由docker组中的用户运行,该组在安装Docker时自动创建。如果你试图运行docker ,但没有在前缀中加上sudo ,或者没有在docker组中,你会得到这样的输出。

Output
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)

你将需要退出Droplet,然后以同一用户身份重新登录,以启用这一变化。

如果你需要将一个用户添加到你没有登录的docker 组中,请使用明确声明该用户名。

sudo usermod -aG docker username

本文的其余部分假设你是以docker用户组的用户身份运行docker 命令。如果你选择不这样做,请在命令的前面加上sudo

第3步 - 使用Docker命令

随着Docker的安装和运行,现在是熟悉命令行工具的时候了。使用docker ,包括将一连串的选项和子命令传递给它,后面是参数。语法采用这种形式。

docker [option] [command] [arguments]

要查看所有可用的子命令,请输入。

docker

从Docker 1.11.1开始,可用的子命令的完整列表包括。

Output

    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

第4步 - 使用Docker镜像

Docker容器是通过Docker镜像运行的。默认情况下,它从Docker Hub拉取这些镜像,这是一个由Docker管理的Docker注册表,Docker项目背后的公司。任何人都可以在Docker Hub上构建和托管他们的Docker镜像,所以你需要运行Docker容器的大多数应用程序和Linux发行版的镜像都托管在Docker Hub上。

要检查你是否可以从Docker Hub访问和下载镜像,请输入。

docker run hello-world

输出结果应该包括以下内容,应该表明Docker在正常工作。

Output
Hello from Docker.
This message shows that your installation appears to be working correctly.
...

你可以通过使用带有search 子命令的docker 命令来搜索Docker Hub上可用的镜像。例如,要搜索Rocky Linux镜像,请输入。

docker search rockylinux

该脚本将抓取Docker Hub,并返回名称与搜索字符串相匹配的所有镜像的列表。在这种情况下,输出将类似于这样。

Output
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**开关的组合给了你进入容器的交互式外壳权限。

docker run -it rockylinux

你的命令提示符应该改变,以反映你现在正在容器内工作的事实,应该采取这种形式。

Output
[root@59839a1b7de2 /]#

重要提示:注意命令提示中的容器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

输出应该是这样的。

Output
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

你会看到类似于下面的输出。

Output
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

container-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

这将需要一些时间来完成,完成后,输出结果将是这样的。

Output
The push refers to a repository [docker.io/sammy/rockylinux-mariadb]
670194edfaf5: Pushed
5f70bf18a086: Mounted from library/rockylinux
6a6c96337be1: Mounted from library/rockylinux
...

推送图像到注册表后,它应该被列在你的账户仪表板上,就像下面的图片中所示。

Docker image listing on Docker Hub

如果推送尝试的结果是这样的错误,那么你可能没有登录。

Output
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是由一个快速发展的代码库构建的。