一文带你读懂Docker容器 2

电子说

1.3w人已加入

描述

四、Docker网络

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段中的一个地址给 docker0 接口。它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。这里,我们可以在主机上执行ip addr查看主机ip配置:

开源软件

image-20220617211231789

进入某一容器,容器内部查看发现容器IP:发现其也属于172.17网段,因此验证上述的文档解释。

开源软件

image-20220617212110416

开源软件

dockerhost

除bridge方式,Docker还支持host、container、none三种网络通信方式,使用其它通信方式,只要在Docker启动时,指定–net参数即可。

  • host方式可以让容器无需创建自己的网络协议栈,而直接访问宿主机的网络接口,在容器中执行ip addr会发现与宿主机的网络配置是一样的,host方式让容器直接使用宿主机的网络接口,传输数据的效率会更加高效,避免bridge方式带来的额外开销,但是这种方式也可以让容器访问宿主机的隐私服务,可能会带来意想不到的安全问题,因此应谨慎使用host方式;
  • container方式可以让容器共享一个已经存在容易的网络配置;
  • none方式不会对容器的网络做任务配置,需要用户自己去定制。

外部访问容器

容器允许外部访问,可以在 docker run 时候通过 -p-P 参数来启用。不管用那种办法,其实也是在本地的 iptable 的 nat 表中添加相应的规则。

docker run IMAGE_ID -p 8080:8081 #将container的8081端口开放给宿主机的8080端口,通过访问主机的8080端口就可访问到container的8081端口

容器访问外部

容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 iptables 的源地址伪装操作实现的。

从下图可以看到,对172.18.0.0/16局域网下所有设备需要访问外部网络的时候,会经过NAT地址转换

开源软件

image-20220617213113673

五、Docker镜像构建

1. Commit命令

docker commit支持扩展现有镜像,创建新的镜像,通常来说,commit命令就是提交容器副本使之成为一个新的镜像

docker commit -m="提交的描述信息"  -a="作者" 容器ID 要创建的目标镜像名:[标签名]

2. Dockerfile构建

Dockerfile也是生成Docker镜像的一种重要手段,也是常用的手段。它是一个文本文件,其中包含我们需要运行以构建 Docker 映像的所有命令。

Docker commit是通过增强原有镜像基础上,重新安装新功能。

Dockerfile, 本镜像需要一次性添加所有所需的依赖镜像

  1. 编写Dockerfile文件
  2. 执行Docker build构建镜像
  3. docker run启动镜像

构建流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

生动概括:dockerfile(中药单子)–> images(中药) —> docker container(药汤)

六、Docker数据管理

Docker分层,联合文件系统。Docker由于是基于Linux上运行的,因此 底层直接使用Host的kernel ,自己需要提供rootfs就可以了。不同的发行版本由于bootfs基本上是一致的,但是rootfs会有差别,因此不同的发行版可以公用bootfs

1. 文件卷的作用

将Docker容器中的数据保存进宿主机中磁盘系统。也就是对数据的要求是持久化的。如果容器实例删除之后,容器内的数据自然就没有了。

因此Docker容器内部的数据可以备份+持久化到本地主机目录

docker run -it --privileged=true  -v 宿主机目录:Docker目录 镜像名
  1. 数据卷可以在容器之间或者宿主机与容器之间共享数据
  2. 可以对容器里面的数据进行持久化或者备份
  3. 更好的管理文件
docker inspect 容器名 #查看容器详情

可以看到Docker Mounts下会计到自己挂载的路径规则

开源软件

image-20220615200042582

2. 容器卷的继承

docker run -it --privileged=true  --volumes-from 容器父类名 --name  容器名

子容器集成父容器的挂载规则,如果父容器被kill或者stop,不会影响子容器的规则。

心中无女人,编码自然神,忘掉心上人,抬手灭红尘

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分