Linux里面man docker运行容器命令-image命令作用是什么?

设为「星标」,每天带你玩转 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的基本使用,文本介绍docker命令的基础使用,docker镜像库,网络,存储的一些知识

connect 把一个容器连接到网络 inspect 在一个或多个网络上显示详细信息 prune 移除所有未使用的网络 rm 移除一个或多个网络

host网络模式,其实就是借用的docker host上的网卡信息

    • docker host的主机上使用的端口,容器不能继续使用

brctl show 将会显示docker0上的网络设备,如果有容器运行的是bridge的网络模式,就会把虚拟网卡挂在docker0上,这里应该注意的是:容器内的虚拟网卡与docker0上挂的虚拟网卡是成对存在的pair

5.4.2查看容器的网络地址

5.5 docker网络模式之用户自定义网络

docker提供三种自定义的网络驱动

5.6、docker容器之间的互联互通

5.6.1 基于IP方式的互联互通

注意:docker dns只能使用在用户自定的网络模式下运行的容器

仔细观察此种模式下的网络配置信息完全一样,是通过127.0.0.1进行通信

5.7 docker容器与外部是如何进行互相访问的

docker默认的网络是bridge网络,因此只要docker host可以连接互联网,那么容器就是可以联网的,但是容器访问外部网络的过程是如何实现的呢? 容器在向外部发送请求时,docker在NAT上将容器的源地址改为了docker host的地址,因此访问外部的源地址就变成了docker host的地址

容器为了响应外部的访问请求,把容器自己的内部端口暴露给docker host,于是和docker host进行了 端口之间的映射,外部进行访问容器就会变成访问docker host上的一个端口,当docker-proxy进行发现有访问docker host上的容器映射的端口时,就会自动转发给容器,这就是外部访问容器的一个过程;

容器的状态能判断出该容器是否需要持久性存储数据,比如busybox这类的容器,我们只是通过其容器内集成好的一些命令供我们测试某种特定的功能,类似于wget,ping等,这个是不需要持久性存储的,但是对于grafana这类容器来说,这是需要再启动时就要加载数据的,因此需要持久性存储

  • Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
  • 容器可以读写 volume 中的数据。
  • volume数据可以被永久的保存,即使使用它的容器已经销毁

# 类似于selinux这类标签系统,可以在volume挂载时使用z或Z指定该volume是否可以共享,默认为z即为共享,对于这种权限,容器内是无法修改的,只有在docker host上才可以修改权限

格式2:-v/index.html:/new_index.html # 注意bind mount还可以指定单一的文件,但是注意,对于单一文件来说,其实相当于对容器内部添加新文件,注意其使用格式,这样也可以保留原有容器中的数据文件

# new_index.html在原容器中是没有的,因此此种格式不会类似于目录挂载完全覆盖数据,只是在原有数据的基础上添加一个新文件new_index.html

此类型挂载数据是比较方便备份和迁移数据,但是对于容器的迁移是比较麻烦的

原有数据复制到volume

强,不需指定host目录

6.5 数据卷的生命周期管理

docker registry挂载的卷是本地的文件系统,因此针对文件系统备份就可以

使用备份的文件拷贝到docker registry挂载的本地文件系统中就可以

  • 启用新的registry并mount原始的挂载文件系统

查看正在运行的容器的日志存储驱动

设置docker的日志存储驱动类型

对单一容器设置存储类型

注意: 只会对新创建的容器生效,已经存在的容器不会使用配置的日志驱动

docker logs会显示一些有用的信息到stdin,stdout,stderr,但是对于以下一些情况不会输出信息到这些地方

  • 非交互式的web服务器或者数据库容器

docker以前学习过,不过如果不经常打docker命令的话容易忘记,故总结了此篇文章作为备忘,同时先手看完这篇文章也会大概了解docker是什么以及docker的作用。

docker是一个软件运行的容器,就像docker logo一样,一条鲸鱼上背着一个个互相隔离的集装箱,docker就是这条鲸鱼,软件就是一个个的集装箱,你可以在docker这条鲸鱼上面随意组装你的集装箱。

docker在java开发中最主要的作用 ,就是组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。同时,docker上安装redis,mysql,tomcat等环境十分方便。也支持将你安装好的环境打包成镜像,发布到其他机器上去运行,就不需要没一台机器上都做重复繁琐的安装步骤了,这跟Jvm、Java的“一次编写、到处运行”的理念一致。

以下将docker和java的概念进行类比。
docker主机(Host):就是docker软件,安装在linux、win等操作系统之上。类似jvm,只要安装了jvm,jar包就可以在jvm上运行,而无需关心底层操作系统是linux还是windows。
docker镜像(Images):docker镜像是用于创建docker容器的模板。类似你编写的java代码,只要有这份代码在,你就可以打包无数个jar包。
docker容器(Container):容器是独立运行的一个或一组应用。类似jar包,jar包由java编码编译而来,docker容器也是由docker镜像来创建。docker容器中运行着一个或一组应用,如我们java web应用运行了tomcat、mysql、rabbitmq,其都可以放置在一个容器中运行。


image镜像相关命令

启动容器docker run --name 容器名 -d tomcat,从tomcat镜像启动一个容器,--name为容器命名,-d 后台运行,不过,这种启动方式没有暴露端口,外部无法访问tomcat的端口。一般使用这个命令启动,多加几个参数:docker run --name 容器名

  • 额外补充 查看容器运行状态 进入容器内进行命令行操作 在容器mynginx中开启一个交互模式的终端 容器生命周期管...

  • 2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker ...

  • 现在经济不景气,处于下行趋势,不少人选择创业。创业本身就是一场冒险,在经济下滑周期风险系数陡增。社会上不断成功的创...

  • 这一次的暑期兼职,让我确切的感受到了我所拥有的是多么幸福。以往的我所认为的独立,其实都是建立在家人、学校所带...

  • 今早上爸妈为了钱的问题大吵一架,还动起了手。 记得小时候,家里总是吵架,很怕呆在家里。所以长大后,很不愿意和父母呆...

  • 一起白头 文/梅园飘香 你说,我们要一生一世 我说,我们要一起白头 那一日,雪花纷飞 你牵着我的手,漫步雪中 雪花...

  • 1.认为男生压力大于女生,有一个必须的前提是一个有责任感的男生 虽说男女生考虑的事情不一样,但都承受着工作和生活上...

我要回帖

更多关于 docker运行容器命令 的文章

 

随机推荐