当前位置:网站首页 > R语言数据分析 > 正文

docker 历史版本(dockerversion)



官网:https://www.docker.com/

文档地址:https://docs.docker.com/

仓库地址:https://hub.docker.com/
image-20210123215554401

一款产品的开发往往需要多套环境,比如开发环境、测试环境以及最终的上线环境;环境的配置是时分麻烦的,每一个机器都要部署环境(Redis、ES、Hadoop集群…),尤其是各种集群的部署特别浪费时间,常常会遇到 ”在我电脑上可以运行,在你电脑上不能运行“、”版本更新导致服务不用“、”不能跨平台“ 等等大量问题,这对运维人员来说就十分棘手。

在以前,开发人员发开完成就发布一个或者包,其他的都交给运维人员来做;而现在,开发即运维,打包部署上线一套流程走完:开发人员会将项目及其附带的环境一起打包成一整套发布,称为镜像,这样就不再需要再配置环境,直接执行一整套即可,省去环境配置的麻烦且保证了一致性;

的出现就是为了解决以上问题,类似于安卓应用:

  • java – apk – 发布到应用商店 – 下载即可使用
  • java – jar(环境) – 打包项目+环境(镜像) – 发布到Docker仓库 – 下载镜像即可直接运行

image-20210123213116207
Docker 的思想来源于集装箱,打包装箱,每个箱子互相隔离

Docker 通过隔离机制,可以将服务器运行到极致


参考:Docker的前生今世

2010 年,几个搞 IT 的年轻人,在美国旧金山成立了一家名叫 的公司。dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。底层技术上,dotCloud 平台利用了 Linux 的 LXC 容器技术。

img

为了方便创建和管理这些容器,dotCloud 基于 Google 公司推出的 Go 语言开发了一套内部工具,之后被命名为 。Docker 就是这样诞生的。

如同 Docker 的 Logo 一样,Docker 的思想来源于集装箱。集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来,并且各种各样的货物被集装箱标准化,集装箱与集装箱之间互不影响。那么就不需要专门运送水果的船和专门运送化学用品的船了。只要这些货物封装在不同的集装箱里,就可以用一艘大船把它们都运走。

Docker 技术诞生之后,并没有引起行业的关注。而 dotCloud 公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。

正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。

有的软件一开始就是开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。2013 年 3 月,dotCloud 公司的创始人之一,Docker 之父,28 岁的 「Solomon Hykes」 正式决定,将 Docker 项目开源。
img

不开则已,一开惊人。越来越多的 IT 工程师发现了 Docker 的优点,然后蜂拥而至,加入 Docker 开源社区。Docker 的人气迅速攀升,速度之快,令人瞠目结舌。

开源当月, Docker 0.1 版本发布。此后的每一个月, Docker 都会发布一个版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式发布。

此时的 Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像 Google、微软、Amazon、 VMware 这样的巨头们都对它青睐有加,表示将全力支持。

Docker 火了之后, dotCloud 公司干脆把公司名字也改成了 Docker Inc.


虚拟机技术

image-20210123222839757

缺点

  • 资源占用十分大
  • 冗余步骤多
  • 启动慢

容器化技术不是模拟的一个完整的操作系统

image-20210123223050340

Docker 和 虚拟机技术 的不同:

  • 传统虚拟机技术,虚拟出一套硬件,运行一个完整的操作系统,在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟硬件,轻便快速,
  • 每个容器互相隔离,每个容器都有一个自己的文件系统,互不影响

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」 这类问题。

持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的在生产环境中部署该镜像。

更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。


技术的出现以后,的概念由然而生,即开发即运维

应用更快速的交付和部署

  • 传统:一堆帮助文档,安装程序
  • Docker:打包镜像发布测试,一键运行

更便捷的升级和扩缩容

  • 使用Docker之后,部署应用就和搭积木一样
  • 项目打包成一个镜像,比如服务器A出现性能瓶颈,水平拓展,在服务器B上一键运行镜像

更简单的系统运维

  • 容器化之后,开发、测试环境高度一致

更高效的计算资源利用

  • Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,服务器性能可以被压榨到极致


img

镜像(image)

镜像就是一个只读的模板,可以通过这个模板创建容器服务,一个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)

容器(container)

  • Docker利用容器技术,独立运行的一个或一组应用。容器是用镜像创建的运行实例。
  • 它可以被启用,开始,停止,删除。每个容器都是相互隔离的,保证安全的平台。
  • 可以把容器看作是一个简易版的Linux系统(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
  • 容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的

仓库(repository)

  • 仓库是集中存放镜像文件的场所。
  • 仓库和仓库注册服务器(Registry)是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签
  • 仓库分为公开仓库(public)和私有仓库(private)两种形式
  • 最大的开放仓库是国外的 Docker Hub,存放了数量庞大的镜像供用户下载。
  • 国内的公开仓库包括阿里云,网易云都有容器服务器(需要配置镜像加速)等

要安装Docker Engine,您需要CentOS 7或8的维护版本。不支持或未测试存档版本。

这里为阿里云 服务器,用 连接远程服务器工具

 

image-20210124122435184


官网安装教程十分详细,可参照此教程:https://docs.docker.com/engine/install/centos/

1. 卸载旧版本

 

image-20210124122540474
yum报告没有安装这些软件包,即可

2. 安装Docker软件包

 

3. 设置镜像仓库地址

 

image-20210124125536572

4. 安装最新版Docker Engine和容器

安装前建议先将将服务器上的软件包信息现在本地缓存,以提高安装软件的速度

 

image-20210124131450474

 

image-20210124131501379
安装完成后,Docker只安装但并未启动

5. 启动Docker

 

然后可用命令测试Docker是否安装成功,并查看Docker的版本信息
image-20210124132058970

6. 运行Hello World映像测试

 

image-20210124132401800
我们可用查看Docker所有的镜像信息
image-20210124132716312


1. 卸载Docker依赖

 

2. 删除Docker资源

 

为Docker的默认工作路径

登录阿里云账号,找到产品与服务下的弹性计算中的容器镜像服务image-20210124134502593
点击进入,找到左侧栏 镜像加速器,选择对应的系统,便可看到对用的命令
image-20210124134727343
然后就可配置使用,逐条执行以下命令

 

image-20210124134953356
到此则配置完毕



Docker是怎么工作的?

  • Docker 是一个 结构的系统,Docket 的守护进程运行在主机上,通过Socket从客户端访问
  • DockerServer 接收到 DockerClient 的指令,就会执行这个命令

image-20210124152058394

Docker为什么比VM快?

image-20210124155953457

  1. Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
  2. Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
Docker容器虚拟机(VM)操作系统与宿主机共享OS宿主机OS上运行宿主机OS存储大小镜像小,便于存储与传输镜像庞大(vmdk等)运行性能几乎无额外性能损失操作系统额外的cpu、内存消耗移植性轻便、灵活、适用于Linux笨重、与虚拟化技术耦合度高硬件亲和性面向软件开发者面向硬件运维者


帮助文档地址:https://docs.docker.com/reference/
img

 

查看所有镜像

 

测试:

 

搜索镜像

 

测试:

 

下载镜像

 

测试:

 

下载完再次查看所有镜像,即可看到刚下载的镜像

image-20210125201641758

删除镜像

 

测试:

 

有了镜像才能够创建容器,这里下载一个centos镜像为以下测试做准备

 

新建容器并启动

 

测试:

 

列出所有运行的容器

 
 

退出容器

 

删除容器

 

测试:

 

启动停止容器

 

后台启动容器

 

测试:

 
  • 问题:后台启动容器,再用 docker ps 查看发现容器停止
  • 原因:docker 容器使用后台运行,就必须有一个前台进程;如果仅仅后台启动,没有应用来提供服务,就会自动停止

查看日志

 

测试:

 

查看容器中的进程

 

测试:

 

查看镜像元数据

 

测试:

 

进入当前正在运行的容器

容器通常都是使用后台方式运行的,这时候可能需要进入容器,修改一些配置

 

测试:

 

从容器内拷贝文件到主机

 

测试:

 


 

完整代码:

 
 
 
 

image-20210127161444819

可以看到内存占用率很高;这时候赶紧关闭容器,增加内存的限制,再重新启动一个容器

 

image-20210127163308270
可以看到内存占用被限制住,也不再卡了



Docker 图形化界面管理工具,提供一个后台面板供我们操作

(先用这个,不是最佳选项;学习CI/CD时再用 )

 

image-20210127170305353

我们用命令查看一下正在运行的容器,可以看到 portainer 正在运行

 

这时候我们访问外网端口测试一下,这里访问 阿里云服务器公网ip:8088 (注意安全组打开8088端口),就会出现如下界面
image-20210127171459735
然后自己设置一个密码创建用户登录
image-20210127172318284
然后选择 ,再点击
image-20210127172441218
然后就进入了后台管理界面
image-20210127172544042



镜像 是一种轻量级,可执行的软件包,用来打包软件运行环境和基于运行软件开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

所有的应用,直接打包成docker镜像,就可以直接跑起来

如何获取镜像

  • 从远程仓库下载
  • 自己制作一个 Dockerfile

:一种分层、轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不通目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础,镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是 UnionFS 。

主要包含bootloader和kernel,bootloader主要是引导加载kerel,Linux刚启动时会加载 bootfs文件系统,在Docker镜像的最底层时bootfs。这一层与我们典型的Linux/Unix内核是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

在bootfs之上,包含的就是典型的 Linux系统中的 /dev、/proc、/bin、/etc 等标准文件。rootfs 就是各种不同的操作系统发行版。

image-20210127195423589
平时安装的虚拟机的CentOS都是好几个G,为什么Docker中才200MB?
image-20210127195512200
对于一个精简的 OS,rootfs 可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层使用的是主机的Kernel,自己只需要提供rootfs就可以了。由此可见,对于不同linux发行版,bootfs是基本一致的,rootfs会有差别,因此不同的发行版可以公用bootfs


下载示例

当我们下载一个镜像的时候,可以看到,是一层一层的在下载!
image-20210127200105189

为什么Docker镜像要采取这种分层的结构呢?

资源共享:如果有多个镜像从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务,且每一层的镜像都可以被共享。

  • 查看镜像分层方式可以通过命令
     

    其中就表示了每一层
    image-20210127200830957

理解

  • 所有的 Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层
  • 举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果要在该镜像中添加python包,就会在基础镜像层之上创建了新的一个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层

    在这里插入图片描述
    在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。下图中举了一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件
    在这里插入图片描述
    上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
    下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件7 是文件 5 的一个更新版本
    img
    这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
    Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
    Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
    Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。
    下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
    在这里插入图片描述

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层!
image-20210128121203472


当我们通过镜像启动一个容器时,分为了两层:容器层和镜像层;镜像层是可读的,容器层可写,我们的所有操作都是基于容器层,当我们对容器层修改完后,就可以再将修改后的容器层和不变的镜像曾一起打包成一个新的镜像,也就是本节要讲的镜像

 

实战测试:

 


docker的理念:将应用和环境打包成一个镜像!通过镜像启动容器运行

  • 问题:在容器中存储的程序数据是需要持久化的,不能容器删了数据也随之删除。比如,安装一个MySQL容器,在其中存储了大量数据,结果把容器删了数据也没了,就相当于删库跑路,这是不可能发生的

数据卷技术的引入:我们希望Docker容器产生的数据可以自动同步到本地,这样容器删了数据并不会丢失;同时数据也可在容器之间共享。这就是卷技术,也就是目录的挂载,将容器内的目录挂载到linux上

image-20210128132339461

总结:容器的持久化和同步操作!容器间也可以实现数据共享!

 

测试:

 

启动之后可以用查看容器详细信息,可以看到挂载的信息
image-20210128153343080
我们开两个窗口分别进入相对应挂载的目录,在容器内/home目录下新建一个文件,在主机/home/test目录下同步出现该文件

同样,如果我们关闭退出停止容器,在主机内的/home/test路径下新建文件2.txt,在容器内/home下也会同步,我们再次打开容器可以看到2.txt
image-20210128154355183


 

启动之后,我们本机连接一下试试,记得打开阿里云服务器安全组设置的3310端口
image-20210128160840968

点击连接,连接成功,则说明docker部署成功

image-20210128161328388

我们回到xshell,查看主机下的`/home/mysql`目录,可以看到`conf`和`data`两个目录,我们进入`data`目录,可以看到相关文件


如果我们在navicat中新建一个数据库
image-20210128163105401
再回到xhell,查看data目录,可以看到新增了,即进行了同步
image-20210128163132048
如果我们删除容器,数据仍在不会丢失,仍保留在本地
image-20210128163337025


匿名挂载

 

image-20210128164510160

具名挂载(常用)

 

image-20210128165438604

所有docker容器内的卷,没有指定目录情况下都是在下
image-20210128165749033

拓展

 

就是用来构建 docker 镜像的构建文件,就是一段命令脚本,通过这个脚本可以生成一个镜像

通过这个脚本可以生成镜像,镜像是一层一层的,脚本中就是一个个命令,每个命令对应一层

 

完整:

 

然后就可以查到自己构建的镜像
image-20210128212721815
我们来通过自己创建的镜像启动容器,查看其中的内容,可以看到生成镜像时自动挂载的数据卷目录和
image-20210128213104546
这两个数据卷一定与外部有一个同步的目录!且我们设置的是匿名挂载
image-20210128213259334

通过以下命令查看具体的外部挂载路径

 

image-20210128213648116


实现多个容器之间同步数据

image-20210129141417064

启动3个容器,通过我们自己创建的镜像启动

 

image-20210129141750406

 

image-20210129142039449

 

image-20210129142604966
我们可以删除,但数据并不会丢失;只要有一个容器再用,就不会丢失,因为数据卷是采用双向拷贝的技术,即使删除了一个容器,但数据已经拷贝到了其他容器中
image-20210129181811436
总结

  • 容器之间配置信息的传递,数据卷容器的声明周期一直持续到没有容器使用为止
  • 如果数据同步到了本地,本地的数据是不会删除的


是用来构建docker镜像的文件

image-20210129213822710

构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建成一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库)

dockerHub:https://hub.docker.com/

这里以搜索镜像为例
image-20210129190555019
我们点击官方的镜像源,会跳转到一个地址,里面就是
image-20210129190644248

 

可以看到功能很少,官方的镜像都是基础包,我们通常要搭建自己的镜像


基础知识

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行顺序从上往下顺序执行
  3. 代表注释
  4. 每条指令都会创建并提交一个新的镜像层

image-20210129213927281
是面向开发的,逐渐成为企业交付的标准,以后发布项目就是打包成一个镜像,就需要编写dockerfile文件,十分简单!


常见指令

img

 
FROM基础镜像,从此开始构建MAINTAINER镜像作者,通常为姓名+邮箱RUN镜像构建时需要执行的命令ADD在镜像中需要添加的文件(比如基础镜像centos中要添加tomcat)WORKDIR镜像的工作目录VOLUME容器数据卷,挂载主机的目录EXPOSE对外的暴露端口CMD指定容器启动时要运行的命令(只有最后一个生效,可被替代)ENTRYPOINT指定容器启动时要运行的命令(可以追加命令)ONBUILD当构建一个被继承DockerFile时就会运行ONBUILD指令COPY类似ADD,将文件拷贝到镜像中ENV构建时的环境变量

CMD和ENTRYPOINT的区别

测试CMD

 

测试ENTRYPOINT

 

官网centos:Docker Hub 大多数基础镜像都是,然后添加所需的配置进行构建

 

1. 编写dockerfile

基于官网的构建自己的,编写一个

 

2. 通过dockerfile构建镜像

 

然后用命令就可以查看到构建的镜像
image-20210130121332246
同样,我们可以用命令查看镜像的构建过程
image-20210130122445530

3. 通过镜像启动容器

 

对比之前官方的,新增了、等命令
image-20210130122204678


1. 准备镜像文件

准备压缩包,而运行需要依赖于,所以还需要的压缩包

tomcat下载地址:https://tomcat.apache.org/download-90.cgi
image-20210130200039305
jdk下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
image-20210130200003723
然后将两个压缩包通过拷贝到服务器的目录下

可在服务器中查看
image-20210130213046424

2. 编写dockerfile文件

编写文件,官方命名为,这样就不需要通过指定,build时会自动寻找这个文件

 

3. 构建镜像

 

4. 启动容器

 

5. 进入容器

 

6. 访问测试

image-20210130231638644
同样,用可以访问到
image-20210206202624021

7. 发布项目

我们已经做了卷挂载,本机的挂载到容器的目录,因此我们只需要在本机对应目录项发布项目就会自动同步到容器中

我们在目录下新建目录,在其中创建文件
image-20210206203759777

 

然后在目录下创建一个页面
image-20210206211633801

 

然后浏览器输入即可看到页面


首先要有自己的账号

1. 登录 Docker Hub

命令用于登录

 

image-20210206212303332

2. 提交到 Docker Hub

用命令重命名要发布到镜像,名称格式为:

 

然后push即可

 

1. 创建阿里云镜像仓库

首先登录阿里云,找到 容器镜像服务
image-20210216115915960
点击进入,然后 创建一个镜像仓库
image-20210216120928206
仓库类型选择 本地仓库
image-20210216121004148
便成功创建了仓库
image-20210216121301501
我们点击进入刚创建的仓库可以查看相关信息
image-20210216121405524

2. 提交到阿里云镜像仓库

image-20210216184331575
1、登录阿里云Docker Registry

 

image-20210216121850781

  • 登录的用户名为阿里云账号全名,密码为开通服务时设置的密码

2、使用命令重命名要发布的镜像

 

3、push到阿里云镜像仓库

 

image-20210216195800406



当我们用命令查看服务器内部网络地址时,可以发现三个地址:

  • 127.0.0.1 本机回环地址
  • 172.17.223.207 服务器内网IP地址
  • 172.18.0.1 docker0地址

这里的地址就是安装docker时,采用 桥接模式 使用 evth-pair 技术分配的地址
image-20210216201427833

==docker是如何处理容器网络访问的?==比如有一个tomcat容器,一个mysql容器;tomcat中运行着一个web项目,这个项目需要访问mysql。这是如何实现的呢?

我们首先启动一个tomcat容器

 

然后我们查看容器内部网络地址,可以发现 eth0@if89 这个ip地址,这是docker分配的

 

我们ping该容器内地址,发现可以ping通,因为和docker0地址网络前缀相同,是处于统一网段的,所以可以ping通

 

原理

  • 每启动一个docker容器时,docker就会给该容器分配一个ip地址

我们再次在服务器上使用测试,可以发现多了一对网络地址,这就是启动tomcat容器docker为其分配的地址
image-20210216211951796
如果我们再启动一个tomcat容器,可以看到又多了一对网络地址
image-20210216212247591
我们发现每次新增的网络地址都是一对一对的,这就是技术,就是一对虚拟设备接口,成对出现,一段连着协议,一段彼此相连;容器内的88连接了主机的89,容器内的90连接了主机的91;

充当了一个桥梁,实现了主机可以ping通容器内部ip地址,用于连接各种虚拟网络设备

那么 和 这两个容器能否ping通呢?当然是可以的,因为两个容器内的ip地址都桥接了主机相应的ip地址,都与地址处于同一网段,因此可以ping通

 

可用命令查看该网桥中的所有配置

 

结论:容器和容器之间是可以互相ping通的
image-20210216214529859
所有的容器不指定网络的情况下,都是通过 路由的,docker会给容器分配一个默认的可用ip
image-20210216221256027

  • Docker 使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0
  • Docker 中所有的网络接口都是虚拟的,转发效率高,只要容器删除,对应的网桥就删除

如果我们编写了一个微服务,连接数据库的ip地址变化了,此时数据连接就会断开,服务不可用;如果此时能够通过容器名字连接数据库,就可以解决数据库连接的问题;

如果直接通过ping的容器名,会报错

 

那么如何解决这个问题呢?可以在创建容器时用指定连接的容器,此时就可以通过容器名来ping通了

 

但是反过来ping则无法ping通

 

原理:通过 使 在本地hosts中配置了 的ip与容器名的映射
image-20210301165801064


 

网络模式

  • :桥接(默认)
  • :不配置网络
  • :主机模式,和宿主机共享网络
  • :容器网络联通(使用少!)

测试

当我们启动一个容器时,其实有默认参数,这也就是,是默认的方式,上述提到可以用进行互联实现通过容器名访问,但是比较繁琐,不建议使用;

 

建议自定义一个网络,所有的服务都在自定义的网络中进行使用!

 

可查看自定义网络的详细信息
image-20210220223210904
我们指定使用自定义网络来启动两个容器

 

然后再查看的详细信息,可以看到这两个容器以及分配的IP地址
image-20210220232255224
再次测试ping连接,发现自定义的网络解决了的缺点,可以直接通过容器名来访问

 

应用场景

不同的集群(redis,mysql)用不同的网络,使用自己的子网,保证集群的安全及健康


上述我们启动了四个容器,分别是默认网络下的,自定义网络网络下的
image-20210220232637874
我们画个图来理解一下
image-20210220234313302
此时可以实现到的互联吗?答案当然是否定的,因为是处于不同的网段,我们可以进行测试

 

那么怎么实现到的互联呢?可以使用命令
image-20210220233932263
image-20210220234039497

 

然后查看得详细信息,可以发现联通之后就是将的放入网络中,也就实现了一个容器两个ip,类似于阿里云的公网IP和私网IP,都是可以访问

联通后我们再次ping连接测试,成功ping通!

 

image-20210220235432787

 

image-20210221101315967

 

image-20210221105720923

 

此时我们添加一个键值对,可以看到是由也就是主机来处理的服务
image-20210221130039785
也就是的值存在主机中,那对应的从机应该也有的值,也就是说如果服务挂掉,可以从对应的从机中取出的值

 

然后再重新获取的值,可以看到是从中取得值,也就是的从机,实现了高可用,主机挂掉从机自动替代主机
image-20210221130819787
再查看节点的详细信息,可以看到主机挂掉,成为新的主机
image-20210221131022793



首先新建一个项目
image-20210221131449398
image-20210221131529171
然后编写一个,在主程序目录下新建包,其中新建

 

然后启动主程序进行测试,访问,出现如下页面即成功
image-20210221205419343


点击进行打包
image-20210221205542791
打包成功后,可以看到生成的目录中打包生成的文件
image-20210221205649109
我们用命令行测试一下该包能否运行,在其目录下打开cmd,输入以下命令

 

成功启动代表打包成功
image-20210221210015808


在项目根目录下新建

 

image-20210222110618089


将编写好的和打包生成的文件上传到服务器
image-20210222111126479
然后用命令构建镜像

 

然后便可看到刚生成的镜像
image-20210222111610074


 

根据测试结果,成功启动项目,访问的请求返回结果正确


将镜像发布至或者阿里云镜像仓库,然后别人使用直接pull下来即可运行

到此这篇docker 历史版本(dockerversion)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • prp离心管(prp离心管规格尺寸)2025-03-18 08:09:04
  • kubeadm怎么读(kubesphere怎么读)2025-03-18 08:09:04
  • ldr str指令(ldrsw指令)2025-03-18 08:09:04
  • score翻译(tierscore翻译)2025-03-18 08:09:04
  • docker的版本有哪些(docker 版本)2025-03-18 08:09:04
  • chrony对时(chronic time)2025-03-18 08:09:04
  • arsing什么意思(arsine什么意思)2025-03-18 08:09:04
  • redhat操作系统免费吗(redhat需要激活吗)2025-03-18 08:09:04
  • k8s新版本(k8s新版本不能运行 run pip)2025-03-18 08:09:04
  • score选手(score去哪了)2025-03-18 08:09:04
  • 全屏图片