打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

前戏

我们启动一个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

如果你是拉取的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 mydbdocker network connect my_bridge mynginx

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

部署flask应用

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

from flask import Flaskfrom redis import Redisimport osimport socketapp = 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 redisdocker pull python:3.7

启动redis容器

docker run -d --name myredis redis

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

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

FROM python:3.7LABEL maintaner="zouzou"COPY app.py /app/WORKDIR /appRUN pip install flask redisEXPOSE 5000CMD ["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端口,如下

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一篇文章弄懂Docker镜像的制作、上传、拉取和部署
容器网络(九)跨主机使用 Rex-Ray volume【72】
Docker 部署前后端项目
谁说前端不用懂,手摸手 Docker 从入门到实践
Docker容器学习梳理--应用程序容器环境部署
不外传秘诀|docker 快速搭建常用的服务环境
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服