docker是干什么的(项目为什么用docker)
本文目录
项目为什么用docker
项目为什么要用 docker,需要了解 docker 的优势,结合项目的实际情况来决定是否需要使用 docker,千万不能“为了使用而使用”或者“跟风使用 docker”。
使用 docker 是为了快速交付
和传统的虚拟机相比,docker 具有所用的资源更少、性能更高、隔离级别更高、安全性方面也更强等特点,让我们看看下面几个场景,估计你会有更深的体会。
01. 移植性更强
相信开发人员都会遇到这样的问题:代码在本地跑的好好的,但是一发布到测试环境怎么就有问题了呢?
通常我们的的代码包需要依赖于环境中的很多因素,比如配置文件、依赖库、中间件的配置等等,其中一项有问题可能都会导致我们代码出现问题;对于开发人员来说,最希望的就是我们的代码能够一次创建,在任意地方都能运行。
而使用 docker 之后,可以实现开发、测试、运维环境的标准化,镜像文件直接做为交付物,避免了因为环境不同导致的各种问题。
02. 更容易扩展
docker 容器可以在任意平台运行,不管是物理机还是虚拟机,不管是公有云还是私有云,甚至是个人电脑,所以我们的项目容易做迁移和扩展。
比如我们应用部署了两台机器,当我们想再扩展第三台机器的时候,我们需要先搭建好代码运行所需的环境,尽管虚拟机也有一些快速 copy 的技术,但是这个过程依然是很慢的,而且有些环境配置还容易出错,而有了 docker,只需要构建镜像然后运行即可,非常方便快速。
因为 docker 快速的构建方式,也让我们的项目可以实现自动且快速的扩容和缩容。
03. 更加轻量
在 docker 出现之前,通常会采用物理机上部署多台虚拟机,每个应用都部署在一个虚拟机中;但是虚拟机非常的重,虚拟机的构建速度通常都是按照分钟计算,占用的资源比较多。
而 docker 的速度很快,秒级,并且使用的资源更少,性能更高;同样一个物理机器,docker 运行的镜像数量远多于虚拟机的数量。
使用 docker 只是快速交付的一部分
docker 的优点这么多,那是不是用了 docker 之后,我们的交付速度更快了呢?
我见过一个项目,他们号称已经微服务化了,当然他们确实也做到了:把一个项目拆成了数个服务,每个服务在生产环境上部署了多套,算下来就是 N * M 个应用包(七八十个),都做了容器化...
但是他们依然是人肉运维,也是就是他们每次提测和上线需要手动部署,没有自动化测试和发布;
生产环境发生问题的时候,需要手动去拿日志跟踪问题,开发和运维依然是两个团队,甚至是所属两个不同的部门,沟通的成本很高;
他们虽然实现了容器化,但其实并没有实现快速交付,甚至比传统的方式更慢了。
所以,不要为了 docker 而 docker;如果你们的项目环境配置复杂,每来一个新人配置环境都需要一两天;每次提测和上线,经常问题都是运行环境的问题;开发人员的开发环境不统一;开发能力强,运维能力弱的时候,甚至公司比较穷,想实现资源使用的最大化,都可以考虑使用 docker,不过像要做微服务化+容器化,当容器集群规模比较大的时候,还需要工具做容器的自动化管理和编排,自动化测试及部署等等。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
如何通俗的解释“Docker”
我家是搞养殖的,养了几十头羊,有的瘦小,有的强壮。之前,所有羊在一个食槽里吃饲料,强壮的羊会挤兑瘦小的,不让其吃。结果就是强壮的愈加强壮,瘦小的愈加瘦小。为了解决这个问题,我为每头羊分配了一个食槽,每头羊只能在属于它的食槽吃饲料,去其他食槽吃就会挨打,一段时间后,每头羊便可以吃到为其分配的饲料,羊的长势也就比较均衡了。
有人的地方就有江湖,羊也一样。强壮的羊经常欺负瘦小的羊,导致瘦小的羊受伤,为了解决这个问题,我们将经常欺负弱小的羊单独圈起来,这样,对于它来说世界就只有它一头羊了,精力无处发泄,只能撞墙了。原先的羊圈,欺负弱小的情形还在继续发生,理想的方法是为每头羊准备一个单独的羊圈,我将方法提出后,被家里以成本过高为由否决了。
我们以进程类比羊,以操作系统类比羊圈,以资源类比饲料。
进程A为了运行流畅,可能会无限申请内存及CPU时间,挤压了其他进程的资源,导致其他进程运行卡顿,用户就会认为其他软件用户体验差,进而卸载,这是非常不公平的。操作系统的解决方法是可为每个进程分配固定的资源(内存、CPU运行时间等),进程不能使用额外的资源。这就相当于为每头羊分配了一个食槽,里面放适合它的饲料。在计算机中,这种技术叫CGroups。
进程是可以看到其他进程的,也可以看到其他进程产生的文件。进程可调用kill、rm杀死其他进程或删除属于其他进程的文件。通过权限机制可缓解此问题,但是更好的方法是,进程只能看到属于自己的资源,进程想作恶,都不知道如何下手。在计算机中,这种技术叫做Namespace,将进程放在一个独立的Namespace中,进程就只能看到属于它的资源了,相当于为每头羊准备一个单独的羊圈。
通过CGroups和Namespace技术,进程只能使用固定的资源,并认为自己独享操作系统,这就是容器虚拟化技术。
容器虚拟化技术是操作系统级虚拟化。文件系统属于Namespace的一种,通过容器虚拟化技术,进程A使用Ubuntu16.04的文件系统,进程B使用Ubuntu22.04的文件系统,虽然二者使用的内核是同一个,但应用软件的行为(由软件、依赖库、配置文件等决定)分别与Ubuntu16.04和Ubuntu22.04一致,就可以认为,分别虚拟出了Ubuntu16.04和Ubuntu22.04操作系统。
Docker整合了上述虚拟化技术,并提供了一系列工具,简化并自动化容器虚拟化技术使用流程。风云际会,掀开了云原生时代的序幕。
我写了一个称作docker.sh 的小项目,该项目旨在通过一系列的实验使用户对docker的底层技术,如Namespace、CGroups、rootfs、联合加载等有一个感性的认识。在此过程中,我们还将通过Shell脚本一步一步地实现一个简易的docker,以期使读者在使用docker的过程中知其然知其所以然。该项目的仓库地址如下:
Docker有什么优势
Docker是一个开源容器引擎,将应用以及依赖打包到一个可移植的镜像中,并且将配置脚本化、自动化,实现一键部署、虚拟化和集群化,快捷高效交付应用。
一,Docker核心技术
Docker核心概念:
1)镜像Image,应用和依赖打包生成的文件。
2)容器Container,运行应用的实例。
3)仓库Repository,存放镜像文件的地方。
Docker-compose资源编排,将多个服务和对应的容器组织成为一个应用系统,声明在docker-compose.yml文件中,将这些服务作为一个整体来创建和启动。
Docker Swarm集群管理工具,统一管理组织多个Docker节点,支持动态扩容等特性,集群化部署和管理应用系统,和Kubernetes(k8s)相比,更加轻量,适合较小规模。
二,Dockerfile配置是核心
Dockerfile声明应用和依赖,比如拉取代码、添加运行库、设置数据卷、配置环境变量,等等。
三,Docker镜像构建
1,本地构建
Dockerfile完成后,可以在本机直接运行docker build命令。
2,云服务自动构建
代码托管在Git,配置阿里云容器镜像服务,在提交代码时,自动触发构建Docker镜像。
3,优化构建速度
合理的拆分Dockerfile,可以提高构建速度,比如将很少变化的部分独立出来,配置Dockerfile_base,然后Dockerfile的基础镜像引用它。
四,一键部署
配置docker-compose.yml文件,声明需要创建的服务、镜像、资源,比如环境变量、端口,等等,一键启动和运行应用系统。
需要集群化部署到多个Docker节点时,使用Docker Swarm或者Kubernetes(k8s)管理维护服务器节点,可以增加必要的控制参数,比如label, role,指定需要部署运行的容器在特定节点上。
我是工作多年的Web应用架构师,陆续发布关于软件开发方面的文章,欢迎关注我,了解更多IT专业知识。
更多文章:

6splus相当于安卓什么手机(苹果6plus使用流畅度相当于哪一部安卓手机)
2023年10月17日 14:00

希沃教学白板和方成记忆一体机区别?钉钉直播教学白板画笔颜色怎么更换
2024年7月15日 04:59

联想e450c蓝牙怎么用(联想E450C怎么样联想E450C好吗)
2025年2月4日 17:51

国产内存和三星有多大距离?各位大神,帮忙推荐一款国产手机,运行内存和储存空间越大越好
2023年8月17日 18:00

hdtune硬盘检测工具(用hdtune检测硬盘需要看些什么参数)
2024年8月14日 04:50

vivox6d和vivox6有什么区别(vivox6和vivox6d有什么区别呢)
2024年9月17日 22:20

iphone11和11pro区别(苹果11pro和11的区别)
2023年10月7日 13:40

ubuntu官网网址(为何ubuntu官方网站是.com结尾)
2025年3月9日 13:05

360手机奇酷旗舰极客版(奇酷旗舰极客版(全网通)充不上电该如何解决)
2024年11月27日 01:11

液晶电视显像管多少钱(TCL25寸电视机换一个显像管多少钱)
2024年7月4日 08:40