Docker笔记(基础篇)
1|0Docker笔记(基础篇)
1|1Docker概述
1.Docker为什么出现?
一款产品: 开发–上线 至少存在两套环境!应用环境,应用配置!
问题:
-
我在我的电脑上可以允许!版本更新,导致服务不可用!对于运维来说考验十分大?
-
环境配置是十分的麻烦,每一个及其都要部署环境(集群Redis、ES、Hadoop…) !费事费力。
-
发布一个项目( jar + (Redis MySQL JDK ES) ),项目能不能带上环境安装打包!
-
之前在服务器配置一个应用的环境 Redis MySQL JDK ES Hadoop 配置超麻烦了,不能够跨平台。
开发环境Windows,最后发布到Linux!
-
传统:开发jar,运维来做!
-
现在:开发打包部署上线,一套流程做完!
安卓流程:java — apk —发布(应用商店)一 张三使用apk一安装即可用!
docker流程: java-jar(环境) — 打包项目帯上环境(镜像) — ( Docker仓库:商店)-----
Docker给以上的问题,提出了解决方案!
Docker的思想就来自于集装箱!
JRE – 多个应用(端口冲突) – 原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。
Docker通过隔离机制,可以将服务器利用到极致!
本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习!
2.Docker的历史
2010年,几个的年轻人,就在美国成立了一家公司
dotcloud
做一些pass的云计算服务!LXC(Linux Container容器)有关的容器技术! Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。他们将自己的技术(容器化技术)命名就是 Docker、Docker刚刚延生的时候,没有引起行业的注意!dotCloud,就活不下去!
所以开源
- 2013年,Docker开源!越来越多的人发现docker的优点!火了。Docker每个月都会更新一个版本!
- 2014年4月9日,Docker1.0发布!
docker为什么这么火?十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个VMware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
区别:
- VMware : linux centos 原生镜像(一个电脑!) 隔离、需要开启多个虚拟机! 几个G 几分钟
- docker: 隔离,镜像(最核心的环境 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧! 几个M 秒级启动!
3.Docker相关资料
Docker基于Go语言开发的!开源项目!
Docker官网:https://www.docker.com/
文档:https://docs.docker.com/ Docker的文档是超级详细的!
仓库:https://hub.docker.com/
4.Docker的作用
对比虚拟机技术来说
虚拟机技术
虚拟机的缺点:
- 资源占用十分多 (因为虚拟的是整个电脑的操作系统!)
- 冗余步骤多
- 启动很慢!
容器化技术
容器化技术不是模拟一个完整的操作系统
比较Docker和虚拟机技术的不同:
-
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
-
容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
-
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发、运维) Docker的优点:
1、用更快速的交付和部署
传统:一堆帮助文档,安装程序。
Docker:打包镜像发布测试一键运行。
2、更便捷的升级和扩缩容
使用了 Docker之后,我们部署应用就和搭积木一样
项目打包为一个镜像,扩展服务器A!服务器B
3、更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
4、更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致
1|2Docker的安装
Docker的基本组成:
1.预备知识
镜像(image):
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云…都有容器服务器(配置镜像加速!)
2.安装Docker
环境准备: Linux要求内核3.0以上、CentOS 7以上
环境充分后安装!
安装文档:https://docs.docker.com/engine/install/
3.卸载Docker
4.阿里云镜像加速
作用:下载镜像的时候加速,也就是为访问阿里云镜像仓库配置一个加速地址
步骤1:进入阿里云官网
步骤2:拷贝在linux执行即可!
步骤3:配置使用
扩展:镜像加速的原理
打个比方说,我们要做一个提供软件下载的网站,因为大家使用的ISP不同(有用电信的,也有使用网通的,也有铁通的),如果使用电信的用户访问网通的服务器就会很慢,同样使用网通的用户访问电信的服务器速度也慢。为了让使用不同ISP的用户的下载速度都能快,我们可以把主服务器放到电信的线路上,同时在网通的线路上架设镜像服务器1,铁通的线路上架设镜像服务器2。这样大家访问位于和自己相同ISP线路上的服务器去下载速度就快了。
5.回顾HelloWorld流程
运行镜像:docker run hello-world
运行Docker镜像的执行流程:
(个人感觉类似Maven的下载依赖的方式类似!)
6.底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令!
为什么Docker比Vm快 ?
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。
因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。
1|3Docker的常用命令
命令文档的地址:https://docs.docker.com/engine/reference/commandline/build/
1.帮助命令
2.镜像命令
使用样例:
查看所有镜像信息
搜索镜像(去镜像仓库搜索、Docker Hub!)
下载镜像
删除镜像
3.容器命令
说明:我们有了镜像才可以创建容器,Linux,下载centos镜像来学习(因为,容器就是将一个或一组镜像虚拟化,结合服务器的内核kernel,相当于一台小型Linux服务器)
镜像下载
容器命令
新建容器并启动
列出所有容器
退出容器
删除容器
启动、停止、重启容器
4.其他常用命令
后台启动运行容器 :(后台运行需要存在前台程序)
查看日志
查看容器中进程信息ps
查看镜像的元数据
进入当前正在运行的容器 (十分常用)
方式一:docker exec
方式二:docker attach
区别:
- docker exec: 进入当前容器后开启一个新的终端(新开终端),可以在里面操作。(常用)
- docker attach:进入容器正在执行的终端(打开上次的终端)
将容器内容拷贝到主机(宿主机)上
5.命令大全
小结:
1|4三道作业练习
1.Docker安装Nginx
分析图:
我们服务器配置安全组和放行端口后,我们可以访问到宿主机的3344端口,然而我们的容器相当于通过虚拟化镜像,依赖服务器内核,生成的小型linux服务器,而nginx是在我们的容器当中,想要访问需要配置映射关系,访问宿主机的3344端口的时候,自动映射到容器中nginx对应的80端口!
安装成功
问题:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器外部修改文件名,容器内部就可以自动修改?-v 数据卷 技术
2.Docker安装Tomcat
安装成功
3.Docker部署Elasticsearch+kibana
(暂时不写)
4.Portainer可视化面板
什么是portainer?(Docker提供的一个图形化管理面板)
- portainer(先用这个)
- Rancher(CI/CD再用)
注册用户 username:admin
pssword:qaz1234567,然后登录
管理面板
1|5Docker镜像
1.镜像是什么?
镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像 ?
- 从远程仓库下载
- 别人拷贝给你
- 自己制作一个镜像 DockerFile
2.Docker镜像加载原理
UnionFs (联合文件系统)
UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel, Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加載器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
- rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。
问题:平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
答:对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs.
虚拟机是分钟级别,容器是秒级!
3.镜像分层原理
我们知道Docker的镜像是分层下载的
思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
理解:
所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python包,
就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创健第三个镜像层该像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点.
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
上图中的镜像层跟之前图中的略有区別,主要目的是便于展示文件
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版。
文种情況下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统
Linux上可用的存储引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于 Linux中对应的
件系统或者块设备技术,井且每种存储引擎都有其独有的性能特点。
Docker在 Windows上仅支持 windowsfilter 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW [1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆并合井,对外提供统一的视图。
特点
Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
4.Commit镜像
实战测试
总结:如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们我们使用虚拟机的快照。
学完上述即是入门!
2|0Docker笔记(进阶篇)
2|1容器数据卷
1.什么是容器数据卷
将应用和环境打包成一个镜像!如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化,MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!(持久化容器当中数据)
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
2.数据卷的使用:
方式一 :直接使用命令挂载 -v
测试文件的同步:
再来测试!
1、停止容器
2、宿主机修改文件
3、启动容器
4、容器内的数据依旧是同步的
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
3.实战安装MySQL
思考:MySQL数据持久化的问题?
当我们在本地用SQLyog新建名称为test的数据库时候,容器容器也会创建
我们进行删除容器测试
结论:我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
4.具名和匿名挂载
挂载方式二:匿名挂载
挂载方式三:具名挂载
所有的docker容器内的卷,没有指定目录的情况下都是在**/var/lib/docker/volumes/自定义的卷名/_data**下,
如果指定了目录,docker volume ls 是查看不到的。
5.区分三种挂载方式
拓展:
6.初识Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
启动自己写的镜像
这个卷和外部一定有一个同步的目录
查看卷挂载的情况
测试:在容器中的卷目录中新增文件,判断宿主机的挂载目录是否同步
(结果应该同步,但是没有同步!)
这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
7.Docker数据卷容器
多个MySQL同步数据!(容器间的数据同步)
命名的容器挂载数据卷!
测试数据是否同步
多个mysql实现数据共享
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
容器数据卷和数据卷容器的区别:
容器数据卷:就是当前容器的数据卷,目的是通过挂载持久化容器中的数据,本质:目录
数据卷容器:当多个容器的数据需要同步的时候,并且当前容器是父容器,其余的所有容器都挂在于这个父容器 本质:容器
2|2DockerFile
1.DockerFile介绍
dockerfile
是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
去Dockerhub可以发现,每个镜像其本质就是一个dockerfile
点击后跳到一个Dockerfile
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
2.DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、#表示注释
4、每一个指令都会创建提交一个新的镜像,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
-
DockerFile:构建文件,定义了一切的步骤,源代码
-
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
-
Docker容器:容器就是镜像运行起来提供服务。
3.DockerFile指令
通俗介绍:
4.创建自己的镜像
前提:scratch镜像
[Docker Hub 中 99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建。]
创建自己的Centos
对上述指令测试:
我们可以列出本地进行的变更历史
我们平时拿到一个镜像,可以用 “docker history 镜像id” 研究一下是什么做的
5.CMD 和 ENTRYPOINT区别
测试CMD指令
测试ENTRYPOINT指令
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!
总结:CMD是覆盖,ENTRYPOINT是追加
6.实战:Tomcat镜像
1.准备tomcat和jdk的Linux下压缩包
2.进入我们放置压缩包目录,并创建Readme文件
3.创建Dockerfile文件
4.构建镜像
5.run镜像后台运行(启动容器)·
6.访问测试
模拟一个项目发布的过程
一个简单的项目,需要web.xml和index.jsp,我们将其放在test目录下,这样test就够成一个简单的web项目!
测试:我们只需访问/test 默认会返回index.jsp文件!
web.xml
index.jsp
项目部署成功!
发现:项目部署成功,可以直接访问!(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
7.发布镜像到Dockerhub
1、先取Dockerhub注册账号 :地址 https://hub.docker.com/
2、登录Dockerhub
3.在服务器中登录Dockerhub
4.提交镜像
发布成功!
8.发布到阿里云镜像服务
bilibili视频讲解:https://www.bilibili.com/video/BV1og4y1q7M4?p=32
看aliyun官网 很详细https://cr.console.aliyun.com/repository/
9.Docker流程小结
2|3Docker 网络
准备工作:清空容器和镜像
测试
思考:Docker 是如果处理容器网络访问的?
容器1中的tomcat如何访问容器2中的MySQL?
理解Docker0
原理:
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术、参考文章:https://www.cnblogs.com/bakari/p/10613710.html
再次测试 ip addr
3、我们来测试下tomcat01和tomcat02是否可以ping通
网络模型图
结论:tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
小节
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
–link
思考一个场景:我们编写了一个微服务,database url=ip: 项目不重启,数据ip换了,我们希望可以处理这个问题,可以通过名字来进行访问容器?
探究
查看tomcat03里面的/etc/hosts发现有tomcat02的配置
–-link 本质就是在hosts配置中添加映射
但是,现在使用Docker已经不建议使用–link了!
我们采取,自定义网络,但是【自定义网络不适用docker0】docker0问题:不支持容器名连接访问
自定义网络
容器互联
查看所有的Docker网络
网络模式
- bridge :桥接 docker(默认,自己创建也是用bridge模式)
- none :不配置网络,一般不用
- host :和所主机共享网络
- container :容器网络连通(用得少!局限很大)
测试我们的网络模式
创建网络
再次启动两个tomcat容器,添加网络参数我mynet,这样我们的容器就不会走docker0
再次查看我们的网路详细
在自定义的网络下,容器可以互相ping通,不用使用–link
我们自定义的网络docker当我们维护好了对应的关系,推荐我们平时这样使用网络!
- redis -不同的集群使用不同的网络,保证集群是安全和健康的
- mysql-不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
实战:部署Redis集群
实战:部署springboot项目
1.构建Springboot项目
2.打成jar包,在本地的windos环境测试运行
3.编写Dockerfile
4.构建镜像
5.启动容器
需要注意的是:配置安全组和防火墙端口放行!
公网访问:http://60.205.180.178:49154 也就是宿主机的端口号!
注意:教程是看的b站狂神说Java
__EOF__

本文链接:https://www.cnblogs.com/qxsong/p/15837300.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)