【狂神说Java】Docker最新超详细版教程通俗易懂 https://www.bilibili.com/video/BV1og4y1q7M4/
【狂神说Java】Docker进阶篇超详细版教程通俗易懂 https://www.bilibili.com/video/BV1kv411q7Qc/
聊聊Docker
Docker基于Go语言开发
Docker官网:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩容
使用了Docker之后,我们部署应用就像搭积木一样!
项目打包为一个镜像。扩展 服务器A! 服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用:
Docker是内核j级别的虚拟化吗,可以在一个物理机上运行很多容器实例,服务器性能可以被压榨到极致
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcat01容器(作为服务器使用),通过这个镜像可以创建多个容器(最终服务它运行或者项目运行就是在容器中)
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简单的linux系统
仓库(repository):
仓库是寻访镜像的地方!
分为公有仓库和私有仓库
Docker Hub(默认是国外的)
阿里云。。。都有容器服务器(配置镜像加速!)
安装Docker
环境准备
1、需要会一点点linux基础
2、Centos 8
3、使用Xshell连接远程服务器操作!
环境查看(我使用的是阿里云)
安装
帮助文档(用于阅读官方文档):
卸载Docker
1、登录阿里云,打开控制台
2、容器镜像服务
3、配置使用
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
4、底层原理
Docker是怎么工作的?
Docker是一个C/S(Client-Server)结构的系统,Docker的守护进程运行在主机上.通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层
2、Docker利用的是宿主机的内核,vm需要的是Guest OS
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新安装一个操作系统内核,虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级。
帮助命令
帮助文档地址(官网):https://docs.docker.com/engine/reference/commandline/docker/
镜像命令
docker images 查看下载的所有镜像
docker search 搜索镜像
docker pull 下载镜像
docker rmi 删除镜像
容器命令
说明 : 有了镜像才可以创建容器,llinux,下载一个centos镜像来测试学习
新建容器并启动
列出所有运行的容器
退出容器
删除容器
启动和停止容器的操作
常用的其他命令
后台启动容器
查看日志
查看容器中进程信息
查看镜像元数据
进入当前正在运行的容器
从容器内拷贝文件到主机上
小结
作业练习
Docker 安装Nginx
思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步内部就好了!
作业:部署es+kibana
docker和kibana如何连接
可视化
portainer(先用这个)
什么是portainer?
Docker图形化界面管理工具! 提供一个后台面板供我们操作
访问测试: 外网: 8088 http://外网ip:8088/
镜像是什么
镜像就是一个轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像 DockerFile
Docker镜像加载原理
UnionFs(联合文件系统查询)
我们下载的时候看到的一层一层就是这个
UnionFs(联合文件系统): Union文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性: 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录结构.
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
bootfs(boot file system)主要包含bootlloader和kernel,bootfs主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就在内存中了,此时内存的使用权已由bootfa转交给内核,此时系统也会卸载bootfs
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包含基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootFS就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs
分层理解
分层的镜像
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!
思考: 为什么Docker镜像要采用这种分层的结构呢?
最大好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的base镜像构建而来,那么宿主机
只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享
查看镜像分层的方式可以通过 docker image inspect 命令!
理解:
所有的镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建一个新的镜像层,
举一个简单的例子,假如基于Ubuntu Linux 16.64创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加python包,就会在该镜像之上创建第二个镜像层; 如果继续添加一个安全补丁,就会创建第三个镜像层
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要,下图举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了两个镜像层的6个文件
上图中的镜像层跟之前图中的略有区别,主要是便于展示文件
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版本
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,这样就使得文件的更新版本作为一个新镜像层添加到镜像当中
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多层镜像层对外展示为统一的文件系统
Lunux上可用的存储引擎有AUFS,Overlay2,Device Mapper,Btrfs以及ZFS,顾名思义,每种存储引擎都是基于Linux对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点
Docker在Windows上仅支持windosfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常所说的容器层,容器之下的都叫镜像层
如何提交一个自己的镜像
commit镜像
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像!
如果数据都在容器中,那么我们容器删除,数据就会丢失!
需求: 数据可以持久化
MYSQL, 容器删了,删库跑路! 需求: mysql数据可以存储在本地!
容器之间可以有一个数据共享的技术! Docker 容器中产生的数据,同步到本地!
总结一句话: 容器的持久化和同步操作! 容器间也可以数据共享的!
使用数据卷
方式一: 直接使用命令来挂载 -v
实战: 安装Mysql
思考: mysql的数据持久化的问题, data目录
假设我们将容器删除
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能
具名挂载和匿名挂载
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/卷名/_data
我们通过具名挂载可以方便的找到一个卷,大多数情况在使用的’具名挂载’
扩展:
初识Dockerfile
Dockerfile就是用来构建Dockerfile镜像的文件! 命令脚本! 先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
这个卷和外部一定有一个同步的目录(匿名挂载)
查看一下卷挂载的路径
测试一下刚才的文件是否同步出去了
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时没有挂载卷,要手动镜像挂载 -v 卷名: 容器内路径
数据卷容器
两个Mysql同步数据!
多个mysql实现数据共享
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的
DockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile脚本
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push发布镜像(Docker hub , 阿里云镜像仓库! )
很多官方镜像都是基础包, 很多功能没有,我们通常会自己搭建自己的镜像!
官方可以制作镜像,那么我们也可以!
Dockerfile构建过程
很多指令:
- 每个保留关键字(指令)都是必须要大写
- 执行从上到下顺序执行
- ‘#’ 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交 !
dockerfile是面向开发的,我们以后要发布项目,做镜像就需要编写dockerfile文件,这个文件十分简单
Docker镜像 逐渐成为了一个企业交付的标准,必须要掌握 !
步骤: 开发,部署,上线,运维…缺一不可
DockerFIle: 构建文件,定义了一切的步骤 ,源代码
DockerImages: 通过DockerFile构建生成的镜像,最终发布运行的产品,原来是一个jar,war
Docker容器: 容器就是镜像运行起来提供服务的
DockerFile的指令
以前的话我们是使用的别人的,现在我们知道了这些指令后,我们来练习自己写一个镜像!
实战测试
Docker Hub 中99%镜像都是从centos基础镜像过来的,然后配置需要的软件
创建一个自己的centos
编写一个DOckerfile的文件
增强之后的镜像
我们可以列出本地进程的历史
我们平时拿到一个镜像,可以研究一下它是怎么做的
CMD 和ENTRYPOINT的区别
测试cmd命令
5.本地测试
curl localhost:9090
发布自己的镜像
DockerHub
-
地址hub.docker.com 注册自己的账号!
-
确定这个账号可以登录
-
在服务器上提交自己的镜像
-
登录完毕就可以提交镜像了,就是一步 docker push
提交到阿里云镜像仓库
看官网 很详细https://cr.console.aliyun.com/repository/
-
登录阿里云
-
找到容器镜像服务
-
创建命名空间
-
创建容器镜像
-
浏览阿里云
小结
理解docker0
测试
三个网络
原理
-
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术!
再次测试 ip addr
2.再启动一个容器测试,发现又多了一对网络
3.我们来测试一下 tomcat1 和 tomcat2 是否可以ping 通
结论:
-
tomcat01和tomcat02是共用的一个路由器,docker0
-
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
小结
Docker 使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker0
Docker中所有的网络接口都是虚拟的,虚拟的转发效率高
只要容器删除,对应网桥的一对就没了
–link
思考一个场景,我们编写了一个微服务,database url=ip: 项目不重启,数据库IP换掉了,我们希望可以通过名字来访问服务
查看tomcat03就是在在本地配置了tomcat02的配置
本地探究 – link 就是我们在host配置中增加了一个172.18.0.3 tomcat02 312857784cd4
我们现在玩Docker已经不建议使用–link了!
自定义网络,不使用docker0!
docker0问题: 它不支持容器名连接访问!
自定义网络
查看所有的docker网络
网络模式
详情见Docker容器原理剖析:https://blog.csdn.net/qq_41822345/article/details/115229833
bridge : 桥接 docker 大桥
none: 不配置网络
host: 和宿主机共享网络
container: 容器内网络联通!
测试
我们自己的网络就创建好了
现在不使用–link也可以ping名字了,推荐使用这种网络
好处:
不同的集群使用不同的网络,保证集群之间是安全和健康的
网络连通
这样容器之间就可以ping通了
**结论:**假设要跨网络操作别人,就需要使用docker network connect 连通!
实战 redis集群部署
集群搭建成功
-
构建springBoot项目
-
打包应用
-
编写dockerfile
-
构建镜像
-
发布运行
1.认识docker
-
Docker定义:
Docker 是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制( 沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响 ),相互之间不会有任何接口,更重要的是容器性能开销极低。
-
Docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。 -
Docker应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
2.Docker容器与虚拟机
容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。
总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
3.Docker 命令
1.Docker 容器使用
获取镜像
启动容器
查看容器
启动已经停止的容器
后台运行
停止一个容器
进入容器
退出容器
导出容器
导入容器
容器快照
删除容器
清理掉所有处于终止状态的容器
2.Docker Web应用
运行一个web应用
以端口5000开启端口
关闭web应用
重启web应用
移除web应用
3.Docker 镜像应用
列出镜像列表
获取镜像
4.Dockerfile
构建镜像
一般来说,我们可以将 Dockerfile 分为四个部分:
- 基础镜像(父镜像)信息指令 FROM
- 维护者信息指令 MAINTAINER
- 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
- 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
4.SpringBoot项目容器化步骤
step1:添加Docker的maven的插件,配置Dockerfile的path;
step2:在配置的Dockerfile的path处添加Dockerfile文件;
Step3:文件中添加配置
Step4:mvn clean package -Dmaven.test.skip=true (表示不执行测试用例,也不编译测试用例类。)
step5:mvn package docker:build 打镜像
step6:docker images 查看镜像
step7:docker run -p 8081:8081 -t springboot/web-app-template 运行
step8:查看运行结果:http://localhost:8081/…
step9:docker push
己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
3.Docker 命令
1.Docker 容器使用
获取镜像
启动容器
查看容器
启动已经停止的容器
后台运行
停止一个容器
进入容器
退出容器
导出容器
导入容器
容器快照
删除容器
清理掉所有处于终止状态的容器
2.Docker Web应用
运行一个web应用
以端口5000开启端口
关闭web应用
重启web应用
移除web应用
3.Docker 镜像应用
列出镜像列表
获取镜像
4.Dockerfile
构建镜像
一般来说,我们可以将 Dockerfile 分为四个部分:
- 基础镜像(父镜像)信息指令 FROM
- 维护者信息指令 MAINTAINER
- 镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
- 容器启动指令 CMD 、 ENTRYPOINT 和 USER 等
4.SpringBoot项目容器化步骤
step1:添加Docker的maven的插件,配置Dockerfile的path;
step2:在配置的Dockerfile的path处添加Dockerfile文件;
Step3:文件中添加配置
Step4:mvn clean package -Dmaven.test.skip=true (表示不执行测试用例,也不编译测试用例类。)
step5:mvn package docker:build 打镜像
step6:docker images 查看镜像
step7:docker run -p 8081:8081 -t springboot/web-app-template 运行
step8:查看运行结果:http://localhost:8081/…