8. Docker——网络和存储
本章讲解知识点
- Docker 网络类型
- Docker 的挂卷
<br>
1. Docker 网络类型
1.1 基本概念
Docker 支持多种不同类型的网络,可以通过在创建容器时指定相应的网络来实现不同的网络连接方式。以下是一些常见的 Docker 网络类型:
- None 网络:容器没有网络连接,适用于一些特殊的场景,如容器只需要本地访问或者与其他容器通过共享数据卷进行通信。
- Container 网络:与另一个运行中的容器共享 Network Namespace。
- Host 网络:使用宿主机的网络栈直接暴露容器的端口,容器和宿主机共享同一个 IP 地址,容器的网络性能会比较好,但会受到宿主机网络性能的限制。
- Bridge 网络:这是 Docker 默认使用的网络类型,它会在 Docker 宿主机上创建一个虚拟的网络桥接器,用于连接所有容器。
- Macvlan 网络:用于将容器连接到物理网络,每个容器都有一个唯一的 MAC 地址,可以直接通过宿主机网络与物理网络进行通信。
- Overlay Network 基于 VXLAN 技术实现,它将不同主机上的容器连接到一个虚拟网络中,使得这些容器可以相互通信和协同工作。
None |
不为容器配置任何网络功能,没有网络 --net=none |
Container |
与另一个运行中的容器共享 Network Namespace,--net=container:containerID |
Host |
与主机共享 Network Namespace,--net=host |
Bridge |
Docker 设计的 NAT 网络模型(默认类型) |
Macvlan |
每个容器都有一个唯一的 MAC 地址,以此进行物理网络通信 |
Overlay Network |
将不同主机上的容器连接到一个虚拟网络中 |
1.2 None 网络
None 网络是 Docker 网络类型中的一种,顾名思义,表示容器没有网络连接。当我们在创建容器时使用 --net=none
参数时, Docker 会禁止容器的网络连接,容器将无法通过网络访问外部服务,也无法从外部网络中访问。这种网络类型适用于一些特殊场景,如需要运行一些网络隔离的容器,或者容器只需要本地访问或者与其他容器通过共享数据卷进行通信,而不需要进行网络通信。
需要注意的是,使用 None 网络时,容器将无法使用 ping 等网络命令进行网络测试,也无法使用 apt-get 等命令从网络上下载文件。因此,在使用 None 网络时,需要提前将所需的文件和依赖项复制到容器中,或者通过其他方式进行传输。
简单示例:
创建一个没有网络连接的容器
docker run -it --net=none ubuntu:latest /bin/bash
这个命令将会在本地运行一个 Ubuntu 容器,但是这个容器没有网络连接。
在容器中进行本地访问和共享数据:在容器中,你可以进行一些本地访问和共享数据的操作,例如:
# 在容器中创建一个文件 echo "Hello, World!" > hello.txt # 将文件复制到宿主机中 docker cp <容器ID>:/hello.txt /path/on/host
在这个例子中,我们创建了一个文件,然后通过 docker cp
命令将其复制到宿主机中。
1.3 Container 网络
在 Docker 中,容器是通过网络隔离来保证安全性和隔离性的,每个容器都有自己独立的 Network Namespace。如果需要让两个容器之间共享 Network Namespace,可以使用 --net=container
参数。
使用 --net=container
参数时,新创建的容器将使用指定容器的 Network Namespace,从而与该容器共享网络。具体来说,可以按照以下步骤实现:
启动需要共享 Network Namespace 的容器:首先,需要启动一个已经运行的容器,例如:
docker run -d --name=container1 nginx
启动新容器并共享 Network Namespace:然后,需要启动一个新的容器,并使用 --net=container
参数来共享容器 container1 的 Network Namespace,例如:
docker run -it --net=container:container1 ubuntu:latest /bin/bash
这个命令将会在一个新的 Ubuntu 容器中打开一个交互式 Shell,该容器将会共享容器 container1 的 Network Namespace,从而与 container1 共享网络。
需要注意的是,使用 --net=container
参数来共享 Network Namespace 时,容器将不会获得一个独立的 IP 地址,而是与指定容器共享同一个 IP 地址和端口。因此,需要特别小心,避免出现网络冲突和安全问题。
共享 Network Namespace 的使用场景相对较少,但在某些特殊的场景下仍然会有用处,例如:
- 容器之间共享网络:如果多个容器需要共享相同的网络,可以使用共享 Network Namespace 来实现。例如,可以将一个 Web 服务器容器和一个数据库服务器容器共享 Network Namespace,从而实现容器之间的安全、高效的通信。
- 容器之间进行网络调试:当需要进行容器之间的网络调试时,共享 Network Namespace 可以让我们更方便地进行调试,尤其是在需要捕获网络流量或监控网络连接时。
容器之间共享 Network Namespace 的场景在 Kubernetes 中专门有一个场景会用到,那就是 Pod 中的容器都是共享的 Pause 容器的 Network Namespace。以后我们会详细讲解。
1.3 Host 网络
Host 网络模式可以让 Docker 容器使用宿主机器的网络栈和 IP 地址,从而使得容器可以直接访问宿主机器的网络资源,同时也减少了网络层的额外开销,提高了网络性能。
在 Host 网络模式下,Docker 容器不再拥有独立的网络命名空间(Network Namespace),而是与宿主机器共享同一个网络命名空间。这意味着容器中的网络接口将直接映射到宿主机器上,从而使得容器可以直接访问宿主机器上的网络接口和端口,就像是直接运行在宿主机器上的进程一样。
下面是一个使用 Host 网络模式的 Docker 容器示例:
假设我们有一个 Web 应用程序需要监听 80 端口并访问 My
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊适合于立志转行云计算的小白,有一定的编程、操作系统、计算机网络、数据结构、算法基础。 本专刊同时也适合于面向云计算(Docker + Kubernetes)求职的从业者。 本专刊囊括了云计算、VMWare、Docker、Kubernetes、Containerd等一系列知识点的讲解,并且最后总