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

介绍

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

有关 Docker 容器的不同组件的详细介绍,请参阅 The Docker Ecosystem: An Introduction to Common Components

在本教程中,您将安装并使用Docker Community Edition(CE)在Ubuntu 22.04. 您将安装Docker本身,处理容器和图像,并将图像推到Docker仓库。

<$>[info] 简化使用 DigitalOcean App Platform的应用程序部署。

前提条件

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

  • 一个 Ubuntu 22.04 服务器设置为遵循 Ubuntu 22.04 初始服务器设置指南,包括一个sudoroot 用户和防火墙。
  • Docker Hub上设置一个帐户,如果你想创建自己的图像并将它们推到 Docker Hub,如步骤 7 和 8. 所示。

步骤 1 - 安装 Docker

在官方 Ubuntu 存储库中可用的 Docker 安装包可能不是最新版本. 为了确保我们得到最新版本,我们将从官方 Docker 存储库安装 Docker. 为了做到这一点,我们将添加一个新的包源,添加 Docker 的 GPG 密钥以确保下载有效,然后安装包。

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

1sudo apt update

接下来,安装一些先决条件的包,允许apt在 HTTPS 上使用包:

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

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

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

将 Docker 存储库添加到 APT 源:

1echo "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

更新您现有的包列表,以便重新识别该添加:

1sudo apt update

请确保您即将从Docker repo安装,而不是默认的Ubuntu repo:

1apt-cache policy docker-ce

您将看到这样的输出,但Docker的版本号可能不同:

1[label Output of apt-cache policy docker-ce]
2docker-ce:
3  Installed: (none)
4  Candidate: 5:20.10.14~3-0~ubuntu-jammy
5  Version table:
6     5:20.10.14~3-0~ubuntu-jammy 500
7        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
8     5:20.10.13~3-0~ubuntu-jammy 500
9        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

请注意,docker-ce 没有安装,但安装候选人来自 Ubuntu 22.04 的 Docker 存储库(jammy)。

最后,安装Docker:

1sudo apt install docker-ce

Docker现在应该安装,戴蒙开始,并启用了启动过程。

1sudo systemctl status docker

输出应类似于以下,表明服务是活跃和运行的:

 1[secondary_label Output]
 2 docker.service - Docker Application Container Engine
 3     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
 4     Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago
 5TriggeredBy:  docker.socket
 6       Docs: https://docs.docker.com
 7   Main PID: 7854 (dockerd)
 8      Tasks: 7
 9     Memory: 38.3M
10        CPU: 340ms
11     CGroup: /system.slice/docker.service
12             └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

现在安装Docker不仅为您提供Docker服务(daemon),还为您提供Docker命令行实用程序或Docker客户端,我们将在本教程中进一步探索如何使用Docker命令。

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

默认情况下,docker命令只能由 root 用户或由 ** docker** 组中的用户运行,该命令在 Docker 安装过程中自动创建。

1[secondary_label Output]
2docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
3See 'docker run --help'.

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

1sudo usermod -aG docker ${USER}

若要应用新的组会员资格,请退出服务器并重新登录,或键入以下内容:

1su - ${USER}

您将被要求输入您的用户密码以继续。

确认您的用户现在已被添加到 docker 组,键入:

1groups
1[secondary_label Output]
2sammy sudo docker

如果您需要将用户添加到未登录的docker组中,请明示该用户名使用:

1sudo usermod -aG docker username

本文的其余部分假定您正在运行docker命令作为 docker 组中的用户。

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

步骤 3 – 使用 Docker 命令

使用docker是通过一个选项和命令链,然后是参数。

1docker [option] [command] [arguments]

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

1docker

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

 1[secondary_label Output]
 2  attach Attach local standard input, output, and error streams to a running container
 3  build Build an image from a Dockerfile
 4  commit Create a new image from a container's changes
 5  cp Copy files/folders between a container and the local filesystem
 6  create Create a new container
 7  diff Inspect changes to files or directories on a container's filesystem
 8  events Get real time events from the server
 9  exec Run a command in a running container
10  export Export a container's filesystem as a tar archive
11  history Show the history of an image
12  images List images
13  import Import the contents from a tarball to create a filesystem image
14  info Display system-wide information
15  inspect Return low-level information on Docker objects
16  kill Kill one or more running containers
17  load Load an image from a tar archive or STDIN
18  login Log in to a Docker registry
19  logout Log out from a Docker registry
20  logs Fetch the logs of a container
21  pause Pause all processes within one or more containers
22  port List port mappings or a specific mapping for the container
23  ps List containers
24  pull Pull an image or a repository from a registry
25  push Push an image or a repository to a registry
26  rename Rename a container
27  restart Restart one or more containers
28  rm Remove one or more containers
29  rmi Remove one or more images
30  run Run a command in a new container
31  save Save one or more images to a tar archive (streamed to STDOUT by default)
32  search Search the Docker Hub for images
33  start Start one or more stopped containers
34  stats Display a live stream of container(s) resource usage statistics
35  stop Stop one or more running containers
36  tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
37  top Display the running processes of a container
38  unpause Unpause all processes within one or more containers
39  update Update configuration of one or more containers
40  version Show the Docker version information
41  wait Block until one or more containers stop, then print their exit codes

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

1docker docker-subcommand --help

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

1docker info

让我们探索一些这些命令,我们将开始使用图像。

步骤 4 – 使用 Docker 图像

Docker 容器是由 Docker 图像构建的。默认情况下,Docker 将这些图像从 Docker Hub中提取,这是由 Docker 管理的 Docker 注册表,这是 Docker 项目背后的公司。

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

1docker run hello-world

输出将表明 Docker 正在正确工作:

 1[secondary_label Output]
 2Unable to find image 'hello-world:latest' locally
 3latest: Pulling from library/hello-world
 42db29710123e: Pull complete
 5Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
 6Status: Downloaded newer image for hello-world:latest
 7
 8Hello from Docker!
 9This message shows that your installation appears to be working correctly.
10
11...

Docker最初无法在本地找到你好的图像,所以它从Docker Hub下载了图像,这是默认存储库。

您可以使用docker命令与search子命令搜索在Docker Hub上可用的图像,例如,要搜索Ubuntu图像,键入:

1docker search ubuntu

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

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

官方列中,OK表示由该项目背后的公司创建和支持的图像,一旦您确定了您想要使用的图像,您可以使用拖动子命令将其下载到您的计算机。

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

1docker pull ubuntu

您将看到以下输出:

1[secondary_label Output]
2Using default tag: latest
3latest: Pulling from library/ubuntu
4e0b25ef51634: Pull complete
5Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae
6Status: Downloaded newer image for ubuntu:latest
7docker.io/library/ubuntu:latest

在下载图像后,您可以使用下载图像使用运行子命令运行一个容器.正如您在问候世界示例中所看到的那样,如果在使用运行子命令执行docker时没有下载图像,那么Docker客户端首先会下载图像,然后使用它运行一个容器。

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

1docker images

结果将类似于以下:

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

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

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

步骤 5 – 运行 Docker 容器

你在上一步中运行的你好世界容器是发出测试消息后运行的和离开的容器的一个例子。容器比这更有用,并且可以互动。

作为一个例子,让我们使用Ubuntu的最新图像运行一个容器. -i 和 ** -t** 交换机的组合为您提供交互式容器访问:

1docker run -it ubuntu

您的命令提示应该改变以反映您现在在容器内部工作的事实,并应采取以下形式:

1[secondary_label Output]
2[environment second]
3root@d9b100f2f636:/#

在此示例中,它是「d9b100f2f636」。

现在您可以运行容器内部的任何命令,例如,让我们更新容器内部的包数据库,您不需要用sudo预先定义任何命令,因为您作为 root 用户在容器内部运行:

1[environment second]
2apt update

然后安装任何应用程序,让我们安装Node.js:

1[environment second]
2apt install nodejs

此操作将 Node.js 安装到官方 Ubuntu 存储库中的容器中. 安装完成后,请验证 Node.js 已安装:

1[environment second]
2node -v

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

1[secondary_label Output]
2[environment second]
3v12.22.9

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

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

让我们来看看我们系统上的集装箱的管理。

步骤6:管理 Docker 容器

使用 Docker 一段时间后,您的计算机上将有许多活跃(运行)和不活跃的容器。

1docker ps

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

1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED

在本教程中,你开始了两个容器,一个来自你好世界图像,另一个来自ubuntu图像。

要查看所有容器 - 活跃和不活跃,请使用-a交换机运行docker ps:

1docker ps -a

你会看到类似于此的输出:

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

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

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

要启动一个停止的容器,请使用docker start,然后是容器ID或容器名称。

1docker start 1c08a7a0d0e4

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

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

要阻止运行容器,请使用docker stop,然后是容器ID或名称.这次,我们将使用Docker分配给容器的名称,即dazzling_taussig:

1docker stop dazzling_taussig

一旦您决定不再需要一个容器,请使用docker rm命令删除它,再次使用容器ID或名称。

1docker rm adoring_kowalevski

您可以使用--name交换机启动一个新的容器并给它一个名称,您也可以使用--rm交换机创建一个在停止时自行移除的容器,请参阅docker run help命令,了解有关这些选项和其他信息。

容器可以转化为图像,您可以使用这些图像来构建新的容器。

步骤 7 — 对 Docker 图像的容器进行更改

当您启动 Docker 图像时,您可以创建、修改和删除文件,就像您可以使用虚拟机一样。您所做的更改只适用于该容器。

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

在 Ubuntu 容器内安装 Node.js 后,您现在有一个容器运行图像,但容器与您创建它时使用的图像不同。

然后使用以下命令对新 Docker 图像实例进行更改。

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

-m 交换器用于请求信息,帮助您和其他人知道您所做的更改,而 ** -a** 用于指定作者。 container_id 是您在启动交互式 Docker 会话时在教程中提到的信息。

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

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

当您 commit 一个图像时,新图像会被本地保存到您的计算机上. 在本教程中,您将学习如何将图像推到 Docker 注册表,如 Docker Hub,以便其他人可以访问它。

再次列出 Docker 图像将显示新的图像,以及它是由原来的旧图像:

1docker images

你会看到这样的输出:

1[secondary_label Output]
2REPOSITORY TAG IMAGE ID CREATED SIZE
3sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
4...

在本示例中,ubuntu-nodejs是新图像,它是从 Docker Hub 的现有ubuntu图像中提取的。大小差异反映了所做的更改。

您还可以从Dockerfile构建图像,这允许您在新图像中自动安装软件。

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

步骤 8 — 将 Docker 图像推到 Docker 存储库

在从现有图像创建新图像后,下一个逻辑步骤是将其与几个朋友共享,在Docker Hub上的整个世界或您可以访问的其他Docker注册表。

要按下您的图像,请先登录 Docker Hub。

1docker login -u docker-registry-username

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

<$>[note] ** 注意:** 如果您的 Docker 注册表用户名与您创建图像时使用的本地用户名不同,则需要用您的注册表用户名标记您的图像。

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

美元

然后你可以推自己的图像使用:

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

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

1docker push sammy/ubuntu-nodejs

该过程可能需要一些时间来完成,因为它上传图像,但当完成时,输出将看起来像这样:

 1[secondary_label Output]
 2The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
 3e3fbbfb44187: Pushed
 45f70bf18a086: Pushed
 5a3b5c80a4eba: Pushed
 67f18b442972b: Pushed
 73ce512daaf78: Pushed
 87aae4540b42d: Pushed
 9
10...

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

New Docker image listing on Docker Hub

如果推试导致此类错误,那么您可能没有登录:

1[secondary_label Output]
2The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
3e3fbbfb44187: Preparing
45f70bf18a086: Preparing
5a3b5c80a4eba: Preparing
67f18b442972b: Preparing
73ce512daaf78: Preparing
87aae4540b42d: Waiting
9unauthorized: authentication required

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

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

结论

在本教程中,您安装了Docker,使用了图像和容器,并将修改的图像推到Docker Hub。

Published At
Categories with 技术
comments powered by Disqus