Docker 入门第一课:从架构、云服务器到安装完成

Docker 入门第一课:从架构、云服务器到安装完成

Docker 速通系列第 1 篇

本文合并课程:02|Docker 架构与容器化、03|购买云服务器、04|停机不收费、05|安装 Docker

刚开始学 Docker 时,很多人会直接背命令:docker pulldocker rundocker ps。命令暂时能跑,但只要换一台机器,或者遇到镜像、端口、服务启动问题,就不知道该从哪里查。

这一篇我们先把地基打好。你会弄清 Docker CLI、Docker Daemon、Image 和 Container 的关系,然后准备一台 Linux 云服务器,最后按照 Docker 官方方式完成安装和验证。

先看结论

先记住这条主线:

text 复制代码
你输入命令
  → Docker CLI 把请求交给 Docker Daemon
  → Docker Daemon 拉取或读取 Image
  → Docker Daemon 根据 Image 创建 Container

Image 是只读模板,Container 是镜像启动后的运行实例。Registry 用来保存和分享镜像,Docker Hub 是常见的公共 Registry。

图:Docker CLI 负责接收命令,真正创建和管理容器的是 Docker Daemon。

Docker 到底由什么组成?

一台安装并运行 Docker Engine 的机器,通常叫 Docker Host。我们先认识三个核心角色。

Docker CLI:你使用的命令入口

平时输入的 docker 命令属于 Docker CLI,也就是命令行客户端。例如:

bash 复制代码
docker pull nginx
docker run nginx

CLI 本身不负责运行容器。它会通过 Docker API 把请求发给 Docker Daemon。

Docker Daemon:真正干活的后台服务

Docker Daemon 的进程名是 dockerd。它负责管理镜像、容器、网络和数据卷。

你执行 docker run nginx 时,Daemon 会检查本地有没有需要的镜像。本地没有时,它通常会先从配置的 Registry 拉取镜像,然后再创建容器。

Registry:保存镜像的仓库服务

Registry 可以理解为镜像的集中存放位置。Docker Hub 是 Docker 默认使用的公共 Registry,企业也可以使用私有 Registry。

这里还要区分两个词:

  • Registry:提供镜像存储和分发服务的平台。
  • Repository:Registry 中用于组织某一组相关镜像的仓库。

Image 和 Container 有什么区别?

这个区别一定要先弄懂。

Image:创建容器的只读模板

Image(镜像)通常包含应用程序、依赖、文件系统和默认启动配置。你可以把它理解成一份可重复使用的应用模板。

text 复制代码
nginx:latest
redis:latest
mysql:8.4

标签是镜像名称的一部分。没有写标签时,Docker 默认使用 latest,但 latest 只是一个标签名,不保证永远代表最新版本。

Container:镜像的运行实例

Container(容器)是镜像启动后的可运行实例:

bash 复制代码
docker run nginx

同一个镜像可以创建多个容器。它们使用相同模板启动,但各自拥有独立的运行状态和默认可写层。

图:Image 是可重复使用的模板,Container 是由模板创建的运行实例。

容器不是一台完整虚拟机。它可以拥有独立的进程、网络、挂载和资源限制,但底层仍与宿主机共享内核。

为什么还需要容器化?

如果把多个应用直接安装在同一套操作系统里,它们可能依赖不同版本的软件包,也可能争抢 CPU、内存和端口。时间一长,环境就很难维护。

虚拟机能提供更完整的隔离,但每台虚拟机通常需要自己的操作系统,启动和资源开销更大。

容器化提供了另一种选择:

  • 把应用和依赖一起打包。
  • 为应用提供相对隔离的运行环境。
  • 共享宿主机内核,启动通常更快。
  • 同一个镜像可以在不同 Docker 主机上重复运行。

注意,"使用容器"不等于"天然绝对安全"。生产环境仍要配置资源限制、网络边界、最小权限和镜像更新策略。

准备一台 Linux 云服务器

如果你已经有 Linux 机器,可以直接跳到安装部分。没有本地 Linux 环境时,可以使用阿里云轻量应用服务器完成这一组实验。

入门配置怎么选?

本文使用下面这套实际配置:

  • 产品:阿里云轻量应用服务器
  • 地域:华南 3(广州)
  • 计费方式:包年包月,购买 12 个月
  • CPU:2 vCPU
  • 内存:2 GiB
  • 系统盘:40 GiB
  • 系统镜像:Ubuntu 24.04
  • 公网网络:1 个 IPv4 地址,200 Mbps 峰值 BGP 公网带宽
  • 流量:购买页显示"不限流量"

截图中的优惠价格是 12 个月 ¥68,原价显示为 ¥459。活动价格、可购买次数、地域和套餐内容可能变化,请以实际下单页和服务协议为准。阿里云官方说明:轻量应用服务器套餐采用包年包月计费;购买页显示"无固定流量"时,不产生超额流量费用。

这套配置足够完成 Nginx、镜像、容器和 Docker Hub 入门实验,但它不是生产环境容量建议。

操作系统怎么选?

原课程使用 CentOS 7.9 演示,但 CentOS Linux 7 已在 2024 年 6 月 30 日结束维护,不适合继续作为新服务器的默认选择。

本文使用 Ubuntu 24.04 LTS 演示。你也可以选择 Docker 官方当前支持的其他 Linux 版本,但安装命令要跟着发行版调整。

轻量服务器防火墙只放行需要的端口

阿里云轻量应用服务器控制台使用"防火墙"管理公网访问规则。你可以把它理解成服务器外层的端口访问清单。基础实验常见端口包括:

  • 22:SSH 登录
  • 80:HTTP
  • 443:HTTPS
  • 80808081:后续 Nginx 端口映射实验

不要为了省事开放所有端口。实验需要哪个端口,就只放行哪个端口,并限制来源范围。

创建实例时检查什么?

提交订单前,逐项确认:

text 复制代码
[ ] 阿里云轻量应用服务器
[ ] 华南 3(广州)
[ ] 包年包月 12 个月
[ ] Ubuntu 24.04
[ ] 2 vCPU / 2 GiB / 40 GiB 系统盘
[ ] 购买页显示不限流量
[ ] 已分配公网 IP
[ ] 轻量服务器防火墙已放行 SSH 端口
[ ] 登录凭据已安全保存
[ ] 已确认是否开启自动续费

不要把真实密码、访问令牌或私钥写进文章、截图和代码仓库。

使用 SSH 连接服务器

实例创建完成后,复制当前公网 IP。常见连接命令是:

bash 复制代码
ssh root@你的公网IP

有些云镜像默认使用 ubuntu 等普通用户:

bash 复制代码
ssh ubuntu@你的公网IP

第一次连接时,SSH 会显示服务器指纹。先确认 IP 和实例信息无误,再接受指纹。

登录后执行:

bash 复制代码
whoami
cat /etc/os-release
uname -m

这三条命令分别确认当前用户、Linux 发行版和 CPU 架构。先确认环境,再复制安装命令。

包年包月服务器关机能省套餐费用吗?

不能。本文使用的是阿里云轻量应用服务器包年包月套餐,费用在购买时按使用期限预先支付。你手动关机以后,套餐有效期仍然继续计算,不会因为服务器进入"已停止"状态而暂停或按小时退款。

这里要区分"运行状态"和"计费周期":

  • 运行中:服务器可以接受 SSH 和网页访问。
  • 已停止:服务中断,但包年包月套餐仍在有效期内。
  • 已到期:实例自动停机并进入数据保留期。
  • 到期后未续费:超过官方保留期限,实例、快照和自定义镜像可能被自动释放且无法恢复。

图:手动关机只改变运行状态,不会暂停包年包月套餐的有效期。

阿里云当前说明中,轻量应用服务器到期后会自动停机,数据保留 15 天;如果仍未续费,服务器及其快照和自定义镜像会被永久删除。不要把这 15 天当成备份方案,重要数据应该提前导出。

这类轻量应用服务器默认配置一个公网 IP,阿里云当前说明是该 IP 不支持更换,实例到期后也不能保留。普通的手动停止和再次启动不会因为这个操作自动换 IP;如果更换了服务器实例,才需要同步更新 SSH 和域名解析。

text 复制代码
运行中 → 手动停止 → 套餐周期继续 → 再次启动
到期未续费 → 停机保留 15 天 → 仍未续费 → 资源和数据释放

在 Ubuntu 24.04 安装 Docker Engine

下面使用 Docker 官方 apt 软件源安装。命令需要管理员权限。

第一步:移除可能冲突的软件包

bash 复制代码
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
  sudo apt-get remove -y "$pkg"
done

全新服务器通常没有这些包。看到某个包未安装,不影响后续步骤。

第二步:添加 Docker 官方软件源

bash 复制代码
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

接着写入软件源配置:

bash 复制代码
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt-get update

不要从来源不明的网站复制一键安装脚本。软件源地址和 GPG 密钥都应该来自 Docker 官方域名。

第三步:安装 Docker Engine

bash 复制代码
sudo apt-get install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin

这些包分别提供 Docker Engine、CLI、容器运行时、Buildx 和 Compose 插件。

第四步:检查服务

bash 复制代码
sudo systemctl status docker

如果服务没有运行,执行:

bash 复制代码
sudo systemctl start docker
sudo systemctl enable docker

第五步:运行测试容器

bash 复制代码
sudo docker version
sudo docker run --rm hello-world

hello-world 能正常输出确认信息,说明 Docker 已完成镜像拉取、容器创建和运行这条基本链路。

图:安装完成后要同时检查 Docker 服务、客户端与测试容器。

本文后续命令为了阅读简洁,会写成 docker ...。如果你还没有配置非 root 用户权限,请继续使用 sudo docker ...

权限提醒: 把用户加入 docker 组,基本等同于授予该用户宿主机上的 root 级控制能力。共享服务器上不要把不可信用户加入该组。

镜像加速需要注意什么?

Docker 默认从 Docker Hub 拉取镜像。如果所在网络访问较慢,可以使用云厂商或组织提供的可信镜像服务。

Docker Daemon 的常见配置文件是:

text 复制代码
/etc/docker/daemon.json

配置示例:

json 复制代码
{
  "registry-mirrors": [
    "https://你的可信镜像加速地址"
  ]
}

地址必须来自可信服务,并以当前控制台说明为准。修改后先检查 JSON 格式,再重启 Docker:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker ps

如果 Docker 无法启动,先查看配置和日志:

bash 复制代码
sudo cat /etc/docker/daemon.json
sudo journalctl -u docker --no-pager -n 50

常见问题

浏览器访问不到容器

先不要急着重装 Docker。后续做端口映射时,需要同时检查:

  1. 容器是否正在运行。
  2. docker run 是否发布了正确端口。
  3. 系统防火墙是否允许该端口。
  4. 阿里云轻量服务器防火墙是否允许该端口。

服务器重启后 Docker 没有运行

bash 复制代码
sudo systemctl enable docker
sudo systemctl start docker

停机后 SSH 连不上

先查看实例是否已经恢复到"运行中",再确认轻量服务器防火墙是否放行 22,最后核对控制台显示的公网 IP。

命令速查表

目的 命令
查看系统 cat /etc/os-release
查看架构 uname -m
查看 Docker 服务 sudo systemctl status docker
启动 Docker sudo systemctl start docker
设置开机启动 sudo systemctl enable docker
查看版本 sudo docker version
运行测试容器 sudo docker run --rm hello-world
查看容器 sudo docker ps

总结

  • Docker CLI 接收命令,Docker Daemon 负责管理镜像、容器、网络和数据卷。
  • Image 是只读模板,Container 是镜像创建出的运行实例。
  • 本文使用阿里云轻量应用服务器:Ubuntu 24.04、2 vCPU、2 GiB、40 GiB 系统盘。
  • 轻量应用服务器是包年包月套餐,手动关机不会暂停套餐有效期。
  • CentOS Linux 7 已停止维护,新环境应选择当前受支持的系统。
  • 安装完成不能只看命令是否结束,还要检查服务并运行 hello-world

官方参考

Docker 速通系列:

  1. Docker 架构、云服务器与安装
  2. Docker 镜像操作
  3. Docker 容器操作
  4. docker run 详解
  5. Docker 镜像保存与迁移
  6. 分享镜像到 Docker Hub
  7. Docker 实验小结
相关推荐
M78佐菲1 小时前
Linux学习笔记:目录IO与帧缓冲
linux·笔记·学习·算法
三8441 小时前
WordPress SQL 注入漏洞分析:从 author__not_in 参数到 REST API 全链路
linux·前端·数据库
MX_93591 小时前
Docker入门
运维·docker·容器
SCandL1521 小时前
k8s工作原理
linux·运维·服务器
weixin_444579301 小时前
Rockylinux 与 K8s 的安装
linux·云原生·容器·kubernetes
听风3471 小时前
Arch Linux 包管理 TUI 工具集
linux·服务器·archlinux
Interview Aid1121 小时前
Akuna OA 题目拆解|三题思路复盘
linux·运维·算法·面试·职场和发展
聚搜云——JuSouClouD1 小时前
上海阿里云代理商(聚搜云)分享:ECS 服务器 CPU 跑满 100%,如何找到占用高的进程
服务器·阿里云·云计算
qq21084629531 小时前
Ubuntu 磁盘空间清理实战:从 Docker 到 VirtualBox 的完整指南
linux·ubuntu·docker