Docker学习

  • Docker学习已关闭评论
  • 252 次浏览
  • A+
所属分类:.NET技术
摘要

Docker就是虚拟化的一种轻量级替代技术,基于Go语言的开源应用容器引擎。Docker的容器技术不依赖任何语言、框架或系统,可以将应用程序变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行。


1.Docker基本介绍?

Docker就是虚拟化的一种轻量级替代技术,基于Go语言的开源应用容器引擎。Docker的容器技术不依赖任何语言、框架系统,可以将应用程序变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行。

光看这个介绍还不足以知道Docker是什么,能做什么,多半一头雾水,我第一眼看到这些介绍时也是一样的感受,其实我们可以这样理解,相信很多人应该都用过虚拟机,虚拟机就是一个独立的完整电脑, 我们暂且先将Docker理解为缩小或者阉割版的虚拟机,它具有启动速度快资源利用率高性能开销小这些特点。

这样做是为了在我们的思维认知中先建立一个简单概念,因为使用已知的事物去类比学习未知的东西理解起来更快一些,当然Docker!=虚拟机,因为虚拟机是在os Hypervisor之上做的扩展,而Docker相当于是直接在os层面上的扩展,共享内核,只是在某些抽象层面相同而已,例如它们都是可以作为容器。可以承载应用程序,至于对它们具体的认识和细节,在下面会做介绍

2.虚拟机 Docker对比

Docker学习

上边这张图如果有过了解的应该知道,左边是虚拟机的架构,右边是Docker的架构,我们来简单分析下图中看到的的内容

1.我们可以看到无论是Docker还是虚拟机都有一个相同点,它们最上层承载的是我们的应用程序。

2.它们的底层是OS内核,应用程序和依赖对每一个虚拟机是独立的,而Docker那边应用程序和依赖是同一个Docekr Engine

3.虚拟机架构层数多一些,应用程序>虚拟机>Hypervisor>os,Docker架构层少一些,应用程序>Docker Engine>os

1.一个小故事

老板让你在虚拟机上安装RabbitMQ和Redis,你的做法就是需要下载安装包,然后安装,这时2个应用所有依赖都在虚拟机上,类似一个大盒子放了2样东西

有一天虚拟机突然出问题了,你搞了一晚上检查发现同时安装RabbitMQ和Redis的机器会有冲突,导致不能正常运行,为了隔离环境依赖和冲突,你跟老板说需要把他们分开安装,然后你老老实实的再安装了一台虚拟机,分别装RabbitMQ和Redis。问题解决了,老板之夸你干得好。

一段时间后老板又跟你说公司规模扩大,别的开发小组也要独立的RabbitMQ和一个Redis服务器,我们现在一个RabbitMQ和一个Redis肯定不行,让你多装几台,老板又买了10台虚拟机,并且给你一周时间搞定这个事情,为了快速复制应用环境,你选择将已经安装了的2个虚拟机操作系统做了镜像,直接给其他虚拟机安装选择这个镜像,避免了每一台虚拟机都亲自去安装软件配置环境,不到2天你搞完了,为摸鱼留下了5天宝贵时间

后面你用摸鱼的时间学习了Docker,知道了它们的优点,你选择尝试在Docker安装RabbitMQ和Redis,发现只需要在DockerHub上拉取他们各自的镜像,然后根据镜像创建容器运行就好了,想多搞几个,就根据镜像直接多运行几个实例就好了,非常简单快捷,之前需要2天时间搭建的,一上午就搞完了,不禁感叹这才是为了摸鱼留下了充足且宝贵的时间

2.虚拟机和Docker

我们思考上面使用虚拟机存在的问题,它有自己独立的桌面,操作系统,然后可以在操作系统中,安装软件运行应用。每一个虚拟机都如此,10台虚拟机,就有10个独立的桌面,以及10个独立的操作系统,为了隔离环境装一个软件,就搞一个虚拟机,为了快速复制迁移就镜像一整个系统,这是不是太浪费了一点,并且每台机器的资源根本就没有完全利用。

Docker就不同了,他不需要安装操作系统、桌面这些,只需要安装Docker就好了,要想运行应用,只需要一个镜像,Docker就可以创建一个容器,然后通过容器去承载应用,而且每一个容器中运行的实例都是独立的,他们之间没有关系,也不会影响。类似一个大盒子中放了2个完全独立的小盒子,一个盒子装RabbitMQ,一个盒子装Redis,他们的依赖在各自的容器中独立,不会冲突,那些环境冲突之类的事情,再也不用操心了,并且大大的节省了资源和成本。

Docker学习

说了这么多,总结一下其实Docker就是一种可以让应用依赖独立起来,高效而且能快速复制的解决方案,Docker中的容器更像是为应用提供了一个隔离运行环境,而Docker引擎就是为了承载容器的,各个容器共享Docker引擎 我们看图中

Docker 是一个Client/Server模式应用 ,就是图中在水里的鲸鱼,这个传能装很多集装箱,反推虚拟机就是很多条船,上面只装一个集装箱。
Docke容器就是船上的集装箱,集装箱中装的是应用程序运行环境,不同容器只装一个程序,还有一个个集装箱可以快速移植和复制
Docker镜像就是类似集装箱的模型,可以根据模型快速制造一个集装箱,换句话说容器就是镜像的实例,用面向对象解释(镜像=类)(容器= new 镜像)

3.物理机、虚拟机、Docker对比

我们依然还是使用图片来阐述他们之间的关系,在网上看到一幅图很多人用,可以说这时目前很生动形象的比喻了,所以我也借用了

Docker学习

1.物理机就是图1中的别墅,独立地基上,独立的花园独立的房子独立的洗手间,一台物理机可以虚拟化出很多的虚拟机

2.虚拟机对应图2中的每一套商品房,共享一个地基花园独立的房子独立的洗手间

3.Docker对应图3中的隔断间每一间住着一个租户,租房的应该明白,共享一个地基花园房子洗手间 ,空间越来越小,资源和成本利用最大化,符合发展趋势

4.部署Docker和应用

Linux安装Docker并且部署程序等操作,单独有个笔记,按照操作来,比较简单。可以看看这里,主要介绍了

1.Docker 部署挂载Net Core程序
2.Dockerfile 部署Net Core程序
3.Docker 部署Nginx
4.Docker 部署Redis

如果你没有使用过Docker,但是想学习它,并且能做一个简单的Demo应用,那建议一定要按照其中的步骤来完整操作一遍,如果有遇到什么问题,可以留言一起讨论

5.Docker管理
1.基本介绍

随着Docker发展及其容器技术的优点,使得它在现代互联网中得到大量的应用,相信小伙伴们除了听到它的名字之外,肯定对K8S的 这个名词也不陌生吧,在我不了解的时候,听到这个就觉得很牛,后面了解了之后,知道了K8S全称 Kubernetes,是Google开发的一款基于容器的集群管理平台,说白了就是Docker的管理工具而已。

除了K8S之外,Docker还有很多其他的管理工具,例如Docker MachineDocker 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容器,只是单实例的操作。

2.安装Docker Compose

通过 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也有了简单的认识,归根结底的细分Docker就是一个运维工具,也不是一个非常高深的技术,而且在一般正规公司都是专门的运维来操作,个人认为作为开发只要会使用就好了