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

如果你是拉取的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端口,如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM