部署存在的问题
1、环境依赖
一个程序的运行,需要依赖文件系统、网络、动态库、各种运行时(例如Java虚拟机)等等。最简单的例子,一个Java程序要运行,机器上必须装有Java虚拟机。程序要写日志,对应的目录必须是可写的。
因此,程序的部署依赖于环境的配置,配置环境需要消耗不小的工作量。
2、环境冲突
一台机器上,一般要部署多个服务程序。
首先,它们的环境依赖可能存在冲突,比如A服务和B服务只能有一个监听80端口,它们依赖的运行时版本可能不一致,这种情况下,让他们同时运行就是一件麻烦事。
3、相互影响
既然A、B程序在同一个机器,那么A程序运行的时候,有可能影响B,比如A清理日志文件的时候,有可能删除B的日志文件。
在实际开发中,相互影响的情况很常见,而且很难排查问题。
docker如何解决
1、环境打包
docker可以把依赖的环境进行打包,变成标准件,直接部署到任意服务器上,服务器无需做任何配置。
2、进程隔离
利用Linux的name space技术,对容器的内存、进程、文件、网络、IPC、CPU等进行了隔离,即在容器内,感觉像是进入了一个独立的操作系统。
docker VS 虚拟机
虚拟机是机器资源的虚拟化,但是本身也是完整的系统,拥有独立的操作系统。
docker是进程级别的,只是对进程进行隔离,它是非常轻量的,这就是docker的优势所在。
操作系统OS和docker image的区别:
- OS = kernel + filesystem/libraries 操作系统由内核、文件系统、各种库组成。
- Image = filesystem/libraries 镜像由文件系统和各种库组成。