总结自cloudman《每天5分钟玩转Docker容器技术》 公众号搜索cloudman
Docker网络
我们会首先学习Docker提供的几种原生网络,以及如何创建自定义网络;
然后探讨容器之间如何通信,以及容器与外界如何交互。Docker网络从覆盖范围可分为单个host上的容器网络和跨多个host的网络,
Docker安装时会自动在host上创建三个网络,我们可用docker network ls命令查看
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网络
除了none、host、bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络。
Docker提供三种user-defined网络驱动:bridge、overlay和macvlan。
- bridge驱动 用户可以自己创建bridge网络,然后 --network=xx 来指定容器使用哪个网桥。 注意⚠️:处于同一个网桥的容器可以互相通信。 httpd容器想要ping busybox的网络,可以用
docker network connect
在httpd中添加一个my_net2的网卡。
容器之间网络通信
容器之间可通过IP, Docker DNS Server或joined容器三种方式通信。
IP通信 想办法使用同一个网桥。
-
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
- 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处理,访问。
外到内通过端口映射。
Docker存储
容器是分层的。
最大特性就是Copy-on-Write。(最上层容器的数据可写,依赖的镜像层数据只读)
新数据在最上层的容器层
修改数据,会从镜像层->容器层,修改后直接保存在容器层,镜像层不变
多层同名文件,只会看到最上层的那份
Storage driver
Docker支持多个Driver
官方推荐使用Linux发行版默认 storage driver
Storage volume
有的容器需要数据持久化保存下来。而不是容器关闭时销毁。比如数据库。
这也被称为有状态
的容器。
-
Data Volume
Data Volume本质上是Docker Host文件系统中的目录或文件,能够直接被mount到容器的文件系统中。
DV 有目录,而没有磁盘
容器可以读取DV的数据
DV的数据可以持久存储,容器销毁也会存在
volume:bindmount
和docker managed volume
两种存储方案。 -
volume:bindmount
BM是将host上已存在的目录或文件mount到容器
-v :<容器>指定需要mount的路径。
优点:在不特殊指定的情况下,容器内外是互通的。
可以在容器外改配置,容器内依旧会生效。
缺点:移植性差,一定需要
- docker managed volume 稍微简单一些。
只需要-v <容器路径>
docker inspect /volume inspect ls我们可以发现
docker会在 /var/lib/docker/volumes下生成一个目录,将数据挂载
数据共享
-
容器和host数据共享
BM的方式,指定共享目录。
managed volume ,启动的才会生成路径。
-
容器之间的共享数据
BM的方式,同一个宿主机上,指定为同一个host路径,则共享数据。
另一种方式,则是创建一个专门用于做volume的容器。
其他容器指定它为volumes
**data-packed volume container**
其原理是将数据打包到镜像中,然后通过dockermanaged volume共享
把volumes容器,指定好valume的路径,变成镜像之后,每次build就会带着数据一起。就更便捷一些。
Data Volume生命周期管理
如上面所说,只要达成镜像,上传到仓库,定期备份就变得很简单了。
如果出现需要删除绑定的,可以使用docker volume rm 删除孤儿。