docker--容器间通信 Link(单向通信)、bridge(双向通信)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: docker--容器间通信 Link(单向通信)、bridge(双向通信)

前戏


我们启动一个 nginx 和 mysql 的容器,nginx 经常需要到 mysql 的容器里去读取数据。这两个容器之间的 ip 是可以互通的,我们只需要在 nginx 容器内配置一下 mysql 的地址就可以了。当有一天,我们的 mysql 挂了,重新启动一个 mysql 容器,在去 nginx 容器内部配置一下就可以了。而实际上,nginx 和 mysql 都是集群部署的。当有一个 mysql 挂了之后,我们就需要一个一个进入到 nginx 容器内部进行修改。而 docker 也替我们考虑到了这种情况


Docker 容器间基于 Link 实现单向通信


什么叫单向通信呢?拿上面的例子来说,就是 nginx 可以 ping 通 mysql,而 mysql 不能 ping 通 nginx

启动 mysql 容器

docker run --name mydb -d -e MYSQL_ROOT_PASSWORD=zou123456 mysql:5.7

启动 nginx 应用容器并 link 到 mysql 数据库:

docker run -itd --name mynginx --link mydb nginx

其中的 --link mydb 表示 link 到 mysql 数据库,这样 nginx 就能和 mysql 单向通信了

注意:mydb 这个容器一定要存在!

进入到 nginx 容器内部 ping 一下 mydb (不使用 ip)

如果你是拉取的 nginx 镜像,需要安装一下 ping 的插件,在 nginx 容器内部安装哦。

apt-get update && apt-get install iputils-ping

进入到 mysql 容器里,是 ping 不通 mynginx 镜像的。但是 ip 是可以 ping 通的


Docker 容器间利用 brige 网桥实现双向通信


上面我们使用 link 实现了单向通信,而单向通信往往不能满足我们的全部需求,可以利用 bridge 实现双向通信

使用 docker network ls 查看下有哪些网络模式

这是 docker 默认的三种网络模式。创建一个新的网桥叫 my_bridge

docker network create -d bridge my_bridge

-d bridge my_bridge 表示创建一个 bridge 的网桥叫做 my_bridge

启动两个容器,mysql 和 nginx

docker run -d --name mydb mysql:5.7
docker run -d --name mynginx nginx

把两个容器 mydb 和 mynginx 加入 my_bridge 的网桥

docker network connect my_bridge mydb
docker network connect my_bridge mynginx

进入两个容器分别验证,ping mynginx 和 ping mydb 是可以互相 ping 通的


部署flask应用


现在我们有一个 flask 应用,需要部署到服务器上,flask 代码如下

from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

这个  flask 应用还需要用到 redis,所以我们需要两个容器,一个是 redis 容器,还有一个是 python 容器。

先来拉取 redis 和 python3.7 的镜像

docker pull redis
docker pull python:3.7

启动 redis 容器

docker run -d --name myredis redis

redis 只供自己内部访问,不提供给外部访问,所以不需要 -p 参数暴露出端口

在来创建 python 的 dockerfile,内容如下

FROM python:3.7
LABEL maintaner="zouzou"
COPY app.py /app/
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD ["python","app.py"]

这样我们的 flask 代码和 Dockerfile 都准备好了,构建 python 镜像

docker build -t flask-python:v1 .

启动 python 镜像

docker run -d --name myflask -p 8002:5000 --link myredis -e REDIS_HOST=myredis flask-python:v1

其中的 -e REDIS_HOST=myredis 是设置环境变量,REDIS_HOST 的变量值为 myredis,这样 flask 代码就能根据 myredis 获取到 ip 地址了

浏览器访问 8002 端口,如下


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
18天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
161 77
|
26天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
4天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
41 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
10天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
31 3
实战~如何组织一个多容器项目docker-compose
|
4天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
19 4
|
19天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
63 3
|
26天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
63 3
|
26天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
33 2
|
26天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
44 1
|
26天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
67 7