大家好 , 今天我要和大家分享一个现代软件开发中不可或缺的工具 - Docker . 在这个快速发展的技术时代 , 我们经常面临着应用部署的复杂性、环境差异以及不同操作系统之间的兼容性问题 . 这些问题不仅消耗大量时间 , 还可能导致项目延期和成本增加 . Docker 的出现解决了我们在应用部署过程中遇到的障碍和挑战 . 通过将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中 , Docker 不仅简化了开发和部署流程 , 还确保了不同环境间的无缝衔接和一致性 . 本文参考资源 : https://www.bilibili.com/video/BV1HP4118797/?spm_id_from=333.337.search-card.all.click
一 . 什么是 Docker ?
我们之前已经学习过 Linux 系统 , 虽然他也可以将我们写好的应用进行部署 , 但是需要我们提前安装好各种环境 , 比如 : JDK、MySQL、Redis 等等 , 还是比较麻烦的 .
并且在分布式系统中 , 所依赖的组件会非常多 , 那不同的组件之间在部署的时候就会产生一些冲突 .
1.1 应用部署所遇到的环境问题
在一个大型的项目中 , 会使用到很多组件 , 比如 : 前端的 Nodejs、后端的 MySQL、Redis、MQ 等等 .
在部署的时候 , 就有可能会碰到一些问题 , 比如 :
- 各个组件之间的依赖关系错综复杂 , 容易出现一些兼容性问题 比如 : MySQL 需要某个组件的 3.x 版本 , 而 Redis 又需要某个组件的 4.x 版本 , 这样的话就会产生冲突 .
- 开发、测试、生产环境具有一定差异 比如 : 开发环境使用的是 CentOS 系统进行开发 , 但是测试以及生产环境使用的是 Ubuntu 系统 , 那这样的话不同的系统部署应用的方式又不相同 , 造成很大压力
那 Docker 就解决了应用部署麻烦、冲突的问题 , 我们具体来看
1.2 Docker 可以解决依赖的兼容问题
Docker 为了解决依赖的兼容性问题 , 主要采用了两种解决方案
- 将 Libs (函数库)、Deps (依赖)、本体应用一起打包
- 将每个应用都放到一个单独的隔离容器中去运行 , 避免相关干扰
那这样的话 , 每一个打包好的应用中 , 既包括了应用的本体 , 也包含了该应用所需要的依赖和库 , 并且 Docker 还将每个应用都放到一个单独的容器中 , 也解决了不同的应用之间的兼容问题了 .
虽然解决了不同应用的兼容性问题 , 但是开发环境、测试环境、生产环境不同环境之间还是会存在差异的 , 这怎么解决呢 ?
这就需要我们也来了解一下不同的 Linux 操作系统环境下的差异
1.3 Docker 解决操作系统环境的差异
我们先来了解一下不同的操作系统之间的差异
那 CentOS 和 Ubuntu 都是建立在最基本的 Linux 操作系统内核上的 , 只不过是各个操作系统厂商分别提供了不同的应用以及函数库 .
那 Docker 解决不同的系统环境 , 是这样解决的
- Docker 会将应用程序与所对应的操作系统的函数库一起打包
- Docker 运行到不同的操作系统 , 直接使用打包好的函数库 , 只不过它其实是借助于操作系统的 Linux 内核来运行的
1.4 小结
Docker 是如何解决大型项目之间依赖关系复杂以及不同组件依赖的兼容性问题的呢 ?
- Docker 将应用、依赖、函数库、配置等内容一起打包 , 形成可移植镜像
- Docker 应用需要运行在容器中 , 使用沙箱机制 , 不同容器之间是相互隔离的
Docker 如何解决开发环境 测试环境 生产环境有差异的情况 ?
- Docker 镜像中包含了完整的运行环境 , 包括 : 系统函数库、操作系统的 Linux 内核 , 可以直接在各个 Linux 操作系统中运行
Docker 是一个快速交付应用、运行应用的技术 , 具备以下优势 :
- 可以将程序及其依赖、运行环境一起打包为一个镜像 , 可以迁移到任意 Linux 操作系统上
- 运行时利用沙箱机制形成隔离容器 , 各个应用互不干扰
- 启动、移除都可以通过一行命令完成 , 方便快捷
二 . Docker 与虚拟机的区别 ?
我们刚才介绍的 Docker , 实际上他是将应用本体以及所依赖的函数和库、操作系统所需要的函数库全部打包 , 当应用运行的时候 , 可以直接调用本地的函数库 .
而虚拟机则不同 , 虚拟机其实是完全模拟一个计算机设备 , 在他的内部使用了一种叫做 Hypervisor 这样的技术 , 这个技术可以模拟出计算机各种各样的硬件 , 在模拟出的硬件上面就可以搭载出各种操作系统 .
在虚拟机中 , 我们的应用需要先调用虚拟机的操作系统 , 然后虚拟机的操作系统再调用 Hypervisor , 之后 Hypervisor 再调用外部的操作系统才能实现虚拟机的效果 .
而 Docker 直接就调用 Docker 本地内部的操作系统 , 这样的话就会比虚拟机快了很多 .
那 Docker 与虚拟机的主要区别如下 :
特性 | Docker | 虚拟机 |
性能 | 接近原生 | 性能较差 |
硬盘占用 | 一般为 MB | 一般为 GB |
启动 | 秒级 | 分钟级 |
三 . Docker 架构
3.1 镜像和容器
镜像指的是 Docker 会将应用程序本体、所需要的依赖、函数库、环境、配置等文件打包在一起 , 称为镜像 .
容器就是镜像中的应用程序运行之后形成的进程 , Docker 会对容器进行隔离 .
一个镜像可以运行多个容器 , 形成集群 .
那我们看这样的一个例子 :
显然不能 , 如果我们将新产生的数据写入到 MySQL 镜像中 , 这样的话就会将我们导出的 MySQL 镜像污染掉 , 所以一般镜像都是只读的 .
那我们容器中产生数据究竟要存储到哪呢 ?
我们每个容器可以拷贝一份 MySQL 镜像中的数据 , 保存到自己的独立文件系统中 , 我们在写数据的时候写入到自己的容器中 , 就不会对别的容器产生影响 , 也不会对镜像产生影响 .
之后别的系统再导入这份镜像 , 得到的也是一个不受污染的、全新的镜像 .
那我们又怎样将自己创建好的镜像分享给其他人使用呢 ?
3.2 DockerHub
DockerHub 是一个 Docker 镜像的托管平台 , 我们可以通过 Docker 提供的一些命令来进行镜像的构建 , 然后上传到 DockerHub 上 .
国内也有很多类似 DockerHub 的公开服务 , 比如 : 网易云镜像服务、阿里云镜像库等等 .
3.3 Docker 架构
Docker 是一个 C/S 架构的程序 , 它主要由两部分组成 :
- 服务端 (server) : 负责接收用户指令 , 完成镜像和容器的各种操作
- 客户端 (client) : 向 Docker 服务器发送命令或者发送 RestAPI (远程调用 Docker)
Docker 的架构如下 :
四 . 安装 Docker
我们选择在 CentOS 平台上面安装 Docker
首先 , Docker 分为 CE 和 EE 两个版本 , CE 是社区版 (免费) , 而 EE 是企业版 , 我们只需要安装 CE 版本的即可 .
4.1 卸载 Docker
如果我们安装过 Docker 的话 , 执行这条命令 , 就可以卸载掉所有与 Docker 相关的内容
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
4.2 安装 Docker
首先 , 我们需要安装 yum 工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后将下载源替换成阿里云
# 设置 Docker 镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 添加 Docker 镜像相关依赖
sed -i 's/download.docker.com/mirrors.aliyun.com/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 刷新缓存
yum makecache fast
接下来就可以下载安装 Docker 了
yum install -y docker-ce
4.3 关闭防火墙
由于 Docker 需要使用到许多端口 , 逐一放开防火墙十分麻烦 , 所以我们选择直接关闭防火墙
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
4.4 启动 Docker
我们通过这条命令就可以启动 Docker
# 启动 Docker 服务
systemctl start docker
我们还需要将 Docker 服务设置成开机自启动
# 设置 Docker 服务开机自启
systemctl enable docker
同时 , Docker 还有其他一些命令
systemctl stop docker # 停止 Docker 服务
systemctl restart docker # 重启 Docker 服务
systemctl status docker # 检查 Docker 状态
docker -v # 查看 Docker 版本
五 . 配置镜像加速
我们可以在这个链接中查看官方的配置教程 : https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
第一步
mkdir -p /etc/docker
第二步
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5179jiob.mirror.aliyuncs.com"]
}
EOF
第三步
sudo systemctl daemon-reload
第四步
sudo systemctl restart docker