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

介绍

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

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

在本教程中,您将在 Ubuntu 20.04 上安装和使用 Docker 社区版 (CE)。您将安装 Docker 本身,使用容器和映像,并将映像推送到 Docker 存储库。

先决条件

要遵循本教程,您将需要以下内容:

  • 按照Ubuntu 20.04 初始服务器设置指南设置一台 Ubuntu 20.04 服务器,包括一个 sudo 非 root 用户和一个防火墙。
  • Docker Hub上的帐户,如果您希望创建自己的映像并将它们推送到 Docker Hub,如步骤 7 和 8 所示。

第 1 步 – 安装 Docker

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

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

  • sudo apt update

接下来,安装一些必备软件包,这些apt软件包可以通过 HTTPS 使用软件包:

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

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

  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

将 Docker 存储库添加到 APT 源:

  • sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

接下来,使用新添加的存储库中的 Docker 包更新包数据库:

  • sudo apt update

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

  • apt-cache policy docker-ce

你会看到这样的输出,尽管 Docker 的版本号可能不同:

apt-cache 策略 docker-ce 的输出
docker-ce:
  Installed: (none)
  Candidate: 5:19.03.9~3-0~ubuntu-focal
  Version table:
     5:19.03.9~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

请注意,docker-ce未安装,但安装的候选对象来自 Ubuntu 20.04 ( focal)的 Docker 存储库

最后,安装 Docker:

  • sudo apt install docker-ce

现在应该安装了 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 Tue 2020-05-19 17:00:41 UTC; 17s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 24321 (dockerd) Tasks: 8 Memory: 46.4M CGroup: /system.slice/docker.service └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

现在安装 Docker 不仅为您提供 Docker 服务(守护程序),还提供docker命令行实用程序或 Docker 客户端。我们将docker在本教程后面探讨如何使用该命令。

第 2 步 – 在没有 Sudo 的情况下执行 Docker 命令(可选)

默认情况下,该docker命令只能由root用户或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'.

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

  • sudo usermod -aG docker ${USER}

要应用新的组成员身份,请退出服务器并重新登录,或键入以下内容:

  • su - ${USER}

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

通过键入以下内容确认您的用户现在已添加到docker组:

  • id -nG
Output
sammy sudo docker

如果您需要将一个用户添加到docker您未登录组中,请使用以下方式明确声明该用户名:

  • sudo usermod -aG docker username

本文的其余部分假设您dockerdocker组中的用户身份运行该命令如果您选择不这样做,请在命令前加上sudo.

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

第 3 步 – 使用 Docker 命令

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

  • docker [option] [command] [arguments]

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

  • docker

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

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

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

  • docker docker-subcommand --help

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

  • docker info

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

第 4 步 – 使用 Docker 镜像

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

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

  • docker run hello-world

输出将表明 Docker 工作正常:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1 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 映像,请键入:

  • docker search ubuntu

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

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK] dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK] ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ...

OFFICIAL列中,OK表示由项目背后的公司构建和支持的图像。确定要使用的图像后,您可以使用pull子命令将其下载到您的计算机

执行以下命令下载官方ubuntu镜像到您的电脑:

  • docker pull ubuntu

您将看到以下输出:

Output
Using default tag: latest latest: Pulling from library/ubuntu d51af753c3d3: Pull complete fc878cd0a91c: Pull complete 6154df8ff988: Pull complete fee5db0ff82f: Pull complete Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

下载映像后,您可以使用下载的映像和run子命令运行容器正如您在hello-world示例中看到的,如果docker使用run子命令执行时尚未下载图像,Docker 客户端将首先下载图像,然后使用它运行容器。

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

  • 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 访问容器:

  • docker run -it ubuntu

您的命令提示符应更改以反映您现在在容器内工作的事实,并应采用以下形式:

Output
root@d9b100f2f636:/#

请注意命令提示符中的容器 ID。在这个例子中,它是d9b100f2f636稍后您将需要该容器 ID 来识别要删除的容器。

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

  • apt update

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

  • apt install nodejs

这会在来自官方 Ubuntu 存储库的容器中安装 Node.js。安装完成后,验证是否安装了 Node.js:

  • node -v

您将看到终端中显示的版本号:

Output
v10.19.0

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

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

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

第 6 步 – 管理 Docker 容器

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

  • docker ps

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

Output
CONTAINER ID IMAGE COMMAND CREATED

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

要查看所有容器 – 活动和非活动,请docker ps 使用-a开关运行

  • docker ps -a

你会看到类似这样的输出:

1c08a7a0d0e4        ubuntu              "/bin/bash"         2 minutes ago       Exited (0) 8 seconds ago                       quizzical_mcnulty
a707221a5f6c        hello-world         "/hello"            6 minutes ago       Exited (0) 6 minutes ago                       youthful_curie

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

  • docker ps -l
  • CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty

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

  • docker start 1c08a7a0d0e4

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

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty

要停止正在运行的容器,请使用docker stop,后跟容器 ID 或名称。这一次,我们将使用 Docker 为容器分配的名称,即quizzical_mcnulty

  • docker stop quizzical_mcnulty

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

  • docker rm youthful_curie

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

容器可以变成可以用来构建新容器的镜像。让我们看看它是如何工作的。

步骤 7 — 将容器中的更改提交到 Docker 映像

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

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

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

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

  • 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,命令为:

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

当您提交图像时,新图像将本地保存在您的计算机上。在本教程的后面,您将学习如何将映像推送到 Docker 注册表(如 Docker Hub),以便其他人可以访问它。

再次列出 Docker 映像将显示新映像以及它源自的旧映像:

  • docker images

你会看到这样的输出:

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

在这个例子中,ubuntu-nodejs是新镜像,它派生ubuntu自 Docker Hub的现有镜像。大小差异反映了所做的更改。在这个例子中,变化是安装了 NodeJS。因此,下次您需要使用预装 NodeJS 的 Ubuntu 运行容器时,您只需使用新映像即可。

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

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

第 8 步——将 Docker 镜像推送到 Docker 存储库

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

本节向您展示如何将 Docker 镜像推送到 Docker Hub。要了解如何创建自己的私有 Docker 注册表,请查看如何在 Ubuntu 14.04 上设置私有 Docker 注册表

要推送你的镜像,首先登录到 Docker Hub。

  • docker login -u docker-registry-username

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

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

  • docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

然后您可以使用以下方法推送您自己的图像:

  • docker push docker-registry-username/docker-image-name

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

  • 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 ...

将图像推送到注册表后,它应该列在您帐户的仪表板上,如下图所示。

Docker Hub 上的新 Docker 镜像列表

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

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。现在您已了解基础知识,请探索DigitalOcean 社区中其他 Docker 教程

觉得文章有用?

点个广告表达一下你的爱意吧 !😁