Docker 入门实战:在 Ubuntu 22.04 上安装与深度应用指南

在现代软件开发中,环境一致性一直是我们面临的最大挑战之一。你是否也曾遇到过这样的情况:代码在你的本地机器上完美运行,但一旦部署到测试或生产环境,就会因为依赖库版本、操作系统配置等差异而出现各种莫名其妙的错误?这正是 Docker 诞生的契机。作为一名开发者,掌握 Docker 已经不再是一项“可选”技能,而是通往高效 DevOps 实践的必经之路。

在这篇文章中,我们将深入探讨如何在 Ubuntu 22.04 系统上从零开始安装 Docker,并不仅仅止步于简单的安装步骤,我们还会剖析 Docker 的核心概念,通过实际代码演示如何构建、运行和管理容器。我们希望这篇指南能成为你 Docker 旅程的坚实起点,让你不仅能“用起来”,还能“懂原理”。

什么是 Docker?

简单来说,Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

你可能会有疑问:“Docker 和传统的虚拟机(VM)有什么区别?” 这是一个非常好的问题。传统的虚拟机需要模拟整台硬件设备,并在其上运行一个完整的操作系统,这非常消耗资源。而 Docker 容器则是直接共享宿主机的内核,它不需要运行完整的操作系统,只需要打包应用代码和运行时所需的依赖库。这意味着容器启动速度极快(通常是秒级),且占用的磁盘空间和内存也非常小。

核心概念:我们需要掌握的术语

在开始动手之前,我们需要先达成语言上的共识。Docker 有几个核心术语,贯穿了我们日常使用的所有环节:

  • 镜像: 你可以把镜像想象成是一个“只读”的模板。比如,一个 Ubuntu 系统的镜像,或者一个安装了 Nginx 服务的镜像。它是构建容器的基石。镜像采用了分层存储的机制,这使得构建和分发变得极其高效。
  • 容器: 如果镜像是“类”,那么容器就是“实例”。容器是镜像运行时的实体。它被启动后,会在镜像层之上增加一个“可写层”。我们在容器里做的所有修改(如写文件、安装软件),如果不提交成新的镜像,在容器删除后都会丢失。这也是容器“无状态”特性的体现。
  • Docker Hub: 这是全球最大的镜像仓库,就像是容器的“App Store”。我们可以从这里拉取现成的镜像(如 MySQL, Redis, Node.js 等),也可以将自己的镜像推送上去供团队或社区使用。
  • Dockerfile: 这是一个文本文件,里面包含了一系列构建镜像的指令。它定义了镜像“长什么样”,比如基于哪个基础镜像、需要安装什么软件、需要复制什么文件、启动时执行什么命令等。学会编写 Dockerfile 是掌握 Docker 的关键。

前置准备

为了确保后续步骤顺利进行,请确保你的环境满足以下条件:

  • 操作系统: 一台运行 Ubuntu 22.04 LTS(Jammy Jellyfish)的计算机或虚拟机。
  • 权限: 一个具有 sudo 权限的用户账户,因为安装软件和修改系统配置需要管理员权限。
  • 网络: 能够访问互联网,以便从官方仓库下载软件包。

在 Ubuntu 22.04 上安装 Docker 的详细步骤

虽然 Ubuntu 的默认仓库中通常也包含 Docker 软件包,但版本往往不是最新的。为了获得最新的特性和安全补丁,我们强烈建议从 Docker 的官方 APT 仓库进行安装。以下是经过验证的完整流程。

步骤 1:更新系统软件包索引

在安装任何新软件之前,保持系统处于最新状态是一个良好的习惯。这可以防止因旧版本依赖包导致的冲突。

在终端中运行以下命令:

# 更新 apt 包索引
sudo apt update

# 升级已安装的包(可选,但推荐)
sudo apt upgrade -y

步骤 2:设置 Docker 的官方 APT 仓库

为了让系统信任并连接到 Docker 的官方源,我们需要做两件事:添加 GPG 密钥和添加软件源地址。

首先,安装必要的依赖包并添加 Docker 的官方 GPG 密钥。GPG 密钥用于验证软件包的真实性,防止中间人攻击:

# 1. 安装必要的依赖包:ca-certificates 用于证书验证,curl 用于下载文件
sudo apt-get install ca-certificates curl

# 2. 创建存放 GPG 密钥的目录
sudo install -m 0755 -d /etc/apt/keyrings

# 3. 下载 Docker 的官方 GPG 密钥并保存到指定文件
# -fsSL 参数的含义:
# -f: 失败时静默(不显示错误页面)
# -s: 显示进度条
# -S: 显示错误
# -L: 跟随重定向
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# 4. 修改密钥文件的权限,使其对所有用户可读
sudo chmod a+r /etc/apt/keyrings/docker.asc

接下来,我们将 Docker 仓库添加到系统的 apt 源列表中:

# 向 /etc/apt/sources.list.d/docker.list 写入仓库地址
# 这里的逻辑是:自动检测系统架构(如 amd64)和版本代号(如 jammy),动态生成仓库地址
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu/ \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 再次更新 apt 包索引,让系统知道新的软件源
sudo apt-get update

步骤 3:安装 Docker 引擎及组件

现在源已经配置好了,我们可以开始安装 Docker 核心组件了。这个命令会安装以下内容:

  • docker-ce: Docker 社区版引擎。
  • docker-ce-cli: Docker 命令行界面,允许我们通过终端控制 Docker。
  • containerd.io: 容器运行时,真正负责运行容器的底层组件。
  • docker-buildx-plugin: 增强的构建工具,支持多平台构建。
  • docker-compose-plugin: Docker Compose V2 版本,用于管理多容器应用。
# 安装最新版本的 Docker 软件包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

步骤 4:验证安装与运行状态

安装完成后,Docker 服务通常会自动启动。为了确保万无一失,我们可以手动检查一下它的状态。

# 查看 Docker 服务的运行状态
sudo systemctl status docker

如果输出中显示 Active: active (running) 并且是绿色的,说明 Docker 已经成功运行。你可以按 q 键退出这个状态界面。

深入 Docker:基础命令与实战

安装只是第一步,理解如何操作才是关键。现在,让我们通过一系列实战命令来熟悉 Docker 的日常工作流。

1. 信息查看:确认环境

首先,我们可以查看 Docker 的详细信息,包括版本、操作系统、内核等。这在排查问题时非常有用。

# 查看详细的系统信息
sudo docker version

2. Hello World:第一次运行容器

在 Docker 世界里,传统的“Hello World”就是运行一个测试镜像。这个镜像非常小,执行后会打印一条消息并退出。

# 运行 hello-world 容器
sudo docker run hello-world

它是如何工作的?

  • Docker 客户端(CLI)调用 Docker 守护进程(Daemon)。
  • 守护进程在本地查找 hello-world 镜像。
  • 如果本地没有(第一次运行肯定没有),它会从 Docker Hub 拉取该镜像。
  • 守护进程基于该镜像创建了一个新的容器,并执行了其中的启动程序。
  • 程序输出消息后,容器终止。

3. 拉取镜像:提前准备

有时我们只想下载镜像而不想立即运行它,这时可以使用 pull 命令。

# 从 Docker Hub 拉取 Ubuntu 22.04 镜像
sudo docker pull ubuntu:22.04

4. 交互式运行:进入容器内部

如果我们想在一个容器里执行命令,比如进入 Ubuntu 容器安装一个 INLINECODE7db12169 编辑器,我们需要使用 INLINECODE69de4a57 参数。

  • -i (interactive): 保持标准输入打开。
  • -t (tty): 分配一个伪终端。
# 启动一个 Ubuntu 容器并进入其命令行
# --name 给容器起个名字叫 "my-ubuntu"
# 运行结束后,输入 exit 即可退出容器
sudo docker run -it --name my-ubuntu ubuntu:22.04 /bin/bash

进入后,你会发现命令行提示符变了,你现在就处于容器内部!这是一个完全隔离的环境。你可以尝试安装软件、创建文件,退出后再重新进入(如果之前没有删除容器),你会发现之前的修改还在(除非你使用了 --rm 参数)。

5. 容器管理:查看与清理

随着我们不断尝试,系统中可能会残留许多停止的容器,占用磁盘空间。以下是常用的管理命令:

# 列出当前正在运行的容器
sudo docker ps

# 列出所有容器(包括已停止的)
sudo docker ps -a

# 启动一个已停止的容器
sudo docker start 

# 停止一个正在运行的容器
sudo docker stop 

# 删除一个容器(必须先停止)
sudo docker rm 

# 强制删除正在运行的容器(危险,慎用)
sudo docker rm -f 

常见问题与解决方案(FAQ)

在初次使用 Docker 时,你可能会遇到一些常见的“坑”。让我们来看看如何解决它们。

1. 权限不足:为什么要 sudo?

你可能厌倦了每次输入 Docker 命令都要加 INLINECODEe0b435a1。这是因为 Docker 守护进程默认绑定到 Unix socket (INLINECODE1a5ab220) 而不是 TCP 端口,默认情况下只有 INLINECODE88834ae7 用户和 INLINECODE356925c5 组的用户才能访问这个 socket。

解决方案:

将你的用户添加到 docker 用户组中。

# 1. 创建 docker 组(通常安装时已自动创建)
sudo groupadd docker

# 2. 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 3. 更新组 membership(必须)
newgrp docker 

# 4. 测试:现在运行 docker 应该不需要 sudo 了
docker run hello-world

2. 端口冲突:Web 应用无法访问?

如果你运行一个 Nginx 容器却发现浏览器无法访问,通常是因为没有做端口映射。容器内部有自己的网络,外部无法直接访问。

解决方案:

使用 INLINECODE4c7e02e9 参数将容器端口映射到宿主机端口。格式为 INLINECODE277ff6ee。

# 运行 Nginx,并将容器的 80 端口映射到主机的 8080 端口
# 浏览器访问 localhost:8080 即可看到 Nginx 欢迎页
docker run -d -p 8080:80 nginx

3. 磁盘空间不足?

Docker 会占用大量磁盘空间,尤其是镜像和容器多了之后。

解决方案:

使用清理命令。

# 清理所有未使用的镜像、构建缓存、容器(谨慎使用)
docker system prune -a

总结与下一步

经过上面的步骤,我们已经在 Ubuntu 22.04 上成功搭建了 Docker 环境,并学习了如何拉取镜像、运行容器以及进行基本的故障排查。Docker 的强大之处在于它将复杂的部署流程标准化了,我们不再需要说“它在我机器上能跑”,因为现在“它在我的容器里能跑”就等于“在任何地方都能跑”。

这仅仅是个开始。为了进一步提升你的技能,我们建议你接下来尝试以下挑战:

  • 编写一个 Dockerfile: 尝试为你自己的 Web 项目编写一个 Dockerfile,学习如何定制镜像。
  • 数据持久化: 研究 Volume(数据卷),学习如何将容器中的数据保存在宿主机上,以免删容器数据就丢了。
  • 多容器编排: 学习 Docker Compose,尝试用一条命令同时启动一个 Web 服务和一个数据库服务。

希望这篇指南对你有所帮助,祝你在容器化的道路上越走越远!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/33559.html
点赞
0.00 平均评分 (0% 分数) - 0