如何在Ubuntu 22.04上安装和使用Docker

介绍

Docker是一个简化应用程序进程管理过程的应用程序。容器允许您在资源隔离的进程中运行应用程序。它们类似于虚拟机,但容器更便携、更节约资源,并且更依赖于主机操作系统。

有关Docker容器不同组件的详细介绍,请查看《Docker生态系统:常见组件简介》

在本教程中,您将在Ubuntu 22.04上安装并使用Docker Community Edition(CE)。您将安装Docker本身,使用容器和镜像,并将镜像推送到Docker存储库。

使用DigitalOcean应用平台简化应用部署。在几分钟内直接从GitHub部署。

先决条件

要完成本教程,您需要以下内容:

  • 按照Ubuntu 22.04初始服务器设置指南设置的一个Ubuntu 22.04服务器,包括一个使用sudo的非root用户和一个防火墙。
  • 如果您希望创建自己的镜像并将其推送到Docker Hub,需要在Docker Hub上拥有一个帐户,就像步骤7和8中所示的那样。

步骤1 — 安装Docker

官方Ubuntu存储库中提供的Docker安装包可能不是最新版本。为了确保我们获得最新版本,我们将从官方Docker存储库安装Docker。为此,我们将添加一个新的软件包源,将Docker的GPG密钥添加到系统以确保下载的有效性,然后安装软件包。

首先,更新现有的软件包列表:

  1. sudo apt update

接下来,安装一些先决条件软件包,让apt可以通过HTTPS使用软件包:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

然后将官方Docker存储库的GPG密钥添加到您的系统中:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

将Docker存储库添加到APT源中:

  1. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

再次更新现有的软件包列表,以便识别新增内容:

  1. sudo apt update

确保您将从Docker存储库而不是默认的Ubuntu存储库安装:

  1. apt-cache policy docker-ce

您将看到类似于此的输出,尽管Docker的版本号可能不同:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

请注意,docker-ce 尚未安装,但可供安装的候选版本来自 Ubuntu 22.04 的 Docker 软件库(jammy)。

最后,安装 Docker:

  1. sudo apt install docker-ce

现在应该已经安装了 Docker,守护进程已启动,并且已启用在引导时启动该进程。检查其是否正在运行:

  1. 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 Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

现在安装 Docker 不仅提供了 Docker 服务(守护进程),还提供了docker 命令行实用程序,或者称为 Docker 客户端。我们将在本教程的后续部分中探讨如何使用docker 命令。

步骤 2 —— 无需使用 Sudo 执行 Docker 命令(可选)

默认情况下,docker 命令只能由root 用户或者位于docker 组中的用户运行,该组是在 Docker 的安装过程中自动创建的。如果尝试在不添加sudo 前缀或者不在docker 组中的情况下运行docker 命令,将会得到如下输出:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

如果想要在运行docker 命令时避免输入sudo,请将您的用户名添加到docker 组中:

  1. sudo usermod -aG docker ${USER}

应用新的组成员身份,请注销服务器并重新登录,或输入以下内容:

  1. su - ${USER}

您将被提示输入用户密码以继续。

确认您的用户现在已添加到docker组,方法是输入:

  1. groups
Output
sammy sudo docker

如果您需要将用户添加到docker组,而您没有以该用户名登录,请显式声明该用户名:

  1. sudo usermod -aG docker username

本文的其余部分假定您正在作为docker组中的用户运行docker命令。如果您选择不这样做,请在命令前加上sudo

让我们接下来探索docker命令。

步骤 3 — 使用 Docker 命令

使用docker包括传递一系列选项和命令,然后是参数。语法采用以下形式:

  1. docker [option] [command] [arguments]

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

  1. docker

截至 Docker 版本20.10.14,可用子命令的完整列表包括:

Output
attach Attach local standard input, output, and error streams 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 to files or directories 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 Docker objects kill Kill one or more running containers 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 pause Pause all processes within one or more containers 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 one or more containers 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 (streamed to STDOUT by default) 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 one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes

要查看特定命令可用的选项,请输入:

  1. docker docker-subcommand --help

要查看有关 Docker 的系统范围信息,请使用:

  1. docker info

让我们来探索其中一些命令。我们将从处理镜像开始。

步骤 4 — 使用 Docker 镜像

Docker 容器是从 Docker 镜像构建的。默认情况下,Docker 从 Docker Hub 拉取这些镜像,Docker Hub 是由 Docker 公司管理的 Docker 注册表,该公司是 Docker 项目的背后推动者。任何人都可以在 Docker Hub 上托管他们的 Docker 镜像,因此大多数应用程序和 Linux 发行版都会在那里托管镜像。

要检查是否可以访问并从 Docker Hub 下载镜像,请键入:

  1. docker run hello-world

输出将指示 Docker 是否正常工作:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

最初,Docker 无法在本地找到 hello-world 镜像,因此它从 Docker Hub 下载了该镜像,这是默认的存储库。一旦下载了镜像,Docker 就会从该镜像创建一个容器,并在容器内执行应用程序,显示该消息。

您可以使用 docker 命令和 search 子命令搜索 Docker Hub 上可用的镜像。例如,要搜索 Ubuntu 镜像,请键入:

  1. docker search ubuntu

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

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

官方 栏中,OK 表示一个由项目背后的公司构建和支持的镜像。一旦您确定了要使用的镜像,您可以使用 pull 子命令将其下载到您的计算机上。

执行以下命令将官方 ubuntu 镜像下载到您的计算机:

  1. docker pull ubuntu

您将看到以下输出:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

镜像下载完成后,您可以使用 run 子命令运行一个包含已下载镜像的容器。正如您在 hello-world 示例中所看到的,如果在使用 run 子命令执行 docker 时未下载镜像,Docker 客户端将首先下载镜像,然后使用它运行一个容器。

要查看已下载到您的计算机的镜像,请键入:

  1. docker images

输出将类似于以下内容:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

正如您将在本教程的后续部分中看到的,用于运行容器的镜像可以被修改并用于生成新的镜像,然后可以将其上传(推送 是技术术语)到 Docker Hub 或其他 Docker 注册表。

让我们更详细地看一下如何运行容器。

步骤 5 — 运行 Docker 容器

在前面运行的hello-world容器是一个运行并在发出测试消息后退出的示例。容器可以比那更有用,并且它们可以是交互式的。毕竟,它们类似于虚拟机,只是更节约资源。

举个例子,让我们使用Ubuntu的最新镜像运行一个容器。结合-i-t开关,可以让你以交互式的方式访问容器的shell:

  1. docker run -it ubuntu

您的命令提示符应该会改变,以反映您现在正在容器内工作,并且应该采取这种形式:

Output
root@d9b100f2f636:/#

注意命令提示符中的容器ID。在本例中,它是d9b100f2f636。稍后您将需要该容器ID来标识您想要删除的容器。

现在您可以在容器内运行任何命令。例如,让我们在容器内更新软件包数据库。您不需要使用sudo前缀任何命令,因为您是以容器内的root用户操作:

  1. apt update

然后在其中安装任何应用程序。让我们安装Node.js:

  1. apt install nodejs

这将从官方Ubuntu仓库中安装Node.js到容器中。安装完成后,验证Node.js是否已安装:

  1. node -v

您将在终端中看到版本号:

Output
v12.22.9

您在容器内进行的任何更改仅适用于该容器。

要退出容器,请在提示符处键入exit

接下来让我们看看如何管理我们系统上的容器。

第6步 — 管理 Docker 容器

在使用 Docker 一段时间后,您的计算机上将有许多活动(正在运行)和非活动容器。要查看活动容器,请使用:

  1. docker ps

您将看到类似以下的输出:

Output
CONTAINER ID IMAGE COMMAND CREATED

在本教程中,您启动了两个容器;一个来自hello-world镜像,另一个来自ubuntu镜像。这两个容器都不再运行,但仍然存在于您的系统中。

要查看所有容器 — 包括活动和非活动的,请运行docker ps并带上-a开关:

  1. docker ps -a

您将看到类似这样的输出:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

要查看您创建的最新容器,请传递-l开关:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

要启动停止的容器,请使用docker start,然后跟上容器 ID 或容器的名称。让我们启动基于 Ubuntu 的容器,其 ID 是1c08a7a0d0e4

  1. docker start 1c08a7a0d0e4

容器将启动,您可以使用docker ps来查看其状态:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

要停止运行中的容器,请使用docker stop,然后跟上容器 ID 或名称。这次,我们将使用 Docker 分配的容器名称,即dazzling_taussig

  1. docker stop dazzling_taussig

一旦您决定不再需要容器,请使用 docker rm 命令将其移除,再次使用容器 ID 或名称。使用 docker ps -a 命令查找与 hello-world 镜像关联的容器的容器 ID 或名称,并将其删除。

  1. docker rm adoring_kowalevski

您可以使用 --name 开关启动新容器并为其命名。您还可以使用 --rm 开关创建在停止时自动删除自身的容器。有关这些选项和其他选项的更多信息,请参阅 docker run help 命令。

容器可以转换为图像,您可以使用它们来构建新容器。让我们看看这是如何工作的。

步骤 7 —— 将容器中的更改提交为 Docker 镜像

当您启动 Docker 镜像时,您可以像使用虚拟机一样创建、修改和删除文件。您所做的更改将仅应用于该容器。您可以启动和停止它,但一旦使用 docker rm 命令销毁它,更改将永久丢失。

本节将向您展示如何将容器的状态保存为新的 Docker 镜像。

在Ubuntu容器中安装Node.js后,您现在有一个运行中的容器,但该容器与您用来创建它的镜像不同。但您可能希望以后将此Node.js容器作为新镜像的基础。

然后使用以下命令将更改提交到新的Docker镜像实例。

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

开关-m用于提交消息,以帮助您和其他人了解您所做的更改,而-a用于指定作者。 container_id 是您在本教程中开始交互式Docker会话时记下的。除非您在Docker Hub上创建了其他存储库,否则repository通常是您的Docker Hub用户名。

例如,对于用户sammy,容器ID为d9b100f2f636,命令将是:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

当您提交一张图片时,新图片会保存在您的计算机本地。在本教程的后续部分,您将学习如何将图片推送到Docker Hub等Docker注册表,以便其他人可以访问它。

再次列出Docker镜像将显示新镜像以及它派生自的旧镜像:

  1. docker images

您将看到如下输出:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

在此示例中,ubuntu-nodejs是新图片,它是从Docker Hub上的现有ubuntu图片派生而来的。大小差异反映了所做的更改。在这个例子中,更改是安装了NodeJS。因此,下次您需要使用预先安装了NodeJS的Ubuntu运行容器时,您可以直接使用新图片。

您还可以从Dockerfile构建图像,这样可以自动安装软件到新图像中。但是,这超出了本教程的范围。

现在让我们分享新图像,以便其他人可以从中创建容器。

第8步 — 将 Docker 图像推送到 Docker 仓库

从现有图像创建新图像后的下一个逻辑步骤是与您的一些朋友、整个 Docker Hub 上的世界或其他您可以访问的 Docker 注册表共享它。要将图像推送到 Docker Hub 或任何其他 Docker 注册表,您必须在那里拥有帐户。

要推送您的图像,请首先登录 Docker Hub。

  1. docker login -u docker-registry-username

您将被提示使用您的 Docker Hub 密码进行身份验证。如果您指定了正确的密码,身份验证应该会成功。

注意:如果您的 Docker 注册表用户名与您用于创建图像的本地用户名不同,则必须使用您的注册表用户名为图像打标签。对于上一步中给出的示例,您会键入:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

然后,您可以使用以下命令推送您自己的图像:

  1. docker push docker-registry-username/docker-image-name

要将ubuntu-nodejs图像推送到sammy仓库,命令将是:

  1. docker push sammy/ubuntu-nodejs

该过程可能需要一些时间才能完成,因为它会上传图像,但是完成后,输出将如下所示:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

将图像推送到注册表后,它应该会显示在您帐户的仪表板上,就像下面的图片所示。

如果推送尝试导致此类错误,则您可能未登录:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required

使用docker login登录,然后重试推送尝试。然后验证它是否存在于您的Docker Hub存储库页面上。

现在,您可以使用docker pull sammy/ubuntu-nodejs将图像拉取到新机器,并使用它来运行新容器。

结论

在本教程中,您安装了Docker,使用了图像和容器,并将修改后的图像推送到了Docker Hub。现在您已经了解了基础知识,请探索数字海洋社区中的其他Docker教程

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04