微服务具有各种各样的优势,但微服务的拆分通用给部署带来很多问题,分布式系统中依赖的组件很多,不同组件部署时会产生一些冲突,依赖关系复杂可能出现兼容性问题
Docker解决依赖的兼容性问题采用了两个手段:1.将应用的Libs函数库,Deps依赖,配置和应用一起打包 2.将每个应用放到一个隔离容器去运行,避免相互干扰
要解决不同操作系统环境差异问题,先了解操作系统结构。以Ubuntu操作系统为例
一个操作系统结构如下:系统应用,内核,计算机硬件
计算机硬件:例如cpu,内存,硬盘等
系统内核:所有Linux发行版的内核都是Linux,内核可以和计算机硬件交互,对外提供内核指令,用于操作计算机硬件
系统应用:操作系统本身提供的应用,函数库。这些函数库都是对内核指令的封装,使用更方便。
应用与计算机交互的流程:1.应用调用操作系统应用(函数库)实现各种功能
2.系统函数库是对内核指令集的封装,调用内核指令
3.内核指令操作计算机硬件
不同的系统例Ubuntu和CentOS都是基于Liunx内核,系统应用不同,提供的函数库有差异
Docker解决不同系统环境的问题:Docker将用户系统和所需要调用的系统函数库一起打包
Docker运行到 不同操作系统时直接基于打包的函数库,借助于操作系统的Liunx内核来运行
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
Docker是一个快速交付应用、运行应用的技术,具备下列优势:
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
运行时利用沙箱机制形成隔离容器,各个应用互不干扰
启动、移除都可以通过一行命令完成,方便快捷
Docker和虚拟机的区别:
虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,操作系统中的操作系统,体积大,启动慢,性能一般
Docker仅仅是封装函数库,没有模拟完整的操作系统,是一个系统进程,体积小,性能好
镜像Image:Docker将应用 程序及其依赖,函数库,环境,配置等文件打包在一起,称为镜像
容器Container:镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见
一切应用都是由代码构成,都是硬盘中的一个个字节形成的文件。只有运行时,才会加载到内存形成进程,而镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。容器,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
一个官方的Docker镜像的托管平台。国内的比如: 网易云镜像服务、阿里云镜像库等
使用Docker操作镜像,容器,必须安装Docker
Docker是一个CS架构的程序,有两部分构成:
服务端server:Docker守护进程,负责处理Docker指令管理镜像容器等
客户端client:通过命令向Docker服务端发送指令,可以在本地发送指令到服务端
镜像名称一般两部分组成:[repository]:[tag]
没有指定tag时,默认是latest,代表最新版本的镜像
镜像命令
0)拉取镜像
先在镜像仓库中搜索需要的镜像,根据镜像名拉取。 命令: docker pull nginx 拉取nginx
通过docker images查看虚拟机中所有镜像
1)利用docker xx --help命令查看docker save和docker load的语法
例如,查看save命令用法,可以输入命令:
docker save --help
结果:
命令格式:
docker save -o [保存的目标文件名称] [镜像名称]
2)使用docker save将nginx的镜像导出到磁盘上形成jar包
运行命令:
docker save -o nginx.tar nginx:latest
结果如图:
3)使用docker load加载镜像
先删除本地的nginx镜像:
docker rmi nginx:latest
然后运行命令,加载本地文件:
docker load -i nginx.tar
结果:
容器保护三个状态:
运行:进程正常运行
暂停:进程暂停,cpu不再运行,并不释放内存
停止:进程终止,回收进程占用的内存,cup等资源
其中:
docker run:创建并运行一个容器,处于运行状态
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停状态恢复运行
docker stop:停止一个运行的容器
docker start:让一个停止的容器再次运行
docker rm:删除一个容器
创建并运行nginx容器的命令
docker run --name containerName -p 80:80 -d nginx
docker run命令的常见参数有哪些?
--name:指定容器名称
-p:指定端口映射
-d:让容器后台运行
默认情况下,容器是隔离环境,直接访问访问不到。需要将容器端口80和宿主机端口80关联
进入容器中
docker exec -it 容器名 bash
docker exec :进入容器内部,执行一个命令
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
bash:进入容器后执行的命令,bash是一个linux终端交互命令
查看容器日志的命令:
docker logs
添加 -f 参数可以持续查看日志
查看容器状态:
docker ps 查看运行的容器
docker ps -a 查看所有容器,包括已经停止的
当数据(容器内文件)和容器耦合在一起的时候,不便于修改,维护困难
数据卷volume:虚拟目录,指向宿主机系统中的某个目录
一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了
数据卷的作用:
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷操作:
docker volume create:创建数据卷
docker volume ls:查看所有数据卷
docker volume inspect:查看一个或多个数据卷详细信息,包括关联的宿主机目录位置
docker volume rm:删除一个或多个指定数据卷
docker volume prune:删除所有未使用的数据卷
docker volume create h1 创建数据卷h1
创建容器的时候,通过-v参数挂载一个数据卷到某个容器目录
docker run --name mn -v html:/root/html -p 8080:80 nginx
-v html:/root/htm
:把html数据卷挂载到容器内的/root/html这个目录中
docker run的命令中通过 -v 参数挂载文件或目录到容器中:
-v volume名称:容器内目录
-v 宿主机文件:容器内文件
-v 宿主机目录:容器内目录
数据卷挂载与目录直接挂载的,直接挂载模式:宿主机目录-->容器内目录
数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
常见的镜像DockerHub就能找到,自己写的项目自己构建镜像
镜像就是将应用程序及其需要的系统函数库,环境,配置,依赖打包而成
以MySQL为例的镜像组成结构:
简单来说,镜像就是在系统函数库,运行环境基础上,添加应用程序文件,配置文件,依赖文件等组件,然后编写号脚本打包在一起形成的文件
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
Dockerfile的第一行必须是FROM,从一个基础镜像来构建
基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine