Docker就是虚拟化的一种轻量级替代技术,基于Go语言的开源应用容器引擎。Docker的容器技术不依赖任何语言、框架或系统,可以将应用程序变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行。
光看这个介绍还不足以知道Docker是什么,能做什么,多半一头雾水,我第一眼看到这些介绍时也是一样的感受,其实我们可以这样理解,相信很多人应该都用过虚拟机,虚拟机就是一个独立的完整电脑, 我们暂且先将Docker理解为缩小或者阉割版的虚拟机,它具有启动速度快、资源利用率高、性能开销小这些特点。
这样做是为了在我们的思维认知中先建立一个简单概念,因为使用已知的事物去类比学习未知的东西理解起来更快一些,当然Docker!=虚拟机
,因为虚拟机是在os Hypervisor
之上做的扩展,而Docker相当于是直接在os层面上的扩展,共享内核,只是在某些抽象层面相同而已,例如它们都是可以作为容器。可以承载应用程序,至于对它们具体的认识和细节,在下面会做介绍
上边这张图如果有过了解的应该知道,左边是虚拟机的架构,右边是Docker的架构,我们来简单分析下图中看到的的内容
1.我们可以看到无论是Docker还是虚拟机都有一个相同点,它们最上层承载的是我们的应用程序。
2.它们的底层是OS内核,应用程序和依赖对每一个虚拟机是独立的,而Docker那边应用程序和依赖是同一个Docekr Engine
3.虚拟机架构层数多一些,
应用程序
>虚拟机
>Hypervisor
>os
,Docker架构层少一些,应用程序
>Docker Engine
>os
老板让你在虚拟机上安装RabbitMQ和Redis
,你的做法就是需要下载安装包,然后安装,这时2个应用的所有依赖都在虚拟机上,类似一个大盒子中放了2样东西。
有一天虚拟机突然出问题了,你搞了一晚上检查发现同时安装了RabbitMQ和Redis
的机器会有冲突,导致不能正常运行,为了隔离环境依赖和冲突,你跟老板说需要把他们分开安装,然后你老老实实的再安装了一台虚拟机,分别装RabbitMQ和Redis
。问题解决了,老板之夸你干得好。
一段时间后老板又跟你说公司规模扩大,别的开发小组也要独立的RabbitMQ和一个Redis服务器,我们现在一个RabbitMQ和一个Redis肯定不行,让你多装几台,老板又买了10台虚拟机,并且给你一周时间搞定这个事情,为了快速复制应用和环境,你选择将已经安装了的2个虚拟机操作系统做了镜像,直接给其他虚拟机安装时选择这个镜像,避免了每一台虚拟机都亲自去安装软件配置环境,不到2天你搞完了,为摸鱼留下了5天宝贵时间。
后面你用摸鱼的时间学习了Docker,知道了它们的优点,你选择尝试在Docker上安装RabbitMQ和Redis
,发现只需要在DockerHub上拉取他们各自的镜像,然后根据镜像创建容器运行就好了,想多搞几个,就根据镜像直接多运行几个实例就好了,非常简单快捷,之前需要2天时间搭建的,一上午就搞完了,不禁感叹这才是为了摸鱼留下了充足且宝贵的时间。
我们思考上面使用虚拟机存在的问题,它有自己独立的桌面,操作系统,然后可以在操作系统中,安装软件运行应用。每一个虚拟机都如此,10台虚拟机,就有10个独立的桌面,以及10个独立的操作系统,为了隔离环境装一个软件,就搞一个虚拟机,为了快速复制迁移就镜像一整个系统,这是不是太浪费了一点,并且每台机器的资源根本就没有完全利用。
Docker就不同了,他不需要安装操作系统、桌面这些,只需要安装Docker就好了,要想运行应用,只需要一个镜像,Docker就可以创建一个容器,然后通过容器去承载应用,而且每一个容器中运行的实例都是独立的,他们之间没有关系,也不会影响。类似一个大盒子中放了2个完全独立的小盒子,一个盒子装RabbitMQ,一个盒子装Redis,他们的依赖在各自的容器中独立,不会冲突,那些环境冲突之类的事情,再也不用操心了,并且大大的节省了资源和成本。
说了这么多,总结一下其实Docker就是一种可以让应用和依赖独立起来,高效而且能快速复制的解决方案,Docker中的容器更像是为应用提供了一个隔离的运行环境,而Docker引擎就是为了承载容器的,各个容器共享Docker引擎 我们看图中
Docker 是一个Client/Server模式应用 ,就是图中在水里的鲸鱼船,这个传能装很多集装箱,反推虚拟机就是很多条船,上面只装一个集装箱。
Docke容器就是船上的集装箱,集装箱中装的是应用程序和运行环境,不同容器只装一个程序,还有一个个集装箱可以快速移植和复制
Docker镜像就是类似集装箱的模型,可以根据模型快速制造一个集装箱,换句话说容器就是镜像的实例,用面向对象解释(镜像=类),(容器= new 镜像)
我们依然还是使用图片来阐述他们之间的关系,在网上看到一幅图很多人用,可以说这时目前很生动形象的比喻了,所以我也借用了
1.物理机就是图1中的别墅,独立地基上,独立的花园,独立的房子,独立的洗手间,一台物理机可以虚拟化出很多的虚拟机
2.虚拟机对应图2中的每一套商品房,共享一个地基,花园,独立的房子
,独立的洗手间
3.Docker对应图3中的隔断间
每一间住着一个租户,租房的应该明白,共享一个地基,花园,房子、洗手间 ,空间越来越小,资源和成本利用最大化,符合发展趋势
Linux中安装Docker并且部署程序等操作,单独有个笔记,按照操作来,比较简单。可以看看这里,主要介绍了
1.Docker 部署挂载Net Core程序
2.Dockerfile 部署Net Core程序
3.Docker 部署Nginx
4.Docker 部署Redis
如果你没有使用过Docker,但是想学习它,并且能做一个简单的Demo应用,那建议一定要按照其中的步骤来完整操作一遍
,如果有遇到什么问题,可以留言一起讨论。
随着Docker 的发展及其容器技术的优点,使得它在现代互联网中得到大量的应用,相信小伙伴们除了听到它的名字之外,肯定对K8S
的 这个名词也不陌生吧,在我不了解的时候,听到这个就觉得很牛,后面了解了之后,知道了K8S全称 Kubernetes,是Google开发的一款基于容器的集群管理平台,说白了就是Docker的管理工具
而已。
除了K8S之外,Docker还有很多其他的管理工具,例如Docker Machine、Docker Swarm以及Docker Compose只是它们和K8S应对的场景有略微的不同,但是都是对Docker进行管理的工具,Docker Machine现在基本已经淘汰了,Docker Swarm和K8S的角色定位都是Docker 的集群管理工具,作用差不多,但是现在以及被K8S所替代了,对于K8S后面会专门的进行学习。
目前就简单的学习一下Docker Compose,Compose 是用于定义和运行多容器 Docker 应用程序的工具,类似像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose
只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker
就会按照你声明的配置去把所有的容器启动起来,
有点像Windows系统的bat
批处理文件,例如我要开启3个 窗口,我就在一个批处理中写3个start命令,一次执行就好了。但是Docker-Compose只能管理当前主机上的Docker,不能去启动其他主机上的Docker容器,只是单实例的操作。
通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
1.下载 Docker Compose 然后授权,并且使用docker-compose
命令来查看帮助信息
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
2.Docker Compose常用命令
docker-compose docker-compose version docker-compose up
3.配置docker-compose.yml对应文件
version: '3.3' services: service1: build: context: /apppath/app image: apinet5 ports: - 8081:80/tcp service2: image: apinet5 ports: - 8082:80/tcp command: ["dotnet", "/app/FileSharding.dll"] nginx: image: nginx:latest ports: - 8086:80/tcp volumes: - /apppath/nginx/nginx.conf:/etc/nginx/nginx.conf redis: image: redis ports: - 8085:6380/tcp volumes: - /apppath/redis/redis.conf:/usr/local/etc/redis/redis.conf - /apppath/redis/data:/data:rw command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
version: | 版本,指定yml依从的 compose 哪个版本制定的 |
---|---|
services: | 相当于一个集合,包裹下面所有的内容 |
build: | 指定为构建镜像的上下文路径,在上面代表从/apppath/app/FileSharding下面构建镜像,名称为netapi5 |
image: | 镜像名称 |
ports: | 设置端口和Docker映射 |
command: | 执行的命令 |
volumes: | 使用目录挂载 |
4.干掉在运行的所有容器,然后执行compose命令运行容器
#删除所有已有容器 docker stop $(docker ps -q) & docker rm $(docker ps -aq) #在docker-compose.yml所在目录下执行命令创建容器运行 docker-compose -up -d
小结
到目前为止,我们对Docker也有了简单的认识,归根结底的细分Docker就是一个运维工具,也不是一个非常高深的技术,而且在一般正规公司都是专门的运维来操作,个人认为作为开发只要会使用就好了