Docker
我们发现在微服务中有一个令人头疼的问题——部署,用Docker去解决这个部署难题
(一)初识Docker-什么是docker
1、项目部署的问题
2、Docker
扔到一台机器上,它们的依赖难道没有干扰吗?不会,docker将打包好的程序放到一个隔离容器去运行,使用沙箱机制,避免互相干扰,之间不可见,这样就解决了混乱依赖的问题
但仅限于同一个操作系统,比如centos和ubuntu
那么一个ubuntu上的应用为什么不能在centos上运行呢?
那针对这个问题,docker干了什么事呢?
这样,docker就解决了跨系统问题。你可以认为,docker打包好的程序包,可以运行在任何一个linux内核的操作系统
3、总结
(二)初识Docker-Docker和虚拟机的差别
1、Docker与虚拟机
上节课我们已经学习了Docker的原理,我们知道Dokcer可以实现一个应用在不同的linux操作系统上去运行和部署
而我们虚拟机也可以达到类似的效果
它们的实现有什么差别呢?
虚拟机是在一个系统中装了另外的一个系统,所以当应用执行时,它会以为自己在一台真实的电脑上,因此它会先去调用这个内置的操作系统,而它再与我们Hypervisor进行交互,再把信息传递给了我们外部操作系统,外部操作系统再去调用计算机硬件,于是我们的应用执行就完成了。但由于经过了层层传递,因此它的性能相对来讲要差一些
Docker就不同了,我们知道,Docker它的应用在执行时是直接调用操作系统内核的,所以它的执行性能是会比虚拟机性能要好很多的
2、总结
docker是一个系统进程:因为直接与操作系统内核进行交互
(三)初识Docker-Docker架构
1、镜像和容器
镜像就是硬盘中的文件
镜像都是只读的,也就是说容器运行过程中不能往镜像中写东西。可以基于镜像创建容器,容器可以从中读数据但不能写数据。
那么将来mysql容器往哪里写数据data呢?只要拷贝一份文件到自己的独立文件系统中,这就是隔离的一个特性。这样在自己的空间里写,不会对别的容器产生影响,也不会对镜像产生影响。包括将来记日志logs也是如此
只有这样,我们的镜像才能放心大胆的交给别人去使用,因为这样镜像不会被干扰也不会被影响
那么Docker如何共享给别人去使用呢?
2、Docker和DockerHub
那么我们该如何利用Docker完成镜像构建或者是从远端拉取镜像呢?又该如何去运行容器呢?这就需要了解Docker的架构了
3、docker架构
客户端:如果就在本地来发,用“命令”就可以了,如果将来是远程操作docker,就用restapi发
比如我们这里就是本地发,docker build,docker pull,docker run
一般nginx、mysql这种建议直接从官方拉取,只有一些我们自己的微服务或者自己需要去做一些深度定制,才需要构建
因此我们一般使用docker,主要就是向docker server发命令,得到镜像
4、总结
(四)初识Docker-Docker的安装
1、安装docker
macos m1上安装Docker直接在官网或者homebrew下载即可,然后在偏好配置中更换国内镜像源
(五)使用Docker-镜像命令
1、镜像相关命令
2、镜像操作命令
docker images --help
3、从DockerHub中拉取一个nginx镜像并查看
docker pull nginx
4、利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
这个nginx.tar文件不存在,将来它会自动创建
以上说明我们导出成功了
那接下来我们还要演示导入
首先把本地的这个镜像删除
然后通过docker images查看发现已经没有了
接下来我们通过load来加载这个nginx.tar文件
5、总结
(七)使用Docker-容器命令介绍
1、容器相关命令
怎么样基于镜像去创建容器,完成容器的各种操作
docker run 不仅可以创建容器,而且还可以让容器处于运行状态
(八)使用Docker-容器命令案例1
1、案例:创建运行一个Nginx容器
端口映射的作用:把本来给外界完全隔离开来的容器开一个小窗口,让你透过它来访问
容器端口往往取决于这个应用本身,一般不会变,像这个nginx一般都是80。可变的是宿主机端口
如果想访问容器,应该访问容器所在的那台服务器
查看本机ip地址:ifconfig
找到 en0
后,如果是iPv4就找 inet
run后返回的一长串字符串就是容器的id,全局唯一,起到标识的作用
-f 持续跟踪日志
ctrl+c停止输出日志
2、总结
(九)使用Docker-容器命令案例2
1、案例:进入Nginx容器,修改HTML文件内容,添加“传智教育欢迎您“
那么如何进入到容器内部,修改文件呢?
容器的内部其实有一套自己的文件系统
它看起来好像跟linux系统的目录一样,但其实它是一个阉割版
我们现在要找nginx在哪个目录:dockerhub上找
index.html就是我们要修改的首页了
vi不成功:镜像封装时只是应用程序所需要的必备的函数库
那么我们如何修改文件呢?
utf-8,来支持中文
通过 exit
从容器中退出;然后停掉这个容器 docker stop mn
注意 docker ps
默认只能查看运行容器
这就是为什么我们ps没有看到这个挂掉了的容器的原因,除非我们加上 -a
如果我们想再启动,docker start mn
然后再删除这个容器
2、总结
(十一)使用Docker-数据卷命令
1、数据卷
docker容器中所有的数据、文件都是和容器耦合在一起的,因此给我们带来很多问题
比方说,我现在在这个容器的html目录里写了点东西,那么这些东西会立即写到宿主机文件系统里;而反过来,如果说我在宿主机文件系统里对html文件夹中的某一个文件进行修改,那么这种修改也立即会反映到容器内的这个目录里去
又创建了一个新的容器,我希望它的配置能够共享过来,怎么办呢?我可以让新的这个容器的conf目录也来挂载conf数据卷,也就是说,两个容器可以挂在同一个卷上。这个时候,原来在conf目录中做的一切修改,这个新的容器也能看到
容器删了,数据卷不会跟着删。将来,再来一个新的容器,只要接着挂载在这两个数据卷上,就可以共享以前旧的数据