第一章、初步理解网络访问路线
这章我们会从部署一个服务到部署多个服务的挨个讲解网络图。
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
**,将用户的请求路由到不同的容器服务路径。
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
的自定义桥接网络并连接一个容器:
# 创建自定义桥接网络
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-1
和 container-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-container
在 my-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 网络可以帮助构建多层应用程序的复杂网络拓扑。
你学废了么?