写在前面
推荐一个不错的Docker讲解视频链接:https://www.bilibili.com/video/BV1og4y1q7M4
【狂神说Java】Docker最新超详细版教程通俗易懂
概述
官网: https://docs.docker.com/
Docker Hub 网站: https://hub.docker.com/
容器较为官方的解释
一句话概括容器:容器就是将软件打包成标准化单,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
容器较为通俗的解释
如果需要通俗地描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。
虚拟化技术和容器化技术
虚拟化技术
首先,Docker 容器虚拟化技术为基础的软件,那么什么是虚拟化技术呢?
简单点来说,虚拟化技术可以这样定义:
虚拟化技术是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
Docker 基于 LXC 虚拟容器技术
Docker 技术是基于 LXC(Linux container- Linux 容器)虚拟容器技术的。
LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
cgroup 和 namespace 介绍:
-
namespace 是 Linux 内核用来隔离内核资源的方式。 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
(以上关于 namespace 介绍内容来自https://www.cnblogs.com/sparkdev/p/9365405.html ,更多关于 namespace 的呢内容可以查看这篇文章 )。
-
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。
(以上关于 CGroup 介绍内容来自 https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html ,更多关于 CGroup 的呢内容可以查看这篇文章 )。
cgroup 和 namespace 两者对比:
两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
Docker基本组成
Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期
Docker安装
查看系统内核和系统信息
命令:
示例:
开始安装Docker
卸载旧版本
命令:
示例:
下载依赖安装包
配置镜像仓库
示例:
更新yum软件包
下载docker
一般情况下安装
启动Docker
命令:
示例:
Docker的HelloWorld
命令:
示例:
Docker卸载
配置阿里云镜像
进入阿里云官网,搜索容器镜像服务
执行命令
Docker运行流程和原理
启动流程
运行原理
Docker整体架构
Docker常用命令
命令的帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/
管理镜像常用命令
创建容器
容器限制
基本命令
命令:
示例:
镜像命令
docker images 查看本地主机的所有镜像
示例:
列表参数介绍:
docker search 搜索镜像
示例:
docker pull 镜像名[:tag] 下载镜像
示例:
docker rmi 删除镜像
容器命令
docker run [可选参数] image 运行容器
示例:
进入容器
exit 退出容器
docker ps列出容器
docker rm删除容器
启动和重启容器命令
其他命令
后台启动容器
查看日志
查看容器中进程信息
查看镜像的数据
进入当前正在运行的容器
方式一:
拷贝容器文件到主机
拷贝容器的文件到主机中
常用命令小结
Docker图形化管理工具
Docker UI
命令:
示例:
使用:
会出现如下的界面:
Shipyard
镜像下载
脚本安装shipyard
Portainer
命令:
示例:
使用:
常见容器部署:Nginx, Tomcat, es + kibana
Nginx
命令:
测试访问:
Tomcat
命令:
测试访问:
es + kibana
添加 ’-e ES_JAVA_OPTS=“-Xms128m -Xmx512m” ‘ 配置ElasticSearch的虚拟机占用的内存大小。
docker stats 查看资源占用情况
端口暴露的原理
可视化
- portainer(先用这个)
- Rancher(CI/CD再用)
Docker镜像讲解
镜像是什么
Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。
所有的应用,直接打包成Docker镜像,然后通过镜像创建出容器,然后就可以直接跑起来。
如何得到镜像:
- 从远程仓库下载,比如docker hub、阿里云的镜像仓库等。
- 朋友拷贝给你。
- 自己制作一个镜像DockerFile。
通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过Commit命令提交一个新的镜像。
UnionFS(联合文件系统)
-
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
-
特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。
-
bootfs(boot file system)主要包含BootLoader和kernel,BootLoader主要负责引导加载kernel,Linux刚启动时会加载bootfs文件系统来引导内核的加载,Docker镜像的最底层就是bootfs。这一层与我们典型的unix系统是一样的,包含boot引导器和内核,当boot加载完成后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统会卸载bootfs。
-
rootfs(root file system),包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同Unix操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。
我们平时安装的虚拟机centos镜像好几个G,Docker安装的才200多M,因为对于一个精简的OS,rootfs可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供rootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的bootfs基本是一致的,roorfs有差别,因此不同的发行版可以公有bootfs。虚拟机是分钟级别,容器是秒级。
第一个图仅仅是bootfs+rootfs,然后如果要制作一个emacs环境的镜像,就在这个基础上新加一层emacs镜像,如图二。如果要在添加一个Apache环境,那就再图二基础上加一个apache镜像。如图三。图中的每一层镜像都能进行复用。
分层理解
分层的镜像
比如:上面的redis镜像。使用docker inspect redis镜像的ID 命令查看镜像的信息,找到layer信息。
由上图可以看到下载的redis镜像是由6个镜像一层层组成的。
这些镜像都是一个个独立可复用的镜像,如果下载其他镜像是,某一层镜像是已经存在本地的了,就不用在下载,直接复用该镜像,节省空间。比如上面下载redis镜像时,提示某个镜像已经存在。
注意:
Docker镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫作容器层,容器层之下的叫作镜像层。
如上图,使用Tomcat镜像创建容器后,会在Tomcat镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用commit命令把该容器创建一个新的镜像,实际上新的镜像是tomcat镜像+可写层镜像,以tomcat镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。
commit镜像
命令:
实战测试
容器数据卷
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像
数据如果都在容器中,那么我们容器一旦删除,数据就会丢失
MySQL,容器删了,删库跑路
容器之间可以有一个数据共享的技术,Docker容器中产生的数据同步到本地
这就是卷技术,目录的挂载将我们容器内的目录挂载到Linux上面
容器的持久化和同步操作,容器间也是可以做数据共享的
使用数据卷
方式一:直接使用命令来挂载 -v
测试文件的同步(在主机上改动,观察容器变化)
再来测试(测试通过)
-
停止容器
-
主机上修改文件
-
启动容器
-
容器内的数据依旧是同步的!
好处:我们以后只要在本地进行修改即可,不需要每次都进入容器内部都能实现自动同步
实战:安装MySQL
思考:MySQL的数据持久化的问题!
假设删除了docker镜像
发现,挂载到本地的数据卷依然没有丢失,这实现了容器数据持久化功能
具名和匿名挂载
所有docker容器内的卷,没有指定目录的情况下都是在
我们通过具名挂载可以方便找到我们的一个卷,大多数情况都使用具名挂载
拓展
初识DockerFile
Dockerfile就是用来构建docker镜像的构建文件!也就是命令脚本
通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本一个个的命令对应层数
部署容器
启动自己的容器
这个卷和外部一定有一个同步的目录!
在目录下新建一个测试用的文件
查看卷挂载的路径
测试一下刚才的文件是否同步到主机上了
成功。
这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器
多个mysql同步数据!
CTRL+p+q 退出当前的docker01,通过docker01挂载docker02
同理创建一个docker03,在数据卷上新建的文件也会在其它容器上同步
多个mysql实现数据共享
结论
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,这个时候,本地的数据是不会被删除的。
DockerFile
DockerFile介绍
Dockerfile是用来构建docker镜像的文件,命令参数脚本
构建步骤:
- 构建一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看一下官方是怎么做的
很多官方镜像都是基础包,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那我们也可以自己构建。
DockerFile构建过程
基础知识:
-
每个保留关键字(指令)都必须是大写字母
-
执行顺序从上到下
-
#表示注释
-
每一个指令都会创建提交一个新的镜像层,并提交!
Docker镜像原理
Dockerfile概念及作用
Dockerfile 关键字
Dockerfile 案例
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单。
步骤:开发、部署、上线运维
Dockerfile:构建文件,定义了一切的步骤,源代码
Dockerimage:通过Dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:镜像运行起来提供服务
DockerFile指令
以前的时候我们是使用别人的,现在我们尝试用dockerfile构建一个自己的镜像
实战测试
DockerHub中99%的镜像都是从基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
创建一个自己的centos
对比之前原生的centos:增加之后的镜像默认进入了工作目录,且可以使用vim
我们可以列出本地进行的变更历史
我们平时拿到一个镜像,可以研究一下它是如何构建的了。
CMD 和 ENTRYPOINT 区别
测试CMD
测试ENTRYPOINT
DockerFile中很多命令都十分相似,我们需要了解他们的区别,最好的学习方式就是测试并对比效果
实战:Tomcat镜像
- 准备镜像文件 tomcat 压缩包
- 编写dockerfile文件,官方命名,build会自动寻找这个文件,就不需要 -f 进行指定了
- 构建镜像
- 启动镜像
- 访问测试
访问网站
- 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
在tomcat的test文件夹下建立文件夹WEB-INF ,在其中创建web.xml
在test文件夹下创建index.jsp文件
发现:项目部署成功,可以正常访问页面
以后开发的步骤:需要掌握Dockerfile的编写,我们之后的一切都是使用docker镜像来进行
发布自己的镜像
DockerHub
-
地址https://hub.docker.com/ 注册自己的账号
-
确定这个账号可以登录
-
在我们的服务器上提交自己的镜像
- 登录完毕后就可以提交镜像了 docker push
5.提交镜像
提交的时候也是按照镜像层级来进行提交的
阿里云镜像服务
-
登录阿里云
-
找到容器镜像服务
-
创建命名空间
-
创建容器镜像
-
浏览阿里云
小结:
Docker 网络
理解Docker0
清空所有环境
三个网络
Docker在官网下载Tomcat镜像里面没有ip addr等命令解决
解决方案:
- 进入上面你利用Tomcat镜像运行的容器。
- 执行下面两个命令
- 成功
原理:
- 我们每启动一个docker容器,docker就会给docker容器分配一个id,我们只要安装了docker,就会有一个网卡docker0
桥接模式,使用的技术是veth-pair技术
再次测试 ip addr
- 再启动一个容器测试,发现又多了一对网卡
- 我们来测试下tomcat01和tomcat02是否可以ping通
绘制一个网络模型图
结论:tomcat01 和tomcat02 是共用的一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
小结
docker使用的是Linux的桥接,宿主机中是一个docker容器的网桥 docker0
docker中所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件)
只要容器删除,对应网桥一对就没了!
–link
思考一个场景,我们编写一个微服务,database url=ip: ,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以用名字来访问容器?
其实这个tomcat03就是在本地配置了tomcat02的配置
本质探究:–link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 56140c84bab0
我们现在玩Docker已经不建议使用–link了!
自定义网络!不使用Docker0!
Docker0的问题:它不支持容器名链接访问!
自定义网络
查看所有的docker网络
网络模式
bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式
none: 不配置网络
host: 和宿主机共享网络
container:容器网络连通!(用的少, 局限很大)
- 测试
我们自己的网络就创建好了
在自己创建的网络里面启动两个容器
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:
redis – 不同的集群使用不同的网络,保证集群时安全和健康的
mysql – 不同的集群使用不同的网络,保证集群时安全和健康的
网络连通
测试打通tomcat01 和 mynet
实战 部署Redis集群
docker搭建redis集群完成!
SpringBoot微服务打包Docker镜像
-
构建springboot项目
-
打包应用
-
编写Dockerfile
-
构建镜像
-
发布运行
Navicat for Premium 9.0.2激活
今天的文章
Navicat for Premium 9.0.2激活(Docker教程(超全总结))分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/112053.html