Ubuntu Docker 实践指南:安装、容器管理与 Docker Hub 集成

本文详细介绍了在 Ubuntu 系统上安装 Docker Community Edition (CE) 的步骤,并深入讲解了 Docker 镜像和容器的基础操作。内容涵盖了从 Docker 安装、无 sudo 运行、镜像拉取与管理、容器创建与交互、本地更改提交为新镜像,到将自定义镜像推送到 Docker Hub 的完整流程。此外,文章还对比了 Docker CLI 与 Docker Compose 的应用场景,提供了常见问题排查方案,并介绍了 Docker Desktop 和 Dockerfile 安装方法,最后给出了 Docker 卸载指南。帮助开发者在 Ubuntu 环境下高效利用 Docker 进行应用容器化。

引言

Docker 是一款强大的工具,极大地简化了应用程序容器(Container)的管理。容器允许您在资源隔离的进程中运行应用程序,它们类似于传统的虚拟机(VM),但更加轻量、便携,并且与宿主操作系统(Host OS)共享内核。本教程将详尽指导您如何在 Ubuntu 系统上安装 Docker Community Edition (CE),并逐步学习其核心概念,包括容器(Containers)、镜像(Images)的使用,以及如何将您构建的镜像推送到 Docker Hub。

先决条件

在开始安装 Docker 之前,请确保满足以下条件:

  • 一台已按照 Ubuntu 服务器初始设置指南 配置好的 Ubuntu 服务器,其中包含一个具备 sudo 权限的非 root 用户并已配置防火墙。
  • 如果您计划创建并将自己的 Docker 镜像推送到 Docker Hub(即本文的第 7 和第 8 步),您需要拥有一个 Docker Hub 账户

1. 安装 Docker

为了确保获取最新版本的 Docker,我们将从官方 Docker 仓库进行安装。

  1. 首先,更新您当前系统的软件包列表:
    sudo apt update
    
  2. 安装允许 apt 通过 HTTPS 使用软件包的必要组件:
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    
  3. 将官方 Docker 仓库的 GPG 密钥添加到您的系统,以验证下载的软件包的真实性:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  4. 将 Docker 仓库添加到 APT 源列表:
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
    
  5. 通过 apt-cache policy 命令验证 docker-ce 将从 Docker 的 Ubuntu 仓库安装:
    apt-cache policy docker-ce
    
    输出结果应显示 docker-ce 的候选版本(Candidate)来自 Docker Ubuntu 仓库。
  6. 执行安装 Docker Engine 的命令:
    sudo apt install docker-ce
    
  7. 检查 Docker 服务是否已成功启动并正在运行:
    sudo systemctl status docker
    
    输出应显示服务状态为 active (running),表明 Docker 守护进程(Daemon)已正常工作。

2. 无需 Sudo 执行 Docker 命令(可选)

默认情况下,docker 命令只能由 root 用户或 docker 用户组中的用户运行。为了避免每次运行 docker 命令时都输入 sudo,您可以将当前用户添加到 docker 用户组中:

sudo usermod -aG docker ${USER}

要使新的组成员资格生效,您需要注销并重新登录当前会话,或者执行以下命令:

su - ${USER}

系统会提示您输入用户密码。登录后,可以通过 groups 命令验证您是否已成功添加到 docker 用户组:

groups

重要提示: 将用户添加到 docker 组会授予其对 Docker 守护进程(Docker Daemon)的 root 级别访问权限。因此,请务必仅将您信任的用户添加到此组中。

3. Docker 命令基础

docker 命令的基本语法结构是:docker [选项] [命令] [参数]

  • 要查看所有可用的子命令,可以直接运行:
    docker
    
  • 要了解特定 docker 命令的可用选项和用法,可以使用 --help 标志:
    docker docker-subcommand --help
    
    例如,docker run --help 将显示 run 命令的详细帮助信息。
  • 要查看当前系统范围内的 Docker 相关信息,包括客户端和服务端版本、存储驱动、运行时等:
    docker info
    

4. 使用 Docker 镜像(Images)

Docker 容器(Containers)都是基于 Docker 镜像(Images)构建的。默认情况下,Docker 会从官方的 Docker Hub 拉取这些镜像。

  1. 通过运行 hello-world 镜像来测试 Docker 是否正常工作:
    docker run hello-world
    
    如果 hello-world 镜像不存在,Docker 会首先从 Docker Hub 下载该镜像,然后运行一个容器并显示一条测试消息,表明安装成功。
  2. 在 Docker Hub 上搜索您感兴趣的镜像,例如搜索 Ubuntu 镜像:
    docker search ubuntu
    
  3. 下载官方的 ubuntu 基础镜像到您的本地计算机:
    docker pull ubuntu
    
  4. 查看所有已下载到您本地计算机的 Docker 镜像:
    docker images
    

5. 运行 Docker 容器(Containers)

Docker 容器可以以交互模式运行。例如,使用最新的 ubuntu 镜像运行一个容器,并获取一个交互式的 Shell 访问:

docker run -it ubuntu

一旦容器启动,您的命令提示符(Prompt)会发生变化,表明您已进入容器内部工作环境(例如 root@d9b100f2f636:/#)。

在容器内部,您可以像在常规 Linux 系统中一样运行任何命令,通常无需 sudo。例如,更新软件包数据库并安装 Node.js:

apt update
apt install nodejs
node -v

请注意:您在容器内部所做的任何更改仅适用于该容器实例。要退出容器并返回到宿主机的 Shell,只需在容器的提示符处输入 exit

6. 管理 Docker 容器

随着您的使用,您的计算机上可能会有许多活动的和非活动的 Docker 容器。

  • 查看当前正在运行的活动容器
    docker ps
    
  • 查看所有容器(包括活动的和已停止的):
    docker ps -a
    
  • 查看您最近创建的最新容器
    docker ps -l
    
  • 启动一个已停止的容器(可以使用容器 ID 或其自动分配的名称):
    docker start 1c08a7a0d0e4
    
  • 停止一个正在运行的容器(同样使用容器 ID 或名称):
    docker stop quizzical_mcnulty
    
  • 删除一个不再需要的容器:
    docker rm youthful_curie
    
    在创建新容器时,您可以使用 --name 选项为容器指定一个易于记忆的名称,或者使用 --rm 选项在容器停止时自动删除它,避免产生大量无用容器。

7. 将容器中的更改提交到 Docker 镜像

当您启动一个 Docker 镜像并进入其容器实例后,您可以在其中创建、修改和删除文件,就像操作一台虚拟机一样。然而,这些更改默认只存在于该容器实例中。若要将容器的当前状态保存为新的 Docker 镜像,您可以使用 docker commit 命令:

docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
  • -m 选项用于添加提交信息(Commit Message),说明您对镜像所做的更改。
  • -a 选项用于指定作者信息。
  • container_id 是您之前启动交互式 Docker 会话时获得的容器 ID。
  • repository 通常是您的 Docker Hub 用户名,用于标识镜像的归属。

例如,如果您在容器 d9b100f2f636 中安装了 Node.js,并希望将其保存为新镜像:

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

这个新的镜像将被保存到您的本地计算机上。再次执行 docker images 命令时,您将看到这个新的镜像及其派生的旧镜像。

8. 将 Docker 镜像推送到 Docker 仓库

在本地创建或修改了新的 Docker 镜像后,您可以将其推送到 Docker Hub 或其他兼容的 Docker 注册表(Registry),以便与他人共享或进行云端部署。

  1. 首先,登录到 Docker Hub:
    docker login -u docker-registry-username
    
    系统会提示您输入您的 Docker Hub 密码。
  2. 如果您的 Docker Hub 用户名与您创建镜像时使用的本地 repository 名称(例如 sammy)不同,您需要使用 docker tag 命令为您的镜像打上正确的标签(Tag):
    docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
    
    这会将本地镜像 sammy/ubuntu-nodejs 标记为 docker-registry-username/ubuntu-nodejs,使其符合您 Docker Hub 仓库的命名规范。
  3. 最后,使用 docker push 命令推送您的镜像到 Docker Hub:
    docker push docker-registry-username/docker-image-name
    
    例如:
    docker push sammy/ubuntu-nodejs
    
    推送完成后,该镜像应该会列在您的 Docker Hub 账户仪表板上。现在,其他用户就可以通过 docker pull sammy/ubuntu-nodejs 命令来拉取并使用您的镜像了。

Docker 与 Docker Compose 的区别

尽管 Docker 允许您构建和运行单个容器,但当您需要管理由多个服务(如 Web 服务器、数据库、缓存等)组成的多容器应用程序时,手动操作会变得非常繁琐。Docker Compose 正是为了解决这一问题而设计的。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个 YAML 文件(通常命名为 docker-compose.yml)来配置应用程序的所有服务。您只需在该文件中定义各个服务及其相互依赖关系,然后使用 docker-compose up 命令即可一键启动整个应用程序栈。

下表对比了 Docker CLI 和 Docker Compose 的主要区别:

功能 Docker CLI Docker Compose
主要用途 单容器(Single Container)操作 多容器(Multi-Container)编排
配置方式 命令行参数(CLI Commands) YAML 配置文件 (docker-compose.yml)
依赖处理 手动管理服务启动顺序和依赖 自动处理关联服务的启动和停止顺序
最佳用例 测试隔离容器、执行一次性任务 本地开发环境、多服务应用集成测试

常见 Docker 安装问题排查

在使用 Docker 的过程中,您可能会遇到一些常见问题。以下是针对这些问题的一些排查与修复建议:

  • 问题:docker: command not found
    • 修复: 这通常意味着 Docker CLI 工具不在您的系统 $PATH 环境变量中,或者 Docker 安装不完整。您可以尝试重新安装 Docker 或确保 /usr/bin 路径已包含在您的 $PATH 中。
    sudo apt install docker-ce docker-ce-cli containerd.io
    
  • 问题:Cannot connect to the Docker daemon
    • 修复: 出现此错误通常是因为 Docker 守护进程(Docker Daemon)未运行,或者当前用户不在 docker 用户组中,没有足够的权限连接到守护进程。
    sudo systemctl start docker          # 启动 Docker 服务
    sudo usermod -aG docker $USER        # 将当前用户添加到 docker 组
    
    执行第二条命令后,请务必注销(Logout)并重新登录(Login)您的会话,以使新的用户组权限生效。
  • 问题:GPG 密钥或仓库错误
    • 修复: 如果 Docker GPG 密钥服务器或密钥本身发生了变化,您在添加仓库时可能会遇到问题。遇到此类情况,请务必参考 Docker 官方文档 获取最新的 GPG 密钥和仓库添加步骤。官方文档始终是解决这类问题的最权威来源。

Ubuntu 上的 Docker Desktop (Beta)

Docker Desktop 是一款包含 GUI 界面、捆绑的 Docker Engine 和 Kubernetes 支持的桌面应用程序。目前,它也已在 Linux 发行版(包括 Ubuntu)上推出测试版。

安装 Docker Desktop:

sudo apt install ./docker-desktop-<version>-<arch>.deb

重要提示: Docker Desktop 主要设计用于开发环境,不推荐在生产服务器上使用。对于服务器端或无头(headless)环境,强烈建议您继续使用传统的 Docker CE(Community Edition)。

使用 Dockerfile 自动化安装 Docker

对于自动化部署或需要定制化环境的场景,您可以使用 Dockerfile 来定义和构建一个包含 Docker 本身的镜像。这在 CI/CD 流程中非常有用。以下是一个示例 Dockerfile,用于在 Ubuntu 20.04 基础镜像上安装 Docker:

FROM ubuntu:20.04

RUN apt-get update && \
    apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
    add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" && \
    apt-get update && \
    apt-get install -y docker-ce docker-ce-cli containerd.io

如何在 Ubuntu 上卸载 Docker

如果您需要从系统中完全移除 Docker 及其相关组件,请按照以下步骤操作:

sudo apt purge docker-ce docker-ce-cli containerd.io  # 卸载 Docker 软件包
sudo rm -rf /var/lib/docker                         # 删除 Docker 的数据目录
sudo rm -rf /var/lib/containerd                     # 删除 containerd 的数据目录

如果您之前已将用户添加到 docker 用户组,可能还需要删除该组:

sudo groupdel docker

结论

本教程详细介绍了在 Ubuntu 系统上安装和使用 Docker 的完整过程,涵盖了从 Docker Engine 的安装、基本的容器管理、镜像操作到与 Docker Hub 集成的核心知识。此外,文章还探讨了 Docker CLI 与 Docker Compose 的不同应用场景,并提供了常见的故障排查指南。掌握这些技能将为您基于容器(Container-based)的应用开发、部署和管理奠定坚实的基础。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计