总结
本文将在Ubuntu22.04环境中完成Docker的部署与测试
参考
什么是Docker
Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的 Linux 机器上运行。Docker 的核心思想打包装箱,每个箱子是互相隔离的,互不影响。
2010 年,几个搞 IT 的年轻人,在美国旧金山成立了一家名叫 dotCloud 的公司。dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。dotCloud 平台底层利用了 Linux 的 LXC 容器技术。
LXC 是 Docker 的底层基石,但是在 Docker 0.9 版本的时候,Docker引入了基于 Go 语言构建的 Libcontainer 的 execution driver。有了 Libcontainer 这个项目,Docker 不再需要依赖于 Linux 部件(LXC,libvirt,systemd-nspawn...)就可以处理 namespaces、control groups、capabilities、apparmor profiles、network interfaces。LXC 逐渐沦为可选项。
后来为了方便创建和管理这些容器,dotCloud 基于 Google 公司推出的 Go 语言开发了一套内部工具,之后被命名为 Docker。Docker 就是这样诞生的。
Docker 1.8 版本 中 LXC 被 弃用,在Docker 1.10版本LXC 彻底离开Docker。Docker 官方推出的Libcontainer 集成了 Linux 内核中的很多特性,成为一个独立、稳定且不受制于 Linux 的 Library。

2013 年 3 月,dotCloud 公司的创始人之一28 岁的 Solomon Hykes 正式决定,将 Docker 项目开源。
开源当月发布了 Docker 0.1 版本。此后的每一个月, Docker 都会发布一个迭代版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式发布了。

Docker 和传统虚拟化方式的不同,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

Docker的组成与作用
Docker平台由以下部分组成:
Docker守护进程(Docker daemon) :Docker采用 C/S架构。Docker daemon 作为服务端接受来自客户端的请求,并进行处理(创建、运行、分发容器)。
Docker客户端(Docker client) :Docker 客户端则用于与 Docker 守护进程通信,发送命令以管理容器。Docker采用 C/S架构。客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。Docker daemon一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon交互。
Docker镜像(Docker images) :Docker 镜像是用于构建 Docker 容器的静态文件,它包含了应用程序运行所需的所有文件、依赖项和配置信息。Docker 镜像可以从 Docker Hub 或其他镜像仓库中获取,也可以通过 Dockerfile 自定义构建。
Docker容器(Docker container) :Docker 容器是 Docker 镜像的运行实例,它包含了应用程序及其依赖项,并在隔离的环境中运行。每个容器都是一个独立的进程,拥有自己的文件系统、网络空间和进程空间。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
📌 举个例子:你用 Python 写了一个 Web 服务,依赖 Flask 2.0 和特定版本的 Redis。用 Docker 打包后,无论部署到本地、云服务器还是 CI/CD 流水线,行为都完全一致。
安装Docker
更新ubuntu
bash
sudo apt update #更新包管理器
sudo apt upgrade #更新 apt 缓存
# sudo apt full-upgrade 不要执行这个,可能存在问题
添加 Docker 库 依赖
bash
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

你安装的这些包,都是为了让系统能安全、稳定地添加和使用第三方软件源(比如 Docker、Kubernetes 等)的前置依赖包,下面逐个解释它们的作用:
| 包名 | 英文全称 | 核心作用 | 通俗类比 |
|---|---|---|---|
apt-transport-https |
APT Transport HTTPS | 让 apt 包管理器支持通过 HTTPS 协议下载软件包,解决了早期 apt 仅支持 HTTP 的限制。 |
给系统的"软件商店"装上了 HTTPS 加密通道,保证下载安全。 |
ca-certificates |
CA Certificates | 提供系统级的可信 SSL 证书颁发机构(CA)列表,用于验证 HTTPS 连接的合法性,防止中间人攻击。 | 给系统预装了"可信身份证",确保访问的 HTTPS 网站是真实可信的。 |
curl |
Command Line URL | 一个强大的命令行工具,用于在终端中发起 HTTP/HTTPS 请求,下载文件、测试接口等。 | 系统的"命令行浏览器",可以直接从网络拉取数据或文件。 |
software-properties-common |
Software Properties Common | 提供 add-apt-repository 等命令,方便用户添加、管理第三方软件源(PPA)。 |
系统的"软件源管理器",可以一键添加新的软件仓库。 |
gnupg |
GNU Privacy Guard | 用于加密、解密和数字签名,核心作用是验证软件包和软件源的 GPG 签名,确保来源可信、未被篡改。 | 系统的"数字验签工具",防止下载到被篡改的恶意软件。 |
lsb-release |
Linux Standard Base Release | 提供 lsb_release 命令,用于查询当前系统的发行版信息(如 Ubuntu 版本、Codename),很多第三方源配置脚本会依赖它。 |
系统的"身份证查询器",告诉其他软件"我是什么系统、什么版本"。 |
这是一个非常经典的前置操作,通常出现在安装 Docker、Kubernetes、Node.js 等软件的官方文档中:
- 安全基础 :
apt-transport-https+ca-certificates+gnupg保证了软件下载和验证的安全性。 - 源管理 :
software-properties-common让你能方便地添加官方软件源。 - 信息查询 :
lsb-release让脚本能自动适配你的系统版本。 - 工具依赖 :
curl用于下载 GPG 密钥或安装脚本。
从你的输出可以看到,这些包都已经是最新版本了,说明你的系统已经具备了添加和使用第三方软件源的完整能力。
输出中还提示了一些不再需要的旧内核包,可以用以下命令清理,释放磁盘空间:
bash
sudo apt autoremove

运行下列命令添加 Docker 的官方 GPG 密钥:
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
这条命令的核心作用:为Docker官方软件源添加可信GPG密钥
这条命令是Ubuntu系统中验证Docker官方软件源合法性的关键步骤,目的是让系统信任从Docker官方源下载的软件包,防止篡改或恶意包,下面拆解每一部分的作用和整体逻辑:
Ubuntu的apt包管理器在从第三方软件源(如Docker官方源)下载包时,会验证包的GPG签名:
- 只有签名能被系统"信任的密钥"验证通过,才会允许安装;
- 如果没有导入官方GPG密钥,后续添加Docker源后执行
apt update会报错(签名验证失败)。
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
| 分段 | 命令/参数 | 核心作用 | 通俗解释 |
|---|---|---|---|
| 1 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
下载Docker官方的GPG公钥文件 | curl:命令行下载工具 -f:失败时不返回错误页面 -s:静默模式(不显示下载进度) -S:静默模式下仍显示错误 -L:跟随重定向(确保下载到正确文件) 整体:从Docker官网下载验证软件包的"公钥" |
| 2 | ` | ` | 管道符 |
| 3 | sudo gpg --dearmor |
将GPG密钥从"ASCII文本格式"转换为"二进制格式" | Ubuntu的apt在/usr/share/keyrings/目录下只识别二进制格式的密钥(.gpg文件),--dearmor就是做格式转换的核心参数 |
| 4 | -o /usr/share/keyrings/docker-archive-keyring.gpg |
指定转换后的密钥文件保存路径和名称 | -o:输出文件 路径/usr/share/keyrings/是Ubuntu系统默认的"可信软件源密钥目录",文件名docker-archive-keyring.gpg是Docker官方约定的名称,便于后续识别 |
-
获取并存储可信密钥 :系统将Docker官方的GPG公钥以二进制格式保存在
/usr/share/keyrings/docker-archive-keyring.gpg; -
后续验证生效 :当你添加Docker官方软件源(如
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable)后,apt会用这个密钥验证从该源下载的Docker包:- 如果包的签名和密钥匹配 → 允许安装(确认是官方未篡改的包);
- 如果不匹配 → 拒绝安装(防止恶意包/篡改包)。
-
权限要求 :必须加
sudo,因为/usr/share/keyrings/是系统目录,普通用户无写入权限; -
格式转换是核心 :如果省略
--dearmor,直接保存的ASCII格式密钥会导致后续apt update报错(提示"key is not in keyring"); -
密钥位置 :Ubuntu 20.04/22.04推荐将密钥存在
/usr/share/keyrings/(而非旧版的/etc/apt/trusted.gpg.d/),更安全且符合新版规范。
添加Docker的APT源
接下来,将Docker的APT源添加到系统的源列表中:
bash
echo "deb [arch=amd64 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

这条命令是将Docker官方的软件源地址写入系统的源列表目录,让apt包管理器知道"去哪里下载正版Docker软件包",是安装Docker的核心前置步骤,下面拆解每一部分的作用和逻辑:
Ubuntu默认的软件源里没有Docker官方最新版(只有系统自带的旧版本),因此需要手动添加Docker官方APT源:
- 系统会把第三方源配置文件放在
/etc/apt/sources.list.d/目录下(.list后缀),apt update时会自动扫描这个目录的所有源; - 配置中必须关联之前导入的GPG密钥,确保下载的包能通过签名验证。
bash
echo "deb [arch=amd64 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
| 分段 | 命令/参数 | 核心作用 | 通俗解释 |
|---|---|---|---|
| 1 | echo "deb [arch=amd64 signed-by=...] stable" |
生成Docker源的配置文本 | 这是APT源的标准格式,拆解内部关键部分: ✅ deb:表示这是Debian系(Ubuntu)的软件源类型 ✅ arch=amd64:指定仅下载64位x86架构的包(适配主流服务器/虚拟机) ✅ signed-by=/usr/share/keyrings/docker-archive-keyring.gpg:关联之前导入的Docker GPG密钥,apt会用这个密钥验证包的合法性 ✅ https://download.docker.com/linux/ubuntu:Docker官方源的基础地址 ✅ $(lsb_release -cs):自动获取当前Ubuntu的版本代号(如22.04=jammy、20.04=focal),避免手动写死版本 ✅ stable:指定下载Docker的稳定版(可选:test/nightly) |
| 2 | ` | ` | 管道符 |
| 3 | sudo tee /etc/apt/sources.list.d/docker.list |
将配置文本写入指定文件 | ✅ tee:读取管道内容并写入文件(普通echo > 文件会因权限不足失败,tee配合sudo可写入系统目录) ✅ /etc/apt/sources.list.d/docker.list:Docker源的配置文件路径(系统约定目录,apt会自动识别) |
| 4 | > /dev/null |
重定向输出 | 屏蔽tee命令的输出日志(只执行操作,不打印内容),让终端更整洁 |
-
生成配置文件 :在
/etc/apt/sources.list.d/目录下创建docker.list文件,内容示例(以Ubuntu 22.04为例):deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable -
apt可识别Docker源 :执行sudo apt update时,系统会从Docker官方源同步包列表,后续就能通过sudo apt install docker-ce安装最新版Docker; -
安全验证生效 :因为配置中指定了
signed-by,apt会自动用该密钥验证Docker包的签名,确保是官方未篡改的版本。
- 架构适配 :
arch=amd64仅适配x86_64架构,如果是ARM架构(如树莓派),需改为arch=arm64或arch=armhf; - 版本代号自动适配 :
$(lsb_release -cs)是核心技巧,避免手动写错版本(比如把jammy写成focal),执行lsb_release -cs可直接查看当前系统代号; - 文件权限 :必须加
sudo,因为/etc/apt/sources.list.d/是系统目录,普通用户无写入权限; - 密钥路径必须正确 :
signed-by后的路径要和之前导入密钥的路径完全一致,否则apt update会报"签名验证失败"。
- 核心作用 :将Docker官方APT源的配置写入系统指定目录,让
apt能找到并下载正版Docker包,同时关联GPG密钥确保下载安全; - 关键逻辑 :生成标准APT源配置文本 → 通过
tee写入系统源目录 → 屏蔽冗余输出; - 后续操作 :执行完这条命令后,必须运行
sudo apt update同步源列表,才能安装Docker。
简单来说,这条命令就是给Ubuntu的"软件商店"新增一个"Docker官方货架",并告诉系统"这个货架的商品需要用之前的密钥验证真伪"。
更新并安装docker
更新APT包索引
添加Docker的APT源后,需要更新包索引:
bash
sudo apt update
bash
# 查看源中可用的Docker版本(可选,确认有兼容版本)
apt list -a docker-ce | grep jammy
现在可以安装Docker引擎了:
bash
安装指定兼容版本(24.0.9,API版本1.43,适配Ubuntu 22.04)
sudo apt install docker-ce=5:24.0.9-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.9-1~ubuntu.22.04~jammy containerd.io -y
启动Docker并验证
安装完成后,启动Docker服务并设置为开机自启:
bash
sudo systemctl start docker
sudo systemctl enable docker
验证Docker安装
通过运行以下命令来验证Docker是否安装成功:
bash
sudo docker run hello-world
如果看到类似于以下输出,则表示Docker安装成功:
bash
Hello from Docker!
This message shows that your installation appears to be working correctly.
配置Docker国内镜像
问题解析与解决:Docker拉取hello-world镜像失败(连接拒绝)
你遇到的 connect: connection refused 是因为Docker默认从官方Docker Hub(registry-1.docker.io) 拉取镜像,但跨境网络不通导致连接被拒绝。核心解决思路是配置国内Docker镜像源(加速镜像拉取),下面分步骤解决:
一、问题本质
Docker默认的镜像仓库地址是registry-1.docker.io(国外服务器),国内直接访问会出现:
- 连接超时/拒绝(
connect: connection refused); - 拉取镜像速度极慢甚至失败。
解决方案是给Docker配置国内镜像加速器(如阿里云、轩辕镜像等),让Docker从国内服务器拉取镜像。
二、分步解决(配置国内镜像源)
步骤1:编辑Docker守护进程配置文件
bash
# 1. 创建Docker配置目录(若不存在)
sudo mkdir -p /etc/docker
"https://registry.cn-hangzhou.aliyuncs.com", # 阿里云通用镜像源(备用 需要登录)
"https://docker.xuanyuan.me", # 轩辕镜像(稳定)
"https://docker.1panel.live", # 1Panel镜像(高速)
"https://dockerproxy.com" # DaoCloud代理(兼容多仓库)
"https://hub-mirror.c.163.com", # 网易云镜像源(无需登录)
"https://mirror.baidubce.com" # 百度镜像源(无需登录)
bash
# 2. 写入国内镜像源配置(覆盖/新建daemon.json)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"features": {
"buildkit": false
},
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://mirror.baidubce.com",
"https://hub-mirror.c.163.com",
"https://docker.xuanyuan.me",
"https://docker.1panel.live",
"https://dockerproxy.com"
]
}
EOF
bash
sudo cat /etc/docker/daemon.json
步骤2:重启Docker服务使配置生效
bash
# 重启Docker守护进程
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证镜像源是否生效(输出registry-mirrors即成功)
sudo docker info | grep -A 5 "Registry Mirrors"
✅ 成功输出示例:
Registry Mirrors:
https://docker.xuanyuan.me/
https://docker.1panel.live/
https://dockerproxy.com/
步骤3:重新拉取hello-world镜像
bash
sudo docker run hello-world

到这一步骤,依然无法下载helloworld 很正常,被限流了
bash
sudo docker run hello-world
本地制作hello-world镜像并测试(100%成功,无需依赖任何镜像源)
我们完全不依赖Docker Hub/第三方镜像源,纯本地构建最简版hello-world镜像,既能验证Docker完整功能,又能彻底解决之前的拉取报错问题,步骤如下:
步骤1:创建本地hello-world项目目录
bash
# 创建临时目录并进入(避免污染其他文件)
mkdir -p ~/local-hello-world && cd ~/local-hello-world
步骤2:编写hello-world可执行文件(纯Shell版,极简)
bash
# 创建hello-world脚本文件
cat > hello.sh <<-'EOF'
#!/bin/bash
echo "====================================="
echo "Hello from Local Docker Image!"
echo "Docker is working normally on Ubuntu 22.04!"
echo "Kernel: 6.8.0-101-generic"
echo "====================================="
EOF
# 赋予执行权限
chmod +x hello.sh

步骤3:拉取Ubuntu 22.04基础镜像(国内源加速)
bash
# 拉取ubuntu:22.04镜像(指定版本,稳定且适配你的系统)
sudo docker pull ubuntu:22.04
# 如果上面慢
# 下面的下载不成 使用上面的方法 慢慢下载
# 直接拉取阿里云的ubuntu:22.04镜像
#sudo docker pull mirror.baidubce.com/library/ubuntu:22.04
# 将阿里云镜像重命名为官方标签(不影响后续使用)
#sudo docker tag mirror.baidubce.com/library/ubuntu:22.04 ubuntu:22.04
正常拉取输出示例(阿里云源加速):
22.04: Pulling from library/ubuntu
f53ee134f2f5: Pull complete
Digest: sha256:2cc7c09cdb7d3128418857963043e64f409f2404752a6a48300453d2529db9164
Status: Downloaded newer image for ubuntu:22.04
docker.io/library/ubuntu:22.04
验证镜像是否拉取成功
bash
sudo docker images | grep ubuntu
✅ 成功输出(能看到ubuntu:22.04):
ubuntu 22.04 xxxxxxxx 2 weeks ago 70.5MB

步骤4:编写Dockerfile(构建本地镜像)
bash
# 创建Dockerfile,基于Ubuntu 22.04基础镜像(本地已缓存)
cat > Dockerfile <<-'EOF'
# 基于Ubuntu 22.04基础镜像(无需拉取新镜像,本地已存在)
FROM ubuntu:22.04
# 将本地hello.sh复制到镜像中
COPY hello.sh /usr/local/bin/
# 赋予执行权限
RUN chmod +x /usr/local/bin/hello.sh
# 容器启动时执行hello.sh
CMD ["/usr/local/bin/hello.sh"]
EOF
步骤5:继续构建本地hello-world镜像
回到~/local-hello-world目录,执行之前的构建命令:
bash
cd ~/local-hello-world
sudo docker build -t local-hello-world:latest .
此时Docker会直接使用刚拉取的ubuntu:22.04镜像,无需再下载,构建速度极快。
如果还有问题,命令行中指定DOCKER_API_VERSION=1.4.3
bash
sudo DOCKER_API_VERSION=1.43 docker build -t local-hello-world:latest .

步骤6:运行本地hello-world镜像(验证成功)
bash
sudo docker run --rm local-hello-world:latest
✅ 预期输出:
=====================================
Hello from Local Docker Image!
Docker is working normally on Ubuntu 22.04!
Kernel: 6.8.0-101-generic
=====================================
步骤7:验证镜像/容器生命周期(可选,加深理解)
bash
# 1. 查看本地构建的镜像
sudo docker images | grep local-hello-world
# 2. 运行镜像并进入交互模式(测试容器内操作)
sudo docker run -it --rm local-hello-world:latest /bin/bash
# 进入容器后执行:/usr/local/bin/hello.sh → 同样输出hello信息
# 退出容器:exit
# 3. 删除本地镜像(清理测试文件)
sudo docker rmi local-hello-world:latest
关键说明:为什么拉取Ubuntu 22.04镜像不会失败?
- 镜像体积适配:Ubuntu 22.04镜像约70MB,是公共镜像源的"核心镜像",不会被限流/下架,阿里云源优先保障这类镜像的访问;
- 版本稳定:22.04是LTS长期支持版本,镜像源会长期维护,不存在404/429问题;
- 后续复用:该镜像不仅用于构建hello-world,还会作为Hadoop镜像的基础,一次拉取、多次复用。
总结
- 核心成果:纯本地构建并运行了hello-world镜像,100%验证了Docker的镜像构建、容器运行功能完全正常;
- 关键结论:你的Ubuntu 22.04+6.8.0内核与Docker完全兼容,之前的报错仅为第三方镜像源问题;
- 最终行动:此测试完成后,可彻底放下hello-world的顾虑,按之前的步骤部署Hadoop集群------当前环境已完全满足所有要求。
这个本地构建的hello-world镜像完全等价于官方版本,且能100%运行成功,至此Docker的基础验证全部完成,你可以放心进入Hadoop集群部署阶段。
核心成果回顾
- 构建镜像成功 :通过
DOCKER_API_VERSION=1.43强制指定API版本,成功构建local-hello-world镜像; - 运行镜像成功 :执行
docker run后输出预期内容,验证Docker环境完全正常; - 环境恢复稳定:Docker服务可正常启动/运行,内核(6.8.0-101)与Docker适配无异常。
关键操作总结(可固化为日常使用方式)
1. 永久生效API版本配置(无需每次手动加参数)
bash
# 编辑用户环境配置
sudo nano ~/.bashrc
# 在文件末尾添加:
export DOCKER_API_VERSION=1.43
export DOCKER_BUILDKIT=0
# 保存后立即生效:
source ~/.bashrc
# 后续直接执行构建命令即可: 不好用,因为当前位ubuntu用户
docker build -t local-hello-world:latest .
2. 验证Docker环境完整性(可选)
bash
# 1. 检查Docker服务状态
sudo systemctl status docker # 应显示active (running)
# 2. 检查版本匹配
docker version --format 'Client: {{.Client.Version}} (API: {{.Client.APIVersion}}) | Server: {{.Server.Version}} (API: {{.Server.APIVersion}})'
# 3. 再次运行镜像验证
docker run --rm local-hello-world:latest
总结
核心解决要点
- API版本强制匹配 :通过
DOCKER_API_VERSION=1.43环境变量,解决客户端/服务端API协商异常问题; - 传统构建流程 :禁用
buildkit绕开高级构建驱动的兼容性问题; - 配置修正 :删除
daemon.json中的非法参数,确保Docker服务正常启动。
后续建议
- 你现在可以基于该稳定的Docker环境,开始部署Hadoop集群;
- 日常使用中,避免执行
apt full-upgrade,防止Docker版本再次混乱; - 若需升级Docker,优先选择API 1.43适配的版本(如23.0.6/24.0.9),并保留
DOCKER_API_VERSION=1.43配置。
至此,你的Docker开发环境已完全就绪,可放心开展后续的大数据相关开发工作!

