1、Docker 介绍
1.1、Docker 简介
Docker:Docker 是一个开源的应用容器引擎,让开发者可以将应用程序和所有依赖打包到一个轻量级、可移植的容器中,然后在任何支持 Docker 的环境中运行。
在传统的项目开发中,开发者经常遇到环境不一致的问题,比如代码在本地开发环境运行正常,但在测试或生产环境却出现各种错误,原因可能是操作系统版本、依赖库版本或配置差异。此外,传统部署方式需要手动安装和配置各种软件环境,过程繁琐且容易出错,不同服务器之间的环境也难以保持一致。
Docker 的核心目标就是解决这些问题,通过容器化技术将应用及其运行环境打包在一起,确保应用在不同环境中表现一致。Docker 的出现极大简化了开发、测试和部署的流程,成为现代 DevOps 和云计算中的重要工具。Docker 有几个显著特点:
- 轻量性:由于容器共享宿主机的操作系统内核,它们比传统虚拟机更小且启动更快,解决了传统虚拟化技术资源占用高、启动慢的问题。
- 可移植性:Docker 容器可以在任何支持 Docker 的平台上运行,无论是本地开发机、物理服务器还是云环境,彻底解决了「在我机器上能跑,线上却不行」的难题。
- 隔离性:每个容器拥有独立的文件系统、网络和进程空间,确保应用之间互不干扰,避免了传统部署中多个应用共用环境导致的依赖冲突问题。
- 标准化:Docker 提供统一的接口和工具链,使得构建、分发和运行容器变得简单高效,替代了传统部署中复杂的手动配置流程。
Docker 采用了客户端-服务器架构。Docker 客户端负责发送命令,Docker 守护进程(服务端)负责执行这些命令。它们可以运行在同一台机器上,也可以分开运行。客户端和守护进程通过 UNIX 套接字或网络接口进行通信,使用 REST API 交换数据。这种架构让用户可以通过本地或远程客户端管理 Docker 服务。Docker 的架构图如下所示:
1.2、Docker 核心概念
Docker 的核心概念包括容器、镜像、Dockerfile 和镜像仓库,这些是理解 Docker 技术的基础。
容器(Container):一种轻量级的虚拟化技术,它共享操作系统内核但保持独立的运行环境,这使得容器比传统虚拟机更快速且占用资源更少。
容器是 Docker 技术的核心运行单元,它是一种轻量级的虚拟化技术实现方式。与传统的虚拟机不同,容器不需要模拟完整的硬件环境,也不需要运行独立的操作系统内核。容器在运行时与其他容器和宿主机共享操作系统内核,这使得容器启动更快且占用资源更少。
容器之间是相互独立的。每个容器都拥有自己的文件系统、网络和进程空间,确保应用之间不会互相干扰。
镜像(Image):镜像是用于创建容器的模板,它包含了运行应用所需的代码、库和配置文件,用户可以从 Docker Hub 下载现成镜像或自己构建。
镜像是用来创建 Docker 容器的基础,镜像中包含了运行应用所需的代码、库、环境变量和配置文件,用户可以直接使用现成的镜像,比如从 Docker Hub 下载,也可以基于现有镜像定制自己的镜像。镜像采用分层存储结构,每一层代表一个修改步骤,这种设计使得镜像的构建和分发更高效。镜像中不包含任何的动态数据,其内容在构建之后不再变动。
Dockerfile:Dockerfile 是一个文本文件,里面写明了如何一步步构建镜像,通过执行 Dockerfile 中的指令,Docker 能自动生成镜像。
Dockerfile 是用于定义镜像构建过程的脚本文件,它由一系列指令组成,比如 FROM
指定基础镜像,RUN
执行命令,COPY
复制文件等,Docker 会根据 Dockerfile 的指令自动构建镜像,这使得镜像的创建过程可重复且透明。
镜像仓库(Image Repository):用于集中存储和分发镜像的地方。
最常用的公共仓库是 Docker Hub,它提供了大量官方和社区维护的镜像。此外,我们也可以搭建公司内部 / 个人使用的私有镜像仓库,用于存放自己的镜像。当需要在另一台主机上使用该镜像时,只需要从仓库上下载即可。
容器、镜像和 Dockerfile、镜像仓库共同构成了 Docker 的工作流程:
- 开发者编写 Dockerfile 定义环境,构建 Docker 镜像。
- 将构建好的镜像推送到镜像仓库(公共仓库 / 私有仓库)。
- 在任何支持 Docker 的机器上拉取镜像并运行容器。
整个过程标准化且高效。理解这些核心概念是掌握 Docker 的关键,它们解决了传统开发部署中的环境不一致问题,使应用在任何地方都能以相同的方式运行。
1.3、Docker 和虚拟机
Docker 和虚拟机都是用来隔离应用运行环境的技术,但它们的工作原理和资源占用方式完全不同。Docker 容器不需要模拟整个操作系统,而是直接运行在宿主机的内核上,这使得容器启动更快、占用资源更少,同时仍能提供良好的隔离性。
Docker 容器和虚拟机的具体区别如下:
- Docker 容器:使用 Docker 引擎进行调度和隔离,直接共享宿主机的操作系统内核,不需要额外的操作系统层,这使得容器启动更快、占用资源更少。
- 虚拟机:通过 Hypervisor 软件模拟完整的硬件环境,管理每个虚拟机中操作系统的运行。每个虚拟机需要运行独立的操作系统、应用程序和必要的依赖文件等,因此启动速度慢且占用大量内存和存储。
虚拟机的隔离性更强,因为每个虚拟机有完全独立的操作系统,适合运行需要强隔离的不同类型应用。Docker 的隔离性主要依靠 Linux 内核的命名空间和控制组功能,虽然隔离程度不如虚拟机,但对于大多数应用场景已经足够。Docker 和虚拟机对比如图所示:
2、配置镜像源地址
镜像源(Mirror)的主要目的是加速镜像的拉取操作(即从远程仓库下载镜像)。它们通常作为缓存服务器,存储从主仓库(如 Docker Hub)拉取的镜像,以减少延迟和网络负载。Docker 下载镜像默认从国外的官网下载,在国内需要通过代理访问 / 更换国内镜像源。下面介绍一下更换国内镜像源的方法。
创建镜像源配置文件:
配置镜像源:
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://<你的阿里云镜像地址>.mirror.aliyuncs.com", "https://1ms.run", "https://docker.xuanyuan.me", "https://docker.jsdelivr.fyi", "https://docker.yomansunter.com" ] } EOF
阿里云镜像源的个人免费注册地址为:阿里云容器镜像服务
保存文件并重启Docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证Docker服务状态:
sudo systemctl status docker.service
查看配置的docker镜像源:
wangqiang@wangqiang:~$ cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://<你的阿里云镜像地址>.mirror.aliyuncs.com",
"https://1ms.run",
"https://docker.xuanyuan.me",
"https://docker.jsdelivr.fyi",
"https://docker.yomansunter.com"
]
}
3、配置个人镜像仓库
大多数公共镜像源(如你配置的 https://1ms.run
、https://docker.jsdelivr.fyi
等)是只读的,仅允许拉取操作,不允许推送操作。这是为了防止镜像源被滥用或污染。
Docker 的镜像源(registry-mirrors
)在推送镜像时不会生效。即使你配置了镜像源,Docker 仍然会直接连接到原始仓库进行推送操作。
个人用户可以将镜像推送到阿里云的镜像仓库。以下是详细的操作步骤:
3.1、开通阿里云容器镜像服务
- 登录阿里云账号:访问 阿里云官网 并登录。
- 开通容器镜像服务:
- 在阿里云控制台搜索“容器镜像服务”并进入控制台。
- 选择“个人版实例”(免费)或“企业版实例”(付费),根据需求开通服务。
- 设置登录密码(用于后续
docker login
的认证)。
3.2、创建命名空间和镜像仓库
-
创建命名空间:
- 进入 容器镜像服务控制台。
- 在左侧导航栏选择 个人版实例 > 仓库管理 > 命名空间。
- 点击 创建命名空间,输入名称(如
my-namespace
)并提交。
-
创建镜像仓库:
- 在 仓库管理 > 镜像仓库 页面,点击 创建镜像仓库。
- 选择 个人版实例,填写以下信息:
- 命名空间:选择刚创建的命名空间(如
my-namespace
)。 - 镜像仓库名称:输入自定义名称(如
my-image
)。 - 镜像仓库类型:选择 私有仓库(仅自己可见)或 公开仓库(所有人都可拉取)。
- 命名空间:选择刚创建的命名空间(如
- 提交后,系统会生成镜像仓库的地址(如
registry.cn-hangzhou.aliyuncs.com/my-namespace/my-image:tag
)。
3.3、登录阿里云镜像仓库
在本地终端执行以下命令登录阿里云镜像仓库:
docker login --username=<你的阿里云账号> registry.cn-<地域>.aliyuncs.com
- 替换参数:
<你的阿里云账号>
:阿里云账号的登录名。<地域>
:镜像仓库所在的地域(如hangzhou
、beijing
等)。
- 输入开通服务时设置的密码,登录成功后显示
Login Succeeded
。
3.4、为本地镜像打标签
将本地镜像的标签修改为阿里云镜像仓库的地址:
docker tag <本地镜像ID或名称> registry.cn-<地域>.aliyuncs.com/<命名空间>/<镜像仓库名称>:<tag>
示例:
docker tag my-local-image registry.cn-hangzhou.aliyuncs.com/my-namespace/my-image:v1.0
- 可通过
docker images
查看本地镜像的 ID 或名称。
3.5、推送镜像到阿里云仓库
执行以下命令推送镜像:
docker push registry.cn-<地域>.aliyuncs.com/<命名空间>/<镜像仓库名称>:<tag>
示例:
docker push registry.cn-hangzhou.aliyuncs.com/my-namespace/my-image:v1.0
3.6、验证推送结果
- 登录阿里云容器镜像服务控制台。
- 在 仓库管理 > 镜像版本 页面,查看推送的镜像是否显示在列表中。
- 如果显示成功,则表示推送完成。
3.7、拉取镜像(可选)
其他用户或服务器可以通过以下命令拉取镜像:
docker pull registry.cn-<地域>.aliyuncs.com/<命名空间>/<镜像仓库名称>:<tag>
示例:
docker pull registry.cn-hangzhou.aliyuncs.com/my-namespace/my-image:v1.0
注意事项
- 认证问题:
- 推送前必须通过
docker login
登录阿里云仓库。 - 如果密码错误,推送会失败(提示
unauthorized: authentication required
)。
- 推送前必须通过
- 标签格式:
- 确保标签地址与阿里云仓库地址完全一致(包括地域、命名空间、镜像名称和 tag)。
- 网络问题:
- 如果推送过程中断,检查网络连接是否正常。
- 权限问题:
- 个人版实例默认仅允许推送私有仓库(除非手动设置为公开)。
- 费用问题:
- 个人版实例免费,但私有仓库可能产生存储费用(具体以阿里云最新计费规则为准)。
3.8、完整示例
# 1. 登录阿里云仓库
docker login --username=your-aliyun-account registry.cn-hangzhou.aliyuncs.com
# 2. 查看本地镜像
docker images
# 3. 为本地镜像打标签
docker tag my-local-image registry.cn-hangzhou.aliyuncs.com/my-namespace/my-image:v1.0
# 4. 推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/my-namespace/my-image:v1.0
# 5. 验证推送结果(在阿里云控制台查看)
4、docker中文教程网站
4.1、综合教程类
-
菜鸟教程:Docker 教程 | 菜鸟教程
-
内容全面,从Docker的基本概念、安装配置,到镜像、容器的使用,再到网络和数据卷等高级内容都有详细讲解,适合初学者系统学习
-
Docker中文网:Docker中文网
-
有入门指南、手册、参考等板块,涵盖了Docker的安装、设置、配置和使用等方面的内容,还提供了CLI和API文档
-
Datawhale教程:https://segmentfault.com/a/1190000046520353
-
从Docker的安装到使用,再到一些高级应用都有涉及,且有详细的代码示例和解释,适合有一定基础的读者
4.2、专项教程类
-
CSDN博客:【25年最新版docker教程】2小时入门docker,全是干货,少走弯路,教会你最实用的docker技能_docker搭建教程-CSDN博客
-
详细介绍了在Windows上安装Docker Desktop的步骤,以及如何配置镜像加速等实用技巧
-
程序员充电站:Docker 万字教程:从入门到掌握 | 程序员充电站
-
提供了Docker在macOS和Linux系统上的安装教程,以及镜像源地址的配置方法和Docker服务的使用命令等