Linux里面man docker进入容器的命令-image命令作用是什么?

centos6:在redhat/centos环境下安装docker,官方文档要求linux的kernel至少3.8以上,并且docker只能运行在64位的系统中,由于redhat6和centos6的内核版本位2.6,因此必须先升级内核。 一定要记住升级内核,要不然会出现很多莫名其妙的问题,建议用yum安装

docker软件包已经包括在默认的centos-extras软件源里面,因此想要安装docker,只需要执行下面yum命令

安装完成之后启动东侧客人并且设置开机启动 2.查看docker版本

当我们启动容器使用image不在本地主机上时,docker会自动下载他们,这很耗时间,我们可以使用docker pull命令来预先下载我们需要的image,例如我们下载一个centos镜像 这下当我们使用这个容器的时候,他就可以马上启动

4.查找图像 Docker的一个特点就是很多人使用了很多种不同的方式创建了不同的图像,并且上传到docker hub共有仓库里,我们就可以在docker hub的网站上来查找他们,在这里使用docker search命令:举个例子,我们需要mysql,docker search mysql就可以查询所有的mysql图像。

一, docker image是docker的三大组件之一,docker会把下载的图像存储到docker主机上,如果图像不在主机上docker会从镜像仓库下载,默认的是docker hub仓库。

二, 我们也可以创建自己的images

当结束之后,exit退出容器,此时我们已经把这个容器的内容改变了,使用dockercommint命令来提交相应的副本。

-m:来指定提交的说明信息,跟我们使用的版本控制一样, -a:可以指定更新的用户信息; 之后是用来创建镜像容器的id,最后指定目标镜像仓库名和tag信息。

之后可以使用新的镜像来启动容器

三:从本地载入images

要从本地文件导入一个镜像很简单 先把下载好的文件导入到linux 查看目前的images Docker load < 导入文件名称就欧克了

我们可以通过docker push命令把自己新建的镜像上传到仓库来共享,比如,我们在docker hub上完成注册后可以通过推送自己的镜像到仓库中, 科学上网,完成注册

Docker管理额外操作:

希望对您有帮助,接下来是dockerfile构建容器方法和网络配置的内容。

Docker容器镜像介绍及应用

1.1 查看本地容器镜像



考虑到docker容器镜像会占用本地存储空间,建议搭建其它存储系统挂载到本地以便解决占用大量本地存储的问题。









  • Docker 镜像是只读的容器模板,是Docker容器基础
  • 为Docker容器提供了静态文件系统运行环境(rootfs)

2.2.1 联合文件系统定义

  • 联合文件系统是实现联合挂载技术的文件系统
  • 联合挂载技术可以实现在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统包含整合之后的各层文件和目录
  • image:image 是存储镜像相关的元数据,包括镜像的架构,镜像默认配置信息,镜像的容器配置信息等等。它是“逻辑”上的概念,并无物理上的镜像文件与之对应。
  • layer:layer(镜像层) 组成了镜像,单个 layer 可以被多个镜像共享。


可以看到上述下载的镜像分为6层,如何找到这6层存储在Docker Host哪个位置呢?

首先查看nginx镜像



这个目录是查找的入口,非常重要。它存储了镜像管理的元数据。

  • imagedb 记录了镜像架构,操作系统,构建镜像的容器 ID 和配置以及 rootfs 等信息
  • layerdb 记录了每层镜像层的元数据。


这里仅保留我们想要的元数据 rootfs。在 rootfs 中看到 layers 有6层,这6层即对应镜像的6层镜像层。并且,自上而下分别映射到容器的底层到顶层。找到了镜像的6层,接下来的问题是每层的文件内容在哪里呢?





上示例中,镜像元数据和镜像层内容是分开存储的。因此通过 cache-id 我们需要到 /var/lib/docker/overlay2 目录下查看镜像层内容,它就存在 diff 目录下,其中 link 存储的是镜像层对应的短 ID,后面会看到它的用场。


这是因为 docker 引入了内容寻址机制,该机制会根据文件内容来索引镜像和镜像层。docker 利用 rootfs 中的 diff_id 计算出内容寻址的 chainID,通过 chainID 获取 layer 相关信息,最终索引到镜像层文件内容。


根据 “中间层” chainID 查找文件内容:





镜像层文件内容短 ID
“父”镜像层文件内容短 ID

找到最底层文件内容和“中间层”文件内容,再去找最顶层文件内容就变的不难了



可以看到,启动容器会 mount 一个 overlay 的联合文件系统到容器内。这个文件系统由三层组成:

  • lowerdir:只读层,即为镜像的镜像层。
  • upperdir:读写层,该层是容器的读写层,对容器的读写操作将反映在读写层。
  • merge:容器内作为同一视图联合挂载点的目录。

这里需要着重介绍的是容器的 lowerdir 镜像只读层,查看只读层的短 ID:



diff 目录。而 MS2X66BYF6UZ7EKUWMZJKCF4HO映射的是容器的初始化层 init,该层内容是和容器配置相关的文件内容,它是只读的。

启动了容器,docker 将镜像的内容 mount 到容器中。那么,如果在容器内写文件会对镜像有什么影响呢?

不难理解,镜像层是只读的,在容器中写文件其实是将文件写入到 overlay 的可读写层。

这里有几个 case 可以测试:

  • 读写层不存在该文件,只读层存在。
  • 读写层存在该文件,只读层不存在。
  • 读写层和只读层都不存在该文件。

我们简单构建一种读写层和只读层都不存在的场景:


查看读写层是否有该文件:

上节提到容器内写文件会反映在 overlay 的可读写层,那么读写层的文件内容可以做成镜像吗?

可以。docker 通过 commit 和 build 操作实现镜像的构建。commit 将容器提交为一个镜像,build 在一个镜像的基础上构建镜像。

使用 commit 将上节的容器提交为一个镜像:





可以看到镜像层自上而下的前1个镜像层 diff_id 和 centos 镜像层 diff_id 是一样的,说明每层镜像层可以被多个镜像共享。而多出来的一层镜像层内容即是上节我们写入文件的内容:



导出容器镜像,方便分享。



把他人分享的容器镜像导入到本地,这通常是容器镜像分发方式之一。





导入使用docker export导入的容器做为本地容器镜像。




设为「星标」,每天带你玩转 Linux !

这篇文章很全面的罗列出了 Kubernetes 中涉及的网络知识,从 Linux 内核的网络内容,到容器、Kubernetes,一一进行了详细的说明。

文章篇幅有点长,不得不说,网络是很复杂很麻烦的一层,但恰恰这层多年来变化不大。希望翻译的内容对大家能有所帮助,有误的地方,也欢迎大家指正。


TL;DR: 本文将代理了解 Kubernetes 集群内外的数据流转。从最初的 Web 请求开始,一直到托管应用程序的容器。

  • Linux 网络命名空间如果在 pod 中工作
  • Pause 容器创建 Pod 中的网络命名空间
  • Pod 命名空间连接到以太网桥接器
  • 跟踪同一节点上 pod 间的流量
  • 跟踪不同节点上 pod 间的通信
  • 检查 pod 到服务的流量

在深入了解 Kubernetes 中的数据流转之前,让我们先澄清下 Kubernetes 网络的要求。

Kubernetes 网络模型定义了一套基本规则:

  • 集群中的 pod 应该能够与任何其他 pod 自由通信,而无需使用网络地址转换(NAT)。
  • 在不使用 NAT 的情况下,集群节点上运行的任意程序都应该能够与同一节点上的任意 pod 通信
  • 每个 pod 都有自己的 IP 地址(IP-per Pod),其他 pod 都可以使用同一个地址进行访问。

这些要求不会将实现限制在单一方案上。

相反,他们概括了集群网络的特性。

在满足这些限制时,必须解决如下挑战[2]

  1. 如何保证同一 pod 中的容器间的访问就像在同一主机上一样?
  2. Pod 能否访问集群中的其他 pod?
  3. Pod 能否访问服务(service)?以及服务可以负载均衡请求吗?
  4. Pod 可以接收来自集群外的流量吗?

本文将专注于前三点,从 pod 内部网络或者容器间的通信说起。

Linux 网络命名空间如果在 pod 中工作

我们想象下,有一个承载应用程序的主容器和另一个与它一起运行的容器。

在部署时,会出现如下情况:

  1. Pod 在节点上得到自己的网络命名空间
  2. Pod 分配到一个 IP 地址,两个容器间共享端口。
  3. 两个容器共享同一个网络命名空间,在本地互相可见。

网络配置在后台很快完成。

然后,我们退后一步,是这理解为什么上面是容器运行所必须的。

在 Linux 中,网络命名空间是独立的、隔离的逻辑空间。[3]

可以将网络命名空间堪称将物理网络接口分割成更小的独立部分。

每部分都可以单独配置,并使用自己的网络规则和资源。

这些可以包括防火墙规则、接口(虚拟或物理)、路由和其他所有与网络相关的内容。

  1. 物理接口持有根命名空间。

  2. 可以使用 Linux 网络命名空间创建隔离的网络。每个网络都是独立的,除非进行配置否则不会与其他命名空间通信。

物理接口必须处理最后的所有真实数据包,因此所有的虚拟接口都是从中创建的。

例如,下面是 Kubernetes 节点的命名空间:

  1. 为其创建网络命名空间。

如果 pod 像上面的示例一样包含多个容器,则所有容器都被置于同一个命名空间中。

  1. 创建 pod 时,CNI 为容器创建网络命名空间

  2. 最后将容器连接到网络的其余部分

那么当列出节点上的容器时会看到什么?

 命令会列出主机上所有的命名空间。

记住 Linux 中有多种命名空间类型[7]

Pause 容器创建 Pod 中的网络命名空间

从节点上的所有进程中找出 Nginx 容器:

 只显示了每个进程最低的 PID,不过可以根据进程 ID 进一步过滤。

可以通过以下内容检索Nginx 容器的所有命名空间:

 进程再次出现,这次它劫持了网络命名空间。

集群中的每个 pod 都有一个在后台运行的隐藏容器,被称为 pause

列出节点上的所有容器并过滤出 pause 容器:

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。


点击上方图片,『美团|饿了么』外卖红包天天免费领

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

我要回帖

更多关于 docker进入容器的命令 的文章

 

随机推荐