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目录中做的一切修改,这个新的容器也能看到
容器删了,数据卷不会跟着删。将来,再来一个新的容器,只要接着挂载在这两个数据卷上,就可以共享以前旧的数据
2、操作数据卷
3、案例:创建一个数据卷,并查看数据卷在宿主机的目录位置
4、总结
(十二)使用Docker-数据卷挂载案例1
1、挂载数据卷
2、案例:创建一个nginx容器,修改容器内的html目录内的index.html内容
之前我们是进到容器里面去改,这次我们通过数据卷挂载去改
创建了以后,我们要知道它挂载的目录在哪里,所以我们要查看数据卷的信息
找到了数据卷的挂载点目录
Mac下没有找到目录的需要先:
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
如果要退出这个,直接输入exit
即可
ls后发现下面有两个文件。这时我们仍然没有进入到容器内,这说明我们已经将容器的usr/share/nginx/html挂载到了宿主机的真实目录下了
那现在我们想修改它就很容易了
vi index.html
保存完了后,我们期待这个东西立即跑到容器内,
cat后发现修改成功了,再去页面看一下
我们刚刚在完成数据卷挂载时,我们的数据卷是提前创建好的。那想象一下,如果数据卷不存在,它会不会也能成功呢?
先把这个容器和未使用的数据卷都删除,然后再创建
现在这个卷是不存在的,我们直接去创建,行不行呢?
这个卷自动创建出来了
而且我们在浏览器中查看,发现已经自动恢复了
这说明我们在做数据卷挂载时,这个数据卷不存在,docker非常知道,它能自动帮你把这个卷创建出来
3、总结
(十三)使用Docker-数据卷挂载案例2
1、创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
刚才演示了如何将数据卷挂载到容器目录
事实上不仅仅是数据卷,我们的宿主机目录可以直接与容器进行挂载
区别是什么呢?
都是以-v开头,
之前数据卷挂载,前半部分是数据卷名称,现在改成了宿主机目录了
还有一个差别,目录挂载还允许将宿主机文件与容器文件做挂载。这种情况下,宿主机文件的内容会直接覆盖容器内文件的内容,这个是数据卷中没有的功能
要满足的要求就是:1.把数据目录挂载到mysql到数据目录;2.把配置文件挂载到mysql的配置文件;3.设置mysql的密码
然后将hmy.cnf(mysql的默认配置文件)放到conf下
-e 环境变量,
MYSQL_ROOT_PASSWORD即mysql的root的密码
-d后台运行
还缺了端口和数据卷的挂载
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-v /Users/XXX/Downloads/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /Users/XXX/Downloads/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
2、数据卷挂载的方式对比
3、总结
(十四)自定义镜像-镜像结构
在上一节中我们已经学习了如何去拉取一个镜像,如何基于镜像去创建与运行容器,不过我们之前所操作的所有镜像都是由dockerhub官方制作的镜像,那我们将来自己写微服务代码,能不能让dockerhub官方帮我们制作镜像?显然不能
因此,我们将来的微服务一定要自己制作镜像
所以我们来学习如何基于dockerfile来自定义镜像
1、镜像结构
2、总结
(十五)自定义镜像-Dockerfile
1、什么是dockerfile
2、基于ubuntu镜像构建一个新镜像,运行一个java项目
这个“.”代表的是dockerfile所在的目录,docker build构建时得告诉它dockerfile在哪里
如果不成功,docker logs -f web
看问题出在哪里
但是这样很麻烦,为什么不将前n层提前构建好作为一个镜像先放在那,以后我都在这个基础上再去构建,就方便多了
事实上,java:8-alpine镜像已经帮我们做了这些事情,
3、基于java:8-alpine镜像,将一个Java项目构建为镜像
比2中省略了非常多,
4、总结
(十六)DockerCompose-初始化Compose
之前的所有部署都是我们手动一个个去完成的,但是在实际生产环境下,我们微服务的个数可是非常多的。所以我们一定需要有一种集群部署的手段,这就是DockerCompose
1、什么是DockerCompose
Compose文件是把docker run命令集合进来了,第一种mysql的对比:
这里dockercompose中的mysql没有配端口,因为它是一个微服务集群部署,在微服务集群中,mysql仅仅是构建给集群内的服务用的,那端口就不需要暴露,内部能访问就行了
第二种web的对比:
dockercompose中没有制定镜像,而是用了build构建镜像,.表示从当前目录构建镜像,一旦创建完,就有镜像可以创建容器了
所以dockercompose就是把docker run的各种参数转化成指令
2、安装DockerCompose
Docker Desktop已经自带DockerCompose,不需要再额外安装
3、总结
(十七)DockerCompose-部署微服务
1、将之前学习的cloud-demo微服务集群利用DockerCompose部署
3中怎么才能让打包名叫app.jar呢?比如查看user-service的pom.xml,最下面有一个build,其实就是在做项目打包,finalName为app,就是打包之后的名称为app:
都叫app会冲突吗?不会,因为它们各自有自己的文件夹
最后,先在生命周期中clean一下,然后再重新打包package,然后就会出现一个target目录,下面就有app.jar
要部署的微服务有gateway、orderservice、userserivce、mysql、nacos
可以看到,只有网关暴露了端口,10010,剩下的都没有暴露端口,一样的道理,微服务地址不应该暴露在外界
(十八)Docker镜像仓库
1、常见镜像仓库服务
文章来源:https://www.toymoban.com/news/detail-423616.html
2、私有镜像仓库搭建
文章来源地址https://www.toymoban.com/news/detail-423616.html
到了这里,关于SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!