Docker 网络和存储管理

Docker 网络

网络是虚拟化技术中最复杂的部分,也是Docker 应用中的一个重要环节。Docker中的网络主要解决容器与容器,容器与外部网络,外部网络与容器之间互相通信的问题。

Docker 通信方式

在默认情况下,Docker 使用网桥(二层设备)+NAT的通信模型。如下图所示:

Docker启动时会默认自动创建网桥设备Docker0 ,实际上是一个Linux的bridge,可以理解为一个软件交换机它会在挂载到它的网口之间进行转发,同时,Docker随机分配一个本地未占用的私有网段中的一个地址给docker0接口,比如典型的172.17.42.1,掩码是255.255.0.0,此后启动的容器内的网口也会自动分配一个同一个网段的地址。

当Docker启动容器时,会创建一对veth虚拟网络设备(当数据包发送到一个接口时,另外一个借口也可以收到相同的数据包),这对接口一端在容器内,即eth0,另一端在本地被挂载到docker0网桥,名称以veth开头。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker就创建了主机和所有容器之间一个虚拟共享网络。

为了解决容器与外部网络之间的通信,Docker引入了NAT.

网络设置

网络设置参数

1
2
3
-b/--bridge: 指定Docker 使用的网桥设备
--bip 指定网桥设备docker0的IP和掩码。
--dns 配置容器的DNS

外部访问容器

容器中可以运行一些网络应用,,要让外部也可以访问这些应用,可以通过-P或者-p参数来指定端口映射。使用-P标记时,Docker会随机映射一个49000-49900的端口到内部容器开放的网络端口。

-p可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器,支持的格式有IP:hostport:containerPort

可以使用docker port 来查看当前映射的端口配置,也可以查看到绑定的地址。

Docker 数据管理

Docker 容器一旦删除,容器本身对应的rootfs文件系统就会被删除,容器中的所有数据也将随之删除。但有时候,想要数据不随容器删除而删除,还有时候,希望同一台Host容器之间可以共享数据。

为此,Docker提供了数据卷,数据卷除了可以持久化数据,还可以用于容器之间共享数据。

数据卷是一个可以供一个或者多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷会默认一直存在,即使容器被删除。

创建并查看一个数据卷

1
2
3
4
$ docker volume create my-vol #创建一个数据卷
$ docker volume ls #查看所有数据卷
$ docker volume inspect my-vol #查看指定数据卷信息
$ docker volume rm my-vol #删除数据卷
启动一个挂载数据卷的容器

在用docker run命令的时候,使用 --mount标记来将数据卷挂载到容器里,在一个docker run中可以挂载多个数据卷。

下面创建一个名为web的容易,并加载一个数据卷到容器的、webapp目录。

1
$ docker run -d -P --name web --mount source=my-vol,target=/webapp