第五篇:Docker 网络——容器之间到底怎么通信?
【摘要】 一个容器的时候,网络问题可能还不明显。但项目一旦变成:WebRedisMySQLNginx网络马上就成了问题。最简单的端口映射运行:docker run -d \ --name web \ -p 8080:80 \ nginx这里:宿主机 8080 ↓容器 80所以访问:服务器IP:8080就可以访问 Nginx。容器端口和宿主机端口不是一回事例如:-p 8080:80并不是...
一个容器的时候,网络问题可能还不明显。
但项目一旦变成:
Web
Redis
MySQL
Nginx
网络马上就成了问题。
最简单的端口映射
运行:
docker run -d \
--name web \
-p 8080:80 \
nginx
这里:
宿主机 8080
↓
容器 80
所以访问:
服务器IP:8080
就可以访问 Nginx。
容器端口和宿主机端口不是一回事
例如:
-p 8080:80
并不是把 Nginx 的端口“修改成 8080”。
而是:
Host:8080
↓
Container:80
容器之间怎么通信?
创建一个 Docker 网络:
docker network create app-net
然后:
docker run -d \
--name web \
--network app-net \
nginx
再创建 Redis:
docker run -d \
--name redis \
--network app-net \
redis
现在两个容器就在同一个 Docker 网络中。
为什么不建议直接写 IP?
因为容器 IP 可能发生变化。
如果 Web 程序配置:
192.168.100.12:6379
Redis 容器重建之后,IP 可能就变了。
Docker 自定义网络可以让容器通过名称进行访问。
例如:
redis:6379
比写死 IP 更合理。
Compose 为什么这么方便?
Compose 中:
services:
web:
image: nginx
redis:
image: redis
两个服务默认就可以处在同一个 Compose 网络里。
因此应用通常可以直接:
redis:6379
访问 Redis。
一个很重要的原则
不是所有容器端口都需要暴露给宿主机。
比如:
用户
↓
Nginx
↓
Web
↓
Redis
通常只有 Nginx 需要暴露公网端口。
Redis 根本没有必要:
-p 6379:6379
直接暴露到公网。
小结
Docker 网络先记住三个东西:
-p
端口发布
network
容器网络
容器名称
服务发现
下一篇正式进入 Dockerfile。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)