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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 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 端口,如下


相关文章
|
7月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
796 6
|
7月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
704 6
|
9月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1238 108
|
10月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
723 57
|
7月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
760 51
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
10月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
591 59
|
9月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
558 16