Docker(二):

总结自cloudman《每天5分钟玩转Docker容器技术》 公众号搜索cloudman

Docker网络

我们会首先学习Docker提供的几种原生网络,以及如何创建自定义网络;

然后探讨容器之间如何通信,以及容器与外界如何交互。Docker网络从覆盖范围可分为单个host上的容器网络和跨多个host的网络,

Docker安装时会自动在host上创建三个网络,我们可用docker network ls命令查看

image.png

none网络

没有网络的网络。

用于不需要网络的安全环境。

host网络

Docker run -it --network=host busybox

连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。

在容器中可以看到host的所有网卡,并且连hostname也是host的。

直接使用Docker host的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择host网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。

bridge网络

常用。

brctl show

Docker安装时会创建一个命名为docker0的Linux bridge。

运行容器默认网络会挂载在docker0上,可以看作有一张网卡,一头在容器内部,一头在docker0

可以看作容器的网关。

user-defined网络

image.png

除了none、host、bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络。

Docker提供三种user-defined网络驱动:bridge、overlay和macvlan。

  1. bridge驱动 用户可以自己创建bridge网络,然后 --network=xx 来指定容器使用哪个网桥。 注意⚠️:处于同一个网桥的容器可以互相通信。 httpd容器想要ping busybox的网络,可以用docker network connect在httpd中添加一个my_net2的网卡。

容器之间网络通信

容器之间可通过IP, Docker DNS Server或joined容器三种方式通信。

  1. IP通信 想办法使用同一个网桥。

  2. Docker DNS Server

    从Docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server。

    #定义容器名 使用容器名通信 但是只能在user-defined网络使用
    docker run -it --network=my_net2 --name=bbox1 busybox
    docker run -it --network=my_net2 --name=bbox2 busybox
    
    #容器内部 可以ping通
    ping -c 3 bbox1
  1. joined容器
   #指定name
   docker run -it --name=web1 busybox
   
   #加入name=web1容器的网络
   docker run -it --network=container:web1 --name=web2 busybox
joined容器非常适合以下场景:

(1)不同容器中的程序希望通过loopback高效快速地通信,比如Web Server与App Server。

(2)希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

容器内外的网络访问

内到外走网桥DockerHost的NAT处理,访问。

image.png

外到内通过端口映射。

image.png

Docker存储

容器是分层的。

最大特性就是Copy-on-Write。(最上层容器的数据可写,依赖的镜像层数据只读)

  1. 新数据在最上层的容器层

  2. 修改数据,会从镜像层->容器层,修改后直接保存在容器层,镜像层不变

  3. 多层同名文件,只会看到最上层的那份

Storage driver

Docker支持多个Driver

官方推荐使用Linux发行版默认 storage driver

Storage volume

有的容器需要数据持久化保存下来。而不是容器关闭时销毁。比如数据库。

这也被称为有状态的容器。

  1. Data Volume

    Data Volume本质上是Docker Host文件系统中的目录或文件,能够直接被mount到容器的文件系统中。

    1. DV 有目录,而没有磁盘

    2. 容器可以读取DV的数据

    3. DV的数据可以持久存储,容器销毁也会存在

    volume:bindmountdocker managed volume两种存储方案。

  2. volume:bindmount

    BM是将host上已存在的目录或文件mount到容器

image.png
-v :<容器>指定需要mount的路径。

优点:在不特殊指定的情况下,容器内外是互通的。

可以在容器外改配置,容器内依旧会生效。

缺点:移植性差,一定需要
  1. docker managed volume 稍微简单一些。
image.png
只需要-v <容器路径>

docker inspect /volume inspect ls我们可以发现

docker会在 /var/lib/docker/volumes下生成一个目录,将数据挂载

数据共享

  1. 容器和host数据共享

    BM的方式,指定共享目录。

    managed volume ,启动的才会生成路径。

  2. 容器之间的共享数据

    BM的方式,同一个宿主机上,指定为同一个host路径,则共享数据。

    另一种方式,则是创建一个专门用于做volume的容器。

    其他容器指定它为volumes

image.png
**data-packed volume container**

其原理是将数据打包到镜像中,然后通过dockermanaged volume共享
image.png
把volumes容器,指定好valume的路径,变成镜像之后,每次build就会带着数据一起。就更便捷一些。

Data Volume生命周期管理

如上面所说,只要达成镜像,上传到仓库,定期备份就变得很简单了。

如果出现需要删除绑定的,可以使用docker volume rm 删除孤儿。

你可能感兴趣的:(Docker(二):)