Docker 的网络和存储功能是其重要的组成部分,它们分别处理容器之间的通信和数据持久化。下面我们逐一介绍 Docker 的网络和存储。

Docker 网络

Docker 提供了一套灵活且强大的网络选项,用于处理容器间、容器与主机及容器与外部网络的连接需求。

网络类型

  1. **Bridge 网络(桥接网络)**:

    • 默认情况下,Docker 容器会被连接到 bridge 网络。这种类型的网络通过 NAT(网络地址转换)将容器连接到宿主机上的一个网桥上,每个容器都有自己独立的 IP 地址。
    • 容器可以通过其名称来互相访问,但是不同桥接网络中的容器无法直接互访。
  2. Host 网络

    • 使用 Host 网络模式,容器将不会有自己的网络命名空间,容器的网络栈和主机共享。即容器与主机共用一个 IP 地址。
    • 适用于需要高性能网络通信的应用,因为它消除了容器与主机之间的网络翻译开销。
  3. None 网络

    • 使用 None 网络,容器有自己的网络命名空间,但没有分配的网络接口。主要用于完全自定义网络设置的场景。
  4. Overlay 网络

    • Bridge 网络通常局限于单个宿主机,而 Overlay 网络用于跨多宿主机的容器通信。主要用于 Swarm 或 Kubernetes 中,以实现跨节点容器通信。
  5. Macvlan 网络

    • Macvlan 通过为每个容器分配一个唯一的 MAC 地址,使其看起来像一个物理设备。这适用于一些对网络性能要求极高的场景。

创建和管理网络

  1. 创建自定义网络:
docker network create my_bridge_network
  1. 将容器连接到自定义网络:
docker run -it --network my_bridge_network --name my_container ubuntu:20.04 /bin/bash
  1. 查看所有网络:
docker network ls
  1. 查看网络详情:
docker network inspect my_bridge_network
  1. 删除网络:
docker network rm my_bridge_network

Docker 存储

Docker 提供了多种方式来持久化数据,以保证容器重启或删除后数据不会丢失。

存储类型

  1. **Volumes(数据卷)**:

    • 数据卷是由 Docker 管理的一种最佳方式,可以在多个容器之间共享和重用。数据卷的生命周期独立于任何一个容器,且存储位置由 Docker 自动管理。
    • 数据卷可以通过 docker volume 命令进行创建、删除和管理。
  2. **Bind mounts(绑定挂载)**:

    • 绑定挂载将主机文件系统的特定目录挂载到容器内。绑定挂载的存储位置是由用户提供的,适合需要在宿主机和容器之间共享文件的场景。
    • 主机文件系统的改动会立即反映到容器内,反之亦然。
  3. tmpfs mounts

    • tmpfs 挂载存储在主机系统的内存中,而不是磁盘上。主要用于需要高性能和不需要持久化的临时数据。

创建和使用存储

  1. 创建数据卷:
docker volume create my_data_volume
  1. 查看所有数据卷:
docker volume ls
  1. 将数据卷挂载到容器:
docker run -it -v my_data_volume:/data --name my_container ubuntu:20.04 /bin/bash
  1. 绑定挂载主机目录:
docker run -it -v /path/on/host:/path/in/container --name my_container ubuntu:20.04 /bin/bash
  1. 删除数据卷:
docker volume rm my_data_volume

存储示例

假设有一个需要持久化数据的 MySQL 容器:

  1. 创建数据卷:
docker volume create mysql_data
  1. 运行 MySQL 容器并挂载数据卷:
docker run -d \
  --name my_mysql \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -v mysql_data:/var/lib/mysql \
  mysql:5.7

以上命令启动了一个 MySQL 容器,并将数据库文件存储在 mysql_data 卷中,无论容器是否删除,卷中的数据都不会丢失。

总结

Docker 的网络和存储功能为容器化应用提供了强大的支持。网络方面,Docker 提供了多种网络类型来满足不同场景下的通信需求;存储方面,Docker 提供了数据卷和绑定挂载等多种方式来持久化数据,实现数据共享。

通过合理配置 Docker 的网络和存储,可以显著提高应用的灵活性和可扩展性,更加高效地管理容器化应用。希望本文能帮助你更好地理解和使用 Docker 的网络和存储功能。