Docker入门
1、Docker概述
1.1 Docker为什么出现
一款产品:开发—–上线 两套环境!应用环境,应用配置!
开发 —- 运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大?
环境配置是十分的麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop…),费时费力!
发布一个项目 ( jar + ( Redis MySQL jdk ES ) ),项目能不能都带上环境安装打包!
之前在服务器配置一个应用的环境Redis MySQL jdk ES Hadoop,配置超麻烦了,不能够跨平台。
Windows,最后发布到Linux!
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完!
java — apk —发布( 应用商店 )—-张三使用apk —安装即可用!
java — jar( 环境 ) — 打包项目带上环境( 镜像 ) —- ( Docker仓库:商店 ) —-下载我们发布的镜像—-直接运行即可!
Docker给以上的问题,提出了一个标准化的解决方案!
Docker的思想就来自于集装箱!
Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。通过Docker镜像 ( images ) 将应用程序所需要的系统环境,由下而上打包,达到应用程序跨平台间的无缝接轨运作。
JRE — 多个应用(端口冲突) — 原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。水果——生化武器
Docker通过隔离机制,可以将服务器利用到极致!
1.2 Docker的历史
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“”的公司。
这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。
他们将自己的技术 ( 容器化技术 ) 命名就是Docker !
Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。
什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。
2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。
越来越多的人发现了docker的优点!火了,Docker每个月都会更新一个版本!2014年4月9日,Docker1.0发布!
Docker和容器技术为什么这么火?说白了,就是因为它十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在windows中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术,属于轻量级的虚拟化!
聊聊Docker
Docker是基于Go语言开发的!开源项目!
官网:https://www.docker.com
文档地址:https://docs.docker.com Docker的文档是超级详细的!
Docker中文网站:http://www.docker.org.cn
Docker中文文档:http://www.dockerinfo.net/document
仓库地址:https://hub.docker.com
1.3 Docker能干嘛
之前的虚拟机技术
虚拟机(virtual machine)就是带环境安装的一种解决方案。
虚拟机的缺点:
1、资源占用多
2、冗余步骤多
3 、启动慢
容器虚拟化技术
由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
开发 / 运维(DevOps)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
项目打包为一个镜像,扩展 服务器A! 服务器B!
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用
Docker是 内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
2、Docker安装
2.1 Docker的基本组成
Docker的架构图:
镜像(image):
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==> tomcat01容器 ( 提供服务器),通过这个镜像可以创建多个容器( 最终服务运行或者项目运行就是在容器中的 )。
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库(Public)和私有仓库(Private)!
Docker Hub ( 默认是国外的 )
阿里云 、网易云…都有容器服务器( 配置镜像加速 )
小结:
需要正确的理解仓储/镜像/容器这几个概念:
-
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
-
image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
-
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
-
至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。
2.2 环境说明
我们使用的是 CentOS 7 (64-bit)
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
查看自己的内核:
命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
查看版本信息:
2.3 安装Docker
环境准备
1、需要会一点点的Linux的基础
2、CentOS 7
3、我们使用Xshell连接远程服务器进行操作!
安装
1、官网安装参考手册:https://docs.docker.com/engine/install/centos/
2、确定你是CentOS7及以上版本
3、yum安装gcc相关环境(需要确保 虚拟机可以连上外网 )
4、卸载旧版本
5、安装需要的软件包
6、设置镜像仓库
7、更新yum软件包索引
8、安装 Docker CE
9、启动 Docker
10、设置开机启动
11、测试命令
12、卸载
2.4 阿里云镜像加速
1、介绍:https://www.aliyun.com/product/acr
2、登录阿里云找到容器服务
3、找到自己的镜像加速地址
4、配置镜像加速
2.5 回顾HelloWorld流程
1、启动hello-world
2、run干了什么?
2.6 底层原理
Docker是怎么工作的
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
DockerServer接收到Docker-Client的指令,就会执行这个命令!
为什么Docker比较 VM 快
1、docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
3、Docker常用命令
3.1 帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline/info/
3.2 镜像命令
docker images 查看所有本地的主机上的镜像
docker search 搜索镜像
docker pull 下载镜像
指定版本下载
镜像版本号重命名
docker rmi 删除镜像
3.3 容器命令
有镜像才能创建容器,linux,我们这里使用 centos 的镜像来测试,就是虚拟一个 centos !
新建容器并启动
列出所有运行的容器
退出容器
删除容器
启动停止容器
3.4 常用其他命令
后台启动容器
查看日志
查看容器中运行的进程信息,支持 ps 命令参数
查看容器 / 镜像的数据
进入正在运行的容器
从容器内拷贝文件到主机上
3.5 小结
常用命令:
docker的命令是十分多的,上面我们学习的那些都是最常用的容器和镜像的命令,之后我们还会学习很多命令!
3.6 作业练习
使用Docker 安装 Nginx
端口暴露概念:
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改? -v 数据卷!
使用Docker 安装 Tomcat
使用Docker 部署 es + kibana
3.7 可视化
Portainer(先用这个)
Rancher(CI / CD再用这个)
介绍:
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
如果仅有一个docker宿主机,则可使用单机版运行,Portainer单机版运行十分简单,只需要一条语句即可启动容器,来管理该机器上的docker镜像、容器等数据。
访问方式:http://192.168.10.110:8088
首次登陆需要注册用户,给admin用户设置密码:
单机版这里选择local即可,选择完毕,Connect即可连接到本地docker:
登录成功之后可见面板!
可视化面板我们平时不会使用,大家自己测试玩玩即可!
4、Docker镜像讲解
4.1 镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
4.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发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
虚拟机是分钟级别,容器是秒级!
4.3 分层理解
分层的镜像
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!
思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过 docker image inspect 命令!
理解:
所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux 16.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.4 镜像Commit
docker commit 从容器创建一个新的镜像
测试:
5、容器数据卷
5.1 什么是容器数据卷
Docker的理念回顾:
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!
就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了!需求:MySQL数据可以存储在本地!
所以我们希望容器之间可以共享数据,Docker容器产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
作用:
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此,能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
5.2 使用数据卷
方式一:容器中直接使用命令来添加 -v
挂载
查看数据卷是否挂载成功
测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!
测试容器停止退出后,主机修改数据是否会同步!
1、停止容器
2、在宿主机上修改文件,增加些内容
3、启动刚才停止的容器
4、然后查看对应的文件,发现数据依旧同步!
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
5.3 使用 Docker 安装 mysql
思考:mysql 数据持久化的问题!
5.4 匿名和具名挂载
所有的docker容器内的卷,没有指定目录的情况下都是在
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用具名挂载
拓展:
5.5 初始 Docker File
DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的命令脚本。
测试:
这个卷和外部一定有一个同步的目录!
查看一下数据卷挂载的路径
测试一下刚才的文件是否同步出去了!
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
注意:
如果访问出现了 cannot open directory:Permission denied
解决办法:在挂载目录后多加一个 参数即可
5.6 数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
例如:多个mysql同步数据!
我们使用上一步的镜像:mstudy/centos 为模板,运行容器 docker01,docker02,docker03,他们都会具有容器卷
我们来测试下,容器间传递共享
1、先启动一个父容器docker01,然后在dataVolumeContainer2新增文件
退出不停止:Ctrl + P + Q
2、创建docker02,docker03 让他们继承docker01
3、回到docker01发现可以看到 docker02 和 docker03 添加的共享文件
4、删除docker01,docker02 修改后docker03还能不能访问
5、删除docker02 ,docker03还能不能访问
6、新建docker04继承docker03,然后再删除docker03,看下是否可以访问!
多个mysql实现数据共享
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用它为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的,它会一直保留!
6、DockerFile
大家想想,Nginx,tomcat,mysql 这些镜像都是哪里来的?官方能写,我们不能写吗?
我们要研究自己如何做一个镜像,而且我们写的微服务项目以及 springboot 打包上云部署,Docker就是最方便的。
微服务打包成镜像,任何装了Docker的地方,都可以下载使用,极其的方便。
流程:开发应用 =-=> DockerFile =-=> 打包为镜像 =-=> 上传到仓库(私有仓库,公有仓库)=-=> 下载镜像 =-=> 启动运行。
还可以方便移植!
6.1 什么是DockerFile
dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。
构建步骤:
1、编写一个 dockerFile 文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像 ( DockerHub、阿里云镜像仓库!)
dockerfile 文件我们刚才已经编写过了一次,这里我们继续使用 centos 来看!
地址:https://hub.docker.com/_/centos
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
6.2 DockerFile 构建过程
基础知识:
1、每个保留字关键字 ( 指令 ) 都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写 dockerfile 文件,这个文件十分简单!
流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!
说明:
从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
- DockerFile 是软件的原材料 (代码)
- Docker 镜像则是软件的交付品 (.apk)
- Docker 容器则是软件的运行状态 (客户下载安装执行)
DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!
DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程( 当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权限控制 )等等。
Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行Docker 镜像时,会真正开始提供服务;
Docker容器:容器是直接提供服务的。
6.3 DockerFile 指令
关键字:
6.4 实战测试
Docker Hub 中 99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的
自定义一个 centos
1、编写DockerFile
2、构建
docker build -f dockerfile地址 -t 新镜像名字:TAG .
3、运行
之前的原生的centos7
我们增加之后的镜像
4、列出镜像的变更历史
CMD 和 ENTRYPOINT 的区别
测试:
Dockerfile 中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习方式就是对比他们然后测试效果!
6.5 自定义镜像 Tomcat
1、准备镜像文件 tomcat 压缩包,jdk 的压缩包!
2、在 /opt/module目录下新建文件夹 mkdir -p build/tomcat
3、在新建目录下创建一个文件 touch readme.txt
4、将 jdk 和 tomcat 安装的压缩包拷贝进上一步目录
5、在 /opt/module/build/tomcat 目录下新建一个 Dockerfile 文件
当前文件状态
6、构建镜像
7、运行启动 run
备注:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个 –privileged=true 参数即可
8、验证测试访问!
9、发布项目 ( 由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
10、进行测试
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dokcerfile的编写!我们之后的一切都是使用 docker 镜像来发布运行!
6.6 发布自己的镜像
DockerHub
注册dockerhub https://hub.docker.com/signup,需要有一个账号,并且可以登录
阿里云镜像服务
1、登录阿里云
2、找到容器镜像服务,然后创建个人版实例
3、创建命名空间
4、创建镜像仓库
5、进入这个镜像仓库,可以看到所有的信息
6、测试推送发布
7、在阿里云镜像仓库查看效果!
6.7 总结
7、Docker 网络讲解
7.1 理解Docker0
准备工作:清空所有的容器,清空所有的镜像
Docker的网络也是十分重要的一个点,希望大家可以认真理解!
我们先来做个测试
查看本地ip
这里我们分析可得,有三个网络:
我们之前安装ES的时候,留过一个问题,就是安装Kibana的问题,Kibana得指定ES的地址!或者我们实际场景中,我们开发了很多微服务项目,那些微服务项目都要连接数据库,需要指定数据库的url地址,通过ip。但是我们用Docker管理的话,假设数据库出问题了,我们重新启动运行一个,这个时候数据库的地址就会发生变化,docker会给每个容器都分配一个ip,且容器和容器之间是可以互相访问的。
我们可以测试下容器之间能不能ping通过:
原理
1、我们每启动一个 docker 容器,docker 就会给 docker 容器分配一个 ip,每一个安装了 Docker 的 linux 主机都有一个 docker0 的虚拟网卡。这是个桥接网卡,使用了 veth-pair 技术!
2、每启动一个容器,linux主机就会多了一对虚拟网卡。
3、我们来测试下 tomcat01 和 tomcat02 容器间是否可以互相 ping 通
4、我们来画一个网络模型图
结论:
-
tomcat1和tomcat2共用一个路由器 docker0
-
所有的容器不指定网络的情况下,都是docker0路由
-
docker会给我们的容器分配一个默认的可用IP
小结
Docker 使用的是 Linux 桥接,在宿主机虚拟一个Docker容器网桥 (docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker 容器网络就很好的利用了 Linux 虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为 Linux 是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。
只要容器删除,对应网桥一对就没了!
7.2 –Link
思考一个场景,我们编写一个微服务,数据库连接地址原来是使用ip的,如果ip变化就不行了,那我们能不能使用服务名访问呢?
jdbc:mysql://mysql:3306,这样的话哪怕mysql重启,我们也不需要修改配置了!docker提供了 –link 的操作!
探究:inspect
思考,这个原理是什么呢?我们进入tomcat03中查看下host配置文件
本质探究:–link就是我们在hosts配置中增加了一个 172.17.0.2 tomcat02 298a47b9ce43
docker0问题:它不支持容器名连接访问!
–link早都过时了,我们不推荐使用!我们可以使用自定义网络的方式
7.3 自定义网络
基本命令查看
命令如下:
查看所有网络
所有网路模式
查看一个具体的网络的详细信息
自定义网卡
1、删除原来的所有容器
2、接下来我们来创建容器,但是我们知道默认创建的容器都是docker0网卡的
3、我们可以让容器创建的时候使用自定义网络
我们自己的网络就创建好了!
好处:
-
redis 不同的集群使用不同的网络,保证集群是安全和健康的
-
mysql 不同的集群使用不同的网络,保证集群是安全和健康的
7.4 网络连通
docker0和自定义网络肯定不通,我们使用自定义网络的好处就是网络隔离
那关键的问题来了,如何让 tomcat-net-01 访问 tomcat1 ?
如果要跨网络操作别人,就需要使用 docker network connect 连通!
7.5 实战:部署一个Redis集群
我们使用了docker之后,所有的技术都会慢慢的变得简单起来!
8、IDEA整合Docker
8.1 创建项目
1、使用 IDEA 构建一个 SpringBoot 项目
Navicat Premium 8.1.12激活2、编写一个HelloController
3、启动测试下,本地访问没问题就可以!
4、打jar包
有了 jar 包,我们就可以作镜像了! 记得测试一下jar包可以使用吗!
8.2 打包镜像
1、在项目下编写 Dockerfile 文件,将打包好的 jar 包拷贝到Dockerfile同级目录
2、将Dockerfile 和 项目的 jar 包上传到 linux 服务器上,构建运行
我们使用了Dokcer之后,给别人交付的就是一个镜像即可!
今天的文章
Navicat Premium 8.1.12激活(Docker入门)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/106526.html