很多同学在一次使用 Docker 的时候,都会有一些思维上的误区,下面我列举一些,看你中了几条。
1、Docker容器就是一台虚拟机
我们来看下两者的实现框架图的对比:
虚拟机
Docker
比较两图的差异,左图虚拟机的 Guest OS 层和 Hypervisor 层在 Docker 中被 Docker Engine 层所替代。
虚拟机的 Guest OS 即为虚拟机安装的操作系统,它是一个完整操作系统内核;
虚拟机的 Hypervisor 层可以简单理解为一个硬件虚拟化平台,它在Host OS是以内核态的驱动存在的。
虚拟机实现资源隔离的方法是利用独立的 OS,并利用 Hypervisor 虚拟化 CPU、内存、IO 设备等实现的。
Docker 就显得简练很多。Docker Engine 可以简单看成对 Linux 的 NameSpace、Cgroup、镜像管理文件系统操作的封装。
Docker 并没有和虚拟机一样利用一个完全独立的 Guest OS 实现环境隔离,它利用的是目前Linux内核本身支持的容器方式实现资源和环境隔离。
简单地说,Docker 利用 namespace 实现系统环境的隔离;利用 Cgroup 实现资源限制;利用镜像实现根目录环境的隔离。
以上内容来自网络,看不懂也不影响你使用 Docker,你只需要记住 Docker 和虚拟机从本质上是有区别的,你不能拿它当虚拟机或云服务器来玩。
2、容器里面的文件会保存在本地
我们先来捋一下容器和镜像的定义:
1、镜像:指我们把资源打包好的一个文件,可用于启动容器,通过 docker images
命令查看
2、容器:可以理解是镜像的进行时,通过 docker ps
命令查看
我不知道大家去网吧上网有没有发现一个现象,网吧的电脑,只要重新开机一次,你关机前新建的文件就没了。
这就和我们的 Docker 原理非常相似,网管早就制作好的系统镜像,每次开机都以镜像为准清空我们的磁盘里面的数据,这样每次开机就都能得到一个全新的系统了。
Docker 也是一样的原理,每次你拿镜像启动容器的时候,也是基于镜像里面的文件开辟的一个新容器。
所以在容器运行时所产生的文件,在下次重启时就会被抹掉还原。
对于一些不允许被抹掉的数据,那你就要在启动时设置挂载,让他从容器里面挂载到本地,参考 docker -v
相关命令。
3、放在 Docker 里面跑的程序和传统程序没区别
要说完全没区别,那肯定不是,要说有区别,区别也不大。
最关键的地方就是上一条,你在开发时,需要考虑一些文件的落地,最好不要散落各地,而是集中落地在一起,方便后期运行挂载。
其他的倒是不需要注意太多,一般开发接触不到。
4、在一个容器里面启多个进程
这是严厉禁止的!!!!
最好的遵守一个容器一个进程的方式打包程序,不然后期你在管理进程、存取日志、升级时,那就一个酸爽。
5、使用容器的内部IP
这是一个非常不靠谱的做法,Docker 内部对网络有一套自己的管理逻辑,虽然每个容器都有一个内部 IP,但这个IP不是固定的。
我们启动容器或者停止容器的时候 IP 都可能会产生变化。
如果我们要让应用或者微服务模块在容器之间进行通信的话,正确的做法是通过设置环境变量来传递主机名和端口号。
最后,容器里面的 127.0.0.1 是访问不到宿主机的本地网络的,有多少同学踩过这个坑 [坏笑]。
就写这么多吧,想到了再补充!
你学废了么?