百度百科
Docker的优势
-
跨平台部署:Docker 可以在不同的操作系统和硬件平台上运行,可以轻松地将应用程序在开发、测试和生产环境中进行一致性的部署。
-
资源利用率和扩展性:Docker 可以通过容器的方式将应用程序与其依赖的运行时环境和依赖项隔离,从而提高资源的利用率并减少资源的消耗。此外,Docker 还支持快速水平扩展,使应用程序能够更好地适应变化的负载。
-
快速交付和部署:通过 Docker 容器化,可以实现快速的应用程序交付和部署。将应用程序和其依赖项打包到容器中,可以确保运行环境的一致性,并且在不同的环境中轻松地部署和迁移应用程序。
-
简化开发环境配置:Docker 可以帮助开发人员更轻松地配置开发环境。通过使用容器,可以将应用程序及其依赖项打包到一个镜像中,并在开发环境中进行部署,从而减少了由于开发环境配置不一致导致的问题。
-
提高应用程序的安全性:Docker 的容器隔离技术可以将应用程序与底层主机隔离开来,从而提高应用程序的安全性。每个容器都有自己的文件系统、进程空间和网络接口,使得应用程序之间互不干扰。
Docker的原理
我们现在可以知道Docker实际上就是一个应用程序,只不过自己带上了所需要的依赖。在考虑Docker的原理之前,我们先来看看在部署应用的方式是怎样一步步升级的
以部署一个Mysql程序为例
-
物理机
-
首先,我们要拥有一个操作系统(通常是Linux操作系统)
-
安装依赖环境(gcc、make、libncurses5-dev等编译工具)
-
安装应用程序
此时如果我们要增加一台新的物理机来处理Mysql并发请求,就需要再进行一次环境的重复配置
-
-
虚拟化(KVM或其他技术)
- 将一个物理机虚拟成多个机器
- 可以将依赖环境打包成一个模板(VMware Workstation的克隆功能就是这样实现的)
-
容器化
-
以镜像为基础
- 依赖环境的镜像
- Java程序——Java的基础镜像
- Php程序——Php的基础镜像
- Nginx程序——Linux操作系统基础镜像
- 根据基础镜像——放入自己的代码(或包)——>生成程序镜像
- 依赖环境的镜像
-
镜像按层存储
这样的方式可以让我们使用同于基础层来实现不同的功能,如上图,下面两层我们就可以直接套用模板了
-
启动时间快(秒级启动)
由于与主机共享内核,不需要做操作系统的引导
-
可移植性好
将运行某个应用所需要的环境全部打包到同一个容器中,不需要考虑兼容问题
如上图
- Docker将用户程序与所需要调用的系统函数库一起打包
- Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
-
Docker 的安装
参考官方文档
Docker 的 namespaces
Docker 使用 Linux 内核的 namespaces
功能来实现容器的隔离。namespaces
是 Linux 内核提供的一种机制,用于隔离系统资源,使得运行在不同 namespaces
中的进程拥有独立的视图和环境,而不会相互干扰。Docker 利用这一机制来创建轻量级的虚拟化环境,即容器。
-
进程命名空间(PID Namespace)
进程命名空间允许容器中的进程拥有独立的进程树。这意味着容器内的进程ID(PID)与宿主机或其他容器中的进程ID是隔离的。每个容器都有自己的 PID 1,即容器内的第一个进程。
-
网络命名空间(NET Namespace)
网络命名空间为每个容器提供独立的网络堆栈。容器拥有自己的网络接口、IP地址、路由表、防火墙规则等。这允许容器之间以及容器与宿主机之间进行隔离的网络通信。
-
挂载命名空间(MNT Namespace)
挂载命名空间为每个容器提供独立的文件系统视图。容器可以有自己的
/
根目录,以及独立的挂载点,使得容器可以有自己独特的文件系统结构,而不会影响到宿主机或其他容器。 -
用户命名空间(USER Namespace)
用户命名空间允许容器内的用户和组ID与宿主机上的用户和组ID不同。这意味着容器内的用户可以映射到宿主机上的不同用户,从而提供额外的安全隔离。
-
UTS命名空间
UTS命名空间允许容器拥有独立的主机名和NIS域名。这使得容器可以拥有自己的标识,而不需要与宿主机或其他容器共享。
-
IPC命名空间
IPC命名空间(Inter-process communication namespace)为容器提供独立的进程间通信资源,如消息队列、信号量和共享内存。这确保了容器之间的进程通信是隔离的。
通过这些 namespaces
,Docker 实现了容器的隔离,使得每个容器都像是在独立的环境中运行,而实际上它们共享宿主机的内核。这种隔离机制是容器轻量级和高效的关键