8. Docker——网络和存储

本章讲解知识点

  • Docker 网络类型
  • Docker 的挂卷

<br>

1. Docker 网络类型

1.1 基本概念

Docker 支持多种不同类型的网络,可以通过在创建容器时指定相应的网络来实现不同的网络连接方式。以下是一些常见的 Docker 网络类型:

  1. None 网络:容器没有网络连接,适用于一些特殊的场景,如容器只需要本地访问或者与其他容器通过共享数据卷进行通信。
  2. Container 网络:与另一个运行中的容器共享 Network Namespace。
  3. Host 网络:使用宿主机的网络栈直接暴露容器的端口,容器和宿主机共享同一个 IP 地址,容器的网络性能会比较好,但会受到宿主机网络性能的限制。
  4. Bridge 网络:这是 Docker 默认使用的网络类型,它会在 Docker 宿主机上创建一个虚拟的网络桥接器,用于连接所有容器。
  5. Macvlan 网络:用于将容器连接到物理网络,每个容器都有一个唯一的 MAC 地址,可以直接通过宿主机网络与物理网络进行通信。
  6. 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 的使用场景相对较少,但在某些特殊的场景下仍然会有用处,例如:

  1. 容器之间共享网络:如果多个容器需要共享相同的网络,可以使用共享 Network Namespace 来实现。例如,可以将一个 Web 服务器容器和一个数据库服务器容器共享 Network Namespace,从而实现容器之间的安全、高效的通信。
  2. 容器之间进行网络调试:当需要进行容器之间的网络调试时,共享 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等一系列知识点的讲解,并且最后总

全部评论
多多点赞,会变好看,多多留言,会变有钱
2 回复 分享
发布于 2023-05-07 07:29 广东
追更
点赞 回复 分享
发布于 2023-05-07 08:18 广东
坐等
点赞 回复 分享
发布于 2023-05-07 08:26 北京
狠狠码住
点赞 回复 分享
发布于 2023-05-08 12:48 广东
kubernetes中pause容器共享网络命名空间就是利用的Container 网络
点赞 回复 分享
发布于 2023-05-08 13:06 广东
🐴🉑
点赞 回复 分享
发布于 2023-05-08 22:38 广东
期待更新
点赞 回复 分享
发布于 2023-05-09 13:16 山东
步骤很详细,好评
点赞 回复 分享
发布于 2023-05-09 13:16 广东

相关推荐

MScoding:你这个实习有一个是当辅导老师,这个和找技术岗没有关系吧?
点赞 评论 收藏
分享
逆流河上万仙退:如果是能有面试的话应该简历没啥问题 争取表现好一点然后到岗时间实习天数往长了说 先看看能不能有offer
点赞 评论 收藏
分享
评论
9
7
分享

创作者周榜

更多
牛客网
牛客企业服务