黑马商城项目—最新SpringCloud开发实战—功能实现详细学习笔记(Docker篇)
2024黑马商城项目Docker篇
2024最新版的SpringCloud黑马商城项目
笔记对应教学视频讲解序号,并附上每小节所在的视频分p位置
笔记包含了视频讲解的核心内容及实战功能实现的详细过程
课程地址: 2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)
项目代码:课程地址简介中领取
系列文章目录
本笔记包含Docker、微服务、RabbitMQ、Elasticsearch等(持续更新)
黑马商城项目—最新SpringCloud开发实战—功能实现详细学习笔记(Docker篇)
黑马商城项目—最新SpringCloud开发实战—功能实现详细学习笔记(微服务篇)
黑马商城项目—最新SpringCloud开发实战—功能实现详细学习笔记(RabbitMQ篇)
黑马商城项目—最新SpringCloud开发实战—功能实现详细学习笔记(Elasticsearch篇)
目录
- Docker
- p22 Docker-01 课程介绍
- p23 Docker-02 Docker的安装
- p24 Docker-03 快速入门-部署MySQL
- p25 Docker-04 Docker基础-命令解读
- p26 Docker-05 Docker基础-常见命令
- p27 Docker-06 Docker基础-命令别名
- p28 Docker-07 Docker基础-数据卷挂载
- p29 Docker-08 Docker基础-本地目录挂载
- p30 Docker-09 Docker基础-Dockerfile语法
- p31 Docker-10 Docker基础-自定义镜像
- p32 Docker-11 Docker基础-网络容器互联
- p33 Docker-12 项目部署-部署Java应用
- p34 Docker-13 项目部署-部署前端
- p35 Docker-14 项目部署-DockerCompose
Docker
p22 Docker-01 课程介绍
docker可以简化软件安装的过程,
传统的安装方法比如需要查操作系统版本,安装依赖等,
整个过程命令太多、安装包太多、步骤复杂容易出错
p23 Docker-02 Docker的安装
执行命令
yum install -y yum-utils
如果执行失败需要先配置yum源
配置yum源(参考 https://blog.csdn.net/zhangbeizhen18/article/details/127931240 )
安装完毕后查看docker版本
显示安装的docker版本
但无法连接到daemon守护进程
启动docker后,命令执行正常
配置docker阿里镜像加速
p24 Docker-03 快速入门-部署MySQL
docker安装mysql命令只需一步,命令中包含了服务端口和密码,完成后可以直接打开,
它下载的内容相当于绿色免安装版的软件文件,这个文件称为镜像image
镜像把软件运行所需的系统函数库一并打包了,因此镜像可以在多种操作系统上运行(跨系统运行),
通常多个软件运行可能会互相冲突,但docker提供了容器container,使它们相互隔离
再启动一个mysql命名为mysql2
查看启动的镜像
在navicate中成功连接上两个mysql
p25 Docker-04 Docker基础-命令解读
通过运行两个mysql容器,端口分别是3306和3307
在这个命令中-p指定端口,分别是宿主机端口和容器端口,这两种端口由docker完成端口映射
容器的端口可以相同,都是3306,但是宿主机的端口不能相同,因为要通过访问这个宿主机的端口来访问容器,便于区分
使用docker inspect 容器名,查看容器的ip地址,这个ip地址明显与宿主机ip不是同一个网段,它在一个单独的网络里
查看两个mysql容器的端口映射情况
命令docker run -e xxx中的-e是指定环境变量,格式是-e KEY=VALUE
具体的参数可在docker官网查到镜像的环境变量
Docker run命令最后是镜像名,全名是镜像名称和版本号,如mysql:5.7,版本号可省略
p26 Docker-05 Docker基础-常见命令
常见命令:
从镜像仓库下载镜像docker pull
查看本地镜像docker images
删除本地镜像docker rmi
自定义的镜像构建docker build
保存镜像为压缩文件docker save
压缩文件加载为镜像docker load
推送镜像到仓库(可以是私有仓库)docker push
创建并运行容器(包含2个操作创建和运行) docker run
停止容器(停止这个进程,容器还在)docker stop
运行容器(运行进程)docker start
查看容器运行状态(只显示运行的)docker ps,加上-a参数显示所有容器
删除容器docker rm,加-f参数强制删除运行中的容器
查看日志docker logs,加-f参数持续输出日志保持监控
执行一些命令进行容器内部docker exec
进入mysql容器内部,可以看到里面有与Linux根目录目录相同的文件夹结构,命令docker exec的-it会给容器分配一个终端用于连接
p27 Docker-06 Docker基础-命令别名
给常用Docker命令起别名,方便输入或者调整输出内容(比如将docker ps改为dps并指定输出哪些内容)
需要修改~/.bashrc文件
source文件后生效,使用命令别名运行正常
p28 Docker-07 Docker基础-数据卷挂载
容器内运行的镜像只包含了保证运行最基础的函数依赖,非常精简,它甚至没有提供vi命令,因此不能在容器内修改文件,
数据卷是虚拟目录,它是容器内到宿主机之间映射的桥梁,
数据卷是逻辑上的、虚拟的,但它对应在宿主机上的文件夹是真实的,
数据卷配置完成后,这两个文件夹就是双向绑定的,在一个地方做修改另一个地方也会修改
思考:为什么要有数据卷?为什么不让容器目录直接指向宿主机目录呢?
回答:程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。
数据卷常见命令
测试,在创建nginx容器时设置数据卷的地址,修改nginx的主页文件查看运行情况
创建容器时加-v参数指定数据卷,这里会自动创建宿主机的目录,
其中,html是数据卷的名称,冒号后是容器内数据卷的地址
ls查看数据卷,可以看到刚刚创建的html数据卷
inspect查看这个数据卷,可以看到它挂载到宿主机的路径
在宿主机上修改文件后,进入到容器内对应的路径,发现这里的文件也发生了变化,数据卷的映射正常
p29 Docker-08 Docker基础-本地目录挂载
之前给nginx挂载了数据卷,命令docker inspect nginx可以看到mounts里面的数据卷,显示了容器内的地址和宿主机内的地址
执行命令docker inspect mysql发现mounts里面也有一个数据卷,不是自己创建的卷,这个是匿名卷,名称很长,
mysql在使用时存储的数据很大,为了防止容器变得很大,它自动创建了一个匿名卷把数据保存在宿主机上,
这个匿名卷不推荐使用,最好是自己准备一个本地目录来使用
进行mysql的数据、配置、脚本的挂载
首先在宿主机创建好目录,并在conf和init里面放入准备好的配置文件和脚本文件
创建一个mysql容器,用-v参数指定本地目录
创建并运行成功后,连接mysql,此时可以看到数据库里面已经有脚本里面的数据了
设置这种本地目录的好处是,mysql容器删除后重新创建(比如mysql版本升级)只要指定了本地目录,mysql的数据依然存在于宿主机上
p30 Docker-09 Docker基础-Dockerfile语法
镜像打包的时候会打很多个包,每个包一层,它们互相依赖,比如一个应用镜像可以分为脚本、jar包、jre、系统等,
分层的好处是,可以共享一些基础的层(比如系统的基础镜像baseImage),这些层大家可以共享,简化这些重复的打包制作
而且在下载镜像的时候,如果这个镜像中的层在本地已经有了的时候,可以不用下载直接用本地的就行
这里下载一个redis镜像,其中第一个层它在本地已经存在,就不用下载了
Dockerfile描述了镜像的结构,这个文本文件包含了一些指令,用于描述如何构建镜像
这是一些基础的指令,比如指定基础镜像、配置环境变量、拷贝文件到容器内的指定目录、解压文件、开启端口、设置入口等
如果指定基础镜像基于ubuntu,然后就是拷贝jar文件和配置环境变量,最后指定入口,
也可以指定基础镜像基于jdk,那么它就已经包含了操作系统和配置环境变量了(这些操作是常用的因此已经有现成的包可用),此时只需要拷贝jar包和指定入口
p31 Docker-10 Docker基础-自定义镜像
命令docker build加上-t参数(tag)然后是3个部分,镜像名、版本号、dockerfile目录
首先将准备好的基础镜像tar包加载为镜像,可以看到加载成功
然后将demo文件夹上传到服务器中
其中dockerfile指定了一些操作命令
使用命令docker build构建镜像,构建方式由dockerfile文件描述,最后可以查到镜像构建成功
镜像构建成功后,使用命令docker run创建并运行容器,容器名为dd,指定8080端口,可以看到容器运行成功,然后查看运行的日志也正常显示(这是一个spring应用)
在浏览器中测试,访问到了这个jar包应用程序的接口
p32 Docker-11 Docker基础-网络容器互联
容器的ip是在一个子网内,都是172.17开头的,它们的网关是同一个
这里有一个容器(dd)地址是172.17.0.3,进入它之后,去ping地址172.17.0.2(mysql),发现可以ping通
所有的容器会连接到一个网桥上,因此可以ping成功,但容器的ip地址不是固定的(随容器启动顺序分配),这种连接方式不稳定
在宿主机上ip addr查看网络接口,可以看到这个docker的网桥
通过加入自定义网桥,可以容器通过容器名互相访问
首先创建一个自定义网桥,名叫heima,可以看到成功创建
再次ip addr查看,可以看到刚刚创建的自定义网桥,这是一个新的网段172.18
将容器mysql加入到网桥heima
再次docker inspect mysql可以看到它连上了自定义网桥
此外,在创建容器时加上–network参数去指定要连接的网桥,那么容器的网络就只会连上这个网桥,不会去连接默认的网桥了
进入到一个容器里面(dd),ping另一个容器(mysql),可以ping通因为它们都在同一个网桥里面
p33 Docker-12 项目部署-部署Java应用
做一个真实项目的部署,分为前端和后端部署
后端的项目需要连接访问mysql容器,通常这个mysql容器不会向外暴露ip地址来访问(不安全),它只通过容器名来访问
在配置文件中可以看到3个配置文件,分别用于生产环境、开发环境、本地环境,因为连接数据库的方式通常会发生变化,
这里生产环境的连接是动态地址,用$符号表示
在dev的配置文件里面写了这个变量的值,这里的host是docker的mysql容器名,后端项目在docker里面通过容器名来连接
如果是本地环境连接,就是用常规的指定ip地址的方式
具体选择哪个配置文件由active来指定,这里配置了dev环境的变量值
已经配置好了Dockerfile,用于之后构建镜像
打包项目可以用命令也可以用这里的图形界面
点击maven,去掉单元测试,找到父工程的package开始打包
遇到的问题:
1、依赖包从maven仓库下载不下来,重新配置阿里云镜像仓库
2、打包中一个单元测试类报错“类 HutoolTest 是公共的, 应在名为 HutoolTest.java 的文件中声明”,(为什么去掉了单元测试还会打包?),去掉public,
打包成功
在target文件夹内看到打包好的jar包
将Dockerfile和jar包放入虚拟机root目录,进行构建镜像
创建并运行容器,配置好映射的端口和连接的网络,容器运行成功
查看日志,看到运行成功,springboot和mybatis显示出来了
在浏览器中访问虚拟机的8080端口,输入一个查询接口,成功返回了数据
在日志中也可以看到刚刚的操作执行的sql查询语句
p34 Docker-13 项目部署-部署前端
nginx.conf中写了静态资源和api后台接口位置
前端有2部分,门户页面(portal)监听端口18080和后台管理页面(admin)监听端口18081,
location指定了页面的目录,这个需要挂载到之后创建的nginx容器中,
这两个端口代理的地址都是一个后台程序,容器名叫hm,访问端口为8080
然后去nginx的docker官方网站查询conf配置文件的放置目录位置,用于之后把配置文件挂载到容器内,
这里官网显示nginx的配置文件应该放在容器内的/etc/nginx目录下
创建并启动前端nginx容器,加参数-p配置好端口(有2个),加参数-v配置好前端静态页面文件目录和配置好nginx配置文件目录,连接到设置的网络
访问18080端口的门户网站,随便点击一下搜索,正常显示
从后台项目的日志中可以看到这个前端nginx容器可以成功连接到mysql容器,运行正常
p35 Docker-14 项目部署-DockerCompose
之前的这种手动部署项目的方式比较麻烦,运维和维护起来也困难,
可以用DockerCompose来快速部署
它通过yml模板文件定义项目中的互相关联的容器,并将容器快速部署
通常的部署是docker run命令后面用于描述一个容器部署的信息,
DockerCompose文件的内容就是将这些容器的信息集合起来,但它有自己的语法
将之前部署的容器用DockerCompose的方式构建,这是DockerCompose文件,它描述的信息与部署单个容器的方式是一样的,
这里部署了3个容器(mysql、后端项目、前端项目),和定义了容器连接的网络,
其中后端项目的镜像从自己项目的jar包构建,然后部署,
由于这里的文件路径写了相对路径(不是从根目录开头的),要把这些文件放到一个文件夹内进行执行
常用DockerCompose命令
开始用DockerCompose部署
首先删除之前部署的镜像,这里保留nginx和mysql镜像,需要用这个镜像导入配置文件和数据卷来创建容器
命令docker compose up创建容器(省略了-f文件路径和-p工程名称),成功构建3个容器和配置1个网络
用命令docker compose ps查看项目下的所有容器,同样地,用docker images命令也能查到
在浏览器中成功访问到项目,并且登录成功
一键删除这些容器和网络
dockerCompose也能将项目部署到多台服务器,功能很丰富
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)