第五章 Docker 网络
Docker 安装时会创建三个网络:bridge\host\none
5.1 none网络
- 什么都没有的网络,挂在这个网络下的容器除了lo,没有任何网卡
- 用途:生成随机密码
5.2 host网络
- 连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样
- 使用 –network=host 指定使用host网络
host网络应用场景
- host主机也是连接在host网络,可以得到良好的性能,牺牲灵活性,比如端口冲突(Docker host上已经使用的端口就不能使用了)
- 让容器可以直接配置host网络,比如某些跨host的网络解决方法,如管理iptables
5.3 bridge网络
- Docker安装时会创建一个名为docker0的Linux bridge
- 不指定–network默认挂在docker0上
- 绑定好后是一对veth pair
- 容器创建时,docker会自动从172.17.0.0/16中分配一个IP
5.4 user-defined网络
除了none\host\bridge0三个自动创建的网络,用户也可以根据业务需要创建user-defined
网络
Docker提供三种user-defined网络驱动
bridge、overlay、macvlan
bridge
- 类似bridge0网络
docker network create --driver bridge my-net
- 指定网段:
--subnet
和--gateway
- 指定静态IP:
--ip
(只有使用了–subnet创建的网络才能指定静态IP) - 同一网络中的容器、网关都是可以通信的
- 要使创建的bridge与bridge0通信,可以加路由器
5.5 容器间通信
容器间可以通过IP、Docker DNS Server、joined 容器 三种方式通信
1、IP通信
- 两个容器要能通信,必须要有属于同一网络的网卡
- 在创建时
--network
指定相应的网络
2、Docker DNS Server
- docker daemon实现了一个内嵌的DNS server,使容器可以通过”容器名”通信。在启动时用
--name
指定即可 - 只能在
user-defined
网络中使用docker DNS。默认的bridge网络无法使用DNS
3、joined容器
- join可以使两个容器共享一个网络栈,共享网卡和配置信息
- joined容器之间可以通过127.0.0.1直接通信
- 适用以下场景:
- 不同容器中的程序希望通过loopback高效地通信,比如Web Server与App Server
- 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序
5.6 将容器与外部世界连接
容器访问外部世界
- 容器可以访问外部网络,实际是因为:网桥docker0收到容器的外出包,把它将包的源地址替换成host的地址发送出去,即做了一次网络地址转换(NAT)
外部世界访问容器
- 端口映射
-p
! - 可将容器对外提供服务的端口映射到host的某个端口,外网通该端口访问容器
docker run -d -p 80 httpd
httpd容器的80端口被映射到host 32773上,可以通过<host ip>:<32773>
访问容器的Web服务docker run -d -p 80:32773
将80端口映射到host的32773端口
- docker-proxy监听host的32773端口
- 当curl访问0.0.0.0:32773时,docker-proxy转发给容器 0.0.0.0:80
- httpd容器相应请求并返回结果
第六章 Docker 存储
Docker为容器提供两种村存放数据的资源
- 由storage driver 管理的镜像层和容器层
- Data Volume
6.1 storage driver
- 对于某些容器可以直接将数据放在由storage driver维护的层中,如无状态的应用
6.2 Data Volume
Data Volume本质是Docker Host文件系统中的目录或文件,能够直接被moune到容器的文件系统中。Data Volume具有以下特点:
- Data Volume是目录或文件,而非没有格式化的磁盘(块设备)
- 容器可以读写volume中的数据
- volume数据可以被永久地保存,即使使用它的容器已经销毁
如何设置volume的容量?
volume实际是docker host文件系统的一部分,目前没有方法设置volume的容量
Docker提供两种类型的volume:bind mount 和 docker managed
bind mount
- bind mount 是将host上已存在的目录或文件mount到容器
docker run -v <host path>:<container path> name
- bind mount 时还可以指定数据的读写权限,默认可读可写
- bind mount 缺点:限制了容器的可移植性,只能在当前host下
docker managed volume
- 不需要指定mount源,只需指明mount point即可
- docker managed volume创建过程
- 容器启动时,告诉docker需要一个volume存放数据,mount到容器的目录/abc下
- docker在
/var/lib/docker/volumes
中生成一个随机目录作为mount源 - 如果/abc已经在容器中存在,则将数据复制到moumt源
- 将volume mount到 /abc
bing mount 与 docker managed volume的不同点
- bind mount支持单个文件,volume只支持目录
- bind mount支持权限修改,volume不支持
- bind mount移植性弱,volume移植性强,无须指定host目录
6.3 数据共享
容器与host共享数据
- bind mount 直接将要共享的目录mount到容器
docker cp
实现容器和host之间数据的复制
容器之间共享数据
将共享数据放在bind mount中,然后mount到多个容器
6.4 volume container
- 首先创建一个 volume container,它不需要处于运行状态,容器mount了两个volumes
- 其他容器可以通过
--volumes-from
使用vc_data 这个volume container
docker run --name web1 -d -p 80 --volume-from vc_data httpd
- volume container 特点:
- 与bind mount比,不必为每一个容器指定host path,所有path都在volume container 中定义好,容器只需与volume container关联,实现了容器与host的解耦
- 使用volume container的容器,其mount point是一致的,有利于配置的规范和标准
6.5 data-packed volume container
- 可以将数据打包到镜像中,然后通过 docker managed volume共享
- 通过Dockerfile构建镜像
- FROM busybox:latest
- ADD htdocs /usr/local/apach2/htdocs
- VOLUME /usr/local/apache2/htdocs
- docker build 新镜像,然后创建container
6.6 Data Volume生命周期管理
- docker 不会销毁bind mount,只能由host删除
- docker rm -v 参数,会将容器使用到的volume一并删除,前提是没有其他容器mount该volume
6.7 小结
- docker为容器提供了两种存储资源:数据层和 Data Volume
- 数据层包括镜像层和容器层,由storage driver管理
- Data Volume有两种类型:bind mount和docker managed volume
- bind mount 可以实现容器与host之间,容器与容器之间共享数据
- volume container 是一种具有更好移植性的容器间数据共享方案