2023年最新Docker网络讲解保姆级教程

2023-11-09 15:37:35 浏览数 (1)

第一章、初步理解网络访问路线

这章我们会从部署一个服务到部署多个服务的挨个讲解网络图。

1、部署一个服务

我们现在在docker里面跑一个nginx服务。

代码语言:javascript复制
docker run -d --name nginx-1 -p 8081:80

-p<宿主机端口>:<容器端口>

这命令里面 -p 后面的 8081:80 表示,docker对外开放的8081端口映射到docker容器里面的80端口。

现在的一个网络路线图大致是这样的:

所以如果你外面访问不到nginx,很可能是服务器的防火墙挡住了。

2、部署多个服务

现在我们再跑一个nginx服务

代码语言:javascript复制
docker run -d --name nginx-2 -p 8082:80

于是网络路线图就变成这样了:

3、统一入口

如果按照之前那种方式,一个服务一个端口映射到宿主机上,多少会有点不妥。

我们最常见的就是在这些服务前面加一个网关,这里我们在部署一个nginx-proxy模仿下网关。

创建一个 Nginx 配置文件 **nginx.conf**,将用户的请求路由到不同的容器服务路径。

代码语言:javascript复制
events {}

http {
    server {
        listen 80;

        location /nginx-1/ {
            proxy_pass http://nginx-1;
        }

        location /nginx-2/ {
            proxy_pass http://nginx-2;
        }
    }
}

启动下:

代码语言:javascript复制
docker run -d --name nginx-proxy -p 80:80 -v ./nginx.conf:/etc/nginx/nginx.conf nginx

于是网络路线图就变成这样了:

现在你再访问

现在,你可以通过用户的浏览器或命令行工具来测试访问不同的服务路径。

  • 访问第一个服务路径:**http://your-server-ip/nginx-1/**
  • 访问第二个服务路径:**http://your-server-ip/nginx-2/**

到此,就算入门了。

第二章、深入了解docker网络

当涉及到 Docker 网络的管理和配置以及用户访问 Docker 容器中的特定路径时,有一些关键概念和示例可以帮助你更好地理解和使用 Docker 容器的网络功能。

现在我们将深入探讨 Docker 网络的各个方面,包括网络类型、网络创建、连接容器和网络安全,以及如何让用户通过网络访问 Docker 容器内的不同服务路径。

1:Docker 网络基础

在这一章节中,我们将介绍 Docker 网络的基础知识,包括 Docker 网络模型和默认网络设置。

1.1 Docker 网络模型

Docker 网络模型基于虚拟网络和 IP 地址,使容器之间和容器与主机之间能够通信。我们来看一个简单的示例,演示默认的网络设置。

示例 1.1 - 默认网络设置

当你安装 Docker 时,默认会创建一个名为 bridge 的桥接网络。让我们创建一个名为 my-network 的自定义桥接网络并连接一个容器:

代码语言:javascript复制
# 创建自定义桥接网络
docker network create my-network

# 运行一个容器并将其连接到自定义网络
docker run -d --name my-container --network my-network nginx

# 查看容器的 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container

现在,**my-container** 已连接到 **my-network**,并分配了一个 IP 地址。你可以在 my-network 内的其他容器中使用该 IP 地址进行通信。

2:Docker 网络类型

在这一章节中,我们将详细讨论 Docker 支持的不同网络类型,以及它们的适用场景。

2.1 桥接网络

Docker 默认使用桥接网络,允许容器之间通信。下面的示例演示如何创建一个简单的桥接网络并连接两个容器:

示例 2.1 - 创建桥接网络

代码语言:javascript复制
# 创建一个桥接网络
docker network create my-bridge-network

# 运行两个容器并将它们连接到桥接网络
docker run -d --name container-1 --network my-bridge-network nginx
docker run -d --name container-2 --network my-bridge-network nginx

现在 container-1container-2 可以通过它们的容器名称或 IP 地址相互访问。

2.2 主机网络

主机网络模式允许容器使用主机的网络命名空间,即容器共享主机的网络栈。这对于需要最大性能的应用程序非常有用,但可能导致安全风险。

2.3 覆盖网络

覆盖网络适用于多个 Docker 主机上的容器,允许它们在一个私有网络中相互通信。以下是一个示例,演示如何在 Docker Swarm 中使用覆盖网络:

示例 2.3 - 创建覆盖网络

代码语言:javascript复制
# 初始化 Docker Swarm
docker swarm init

# 创建一个覆盖网络
docker network create -d overlay my-overlay-network

# 在 Swarm 中创建服务,并将其连接到覆盖网络
docker service create --name web-app --network my-overlay-network nginx

现在,**web-app** 服务可以在 Docker Swarm 中的不同节点上运行,并在 my-overlay-network 上相互通信。

2.4 自定义网络

你可以创建自定义网络来满足特定的网络需求,例如在特定网络上运行容器以提高隔离性或性能。这允许你更好地组织容器,并更好地控制网络配置。

3:Docker 网络操作

在这一章节中,我们将讨论如何创建、连接和管理 Docker 网络,以及如何将容器添加到网络中。

3.1 连接容器到网络

使用 docker run 命令时,你可以使用 --network 标志将容器连接到特定网络。以下示例演示如何连接一个容器到一个现有的桥接网络:

示例 3.1 - 连接容器到网络

代码语言:javascript复制
# 创建一个新的桥接网络
docker network create my-new-bridge-network

# 运行一个容器并将其连接到新网络
docker run -d --name my-container --network my-new-bridge-network nginx

my-container 已连接到 **my-new-bridge-network**,并与该网络上的其他容器进行通信。

3.2 查看网络配置

你可以使用 docker network inspect 命令来查看网络的详细信息,包括连接到网络的容器列表、子网和网关等信息。以下示例演示如何查看网络配置:

示例 3.2 - 查看网络配置

代码语言:javascript复制
# 查看网络配置
docker network inspect my-new-bridge-network

这将显示有关网络的详细信息,包括容器的配置。

4:Docker 网络安全

在这一章节中,我们将探讨 Docker 网络的安全性,包括如何限制网络访问和保护容器。

4.1 防火墙规则

使用防火墙规则可以限制容器之间的网络通信。以下示例演示如何使用 Docker 防火墙规则允许或拒绝网络流量:

示例 4.1 - Docker 防火墙规则

代码语言:javascript复制
# 创建允许 ICMP 流量的防火墙规则
docker network create my-firewall-network
docker network ls # 查看网络列表

# 添加防火墙规则,允许 ICMP 流量
docker network update --internal=false --opt com.docker.network.bridge.enable_icc=true --opt com.docker.network.bridge.enable_ip_masquerade=true --opt com.docker.network.bridge.host_binding_ipv4=0.0.0.0 --opt com.docker.network.bridge.name=docker0 my-firewall-network

# 运行一个容器并连接到带有防火墙规则的网络
docker run -d --name my-container --network my-firewall-network nginx

这将允许 my-containermy-firewall-network 上的其他容器上发送 ICMP 流量。

4.2 容器网络加密

在敏感数据传输的情况下,你可以考虑使用容器网络加密来保护数据传输的机密性。以下示例演示如何创建一个使用 TLS 加密的 Docker 网络:

示例 4.2 - 使用 TLS 加密的 Docker 网络

代码语言:javascript复制
# 创建一个具有 TLS 加密的 Docker 网络
docker network create --driver overlay --opt com.docker.network.driver.mtu=1450 --opt com.docker.network.driver.secrets=secret_name my-encrypted-network

# 运行一个服务并将其连接到加密网络
docker service create --network my-encrypted-network --name web-app --secret source=my-secret,target=/secret nginx

通过这个示例,容器之间的通信将通过 TLS 加密来保护数据传输的机密性。

5:实际应用

在这一章节中,我们将探讨 Docker 网络在实际应用中的用途,包括容器编排、微服务架构和多层应用程序。

5.1 Docker Swarm

Docker Swarm 是 Docker 提供的容器编排工具,它充分利用了 Docker 网络功能来协调多个容器之间的通信。

5.2 微服务架构

在微服务架构中,容器的网络设置至关重要,因为多个微服务需要相互通信。Docker 网络可以帮助实现微服务之间的无缝通信。

5.3 多层应用程序

对于多层应用程序,不同层级的容器需要相互通信。Docker 网络可以帮助构建多层应用程序的复杂网络拓扑。

你学废了么?

0 人点赞