8天入門docker系列 —— 第七天 讓你的container實現跨主機訪問

来源:https://www.cnblogs.com/huangxincheng/archive/2019/07/07/11146098.html
-Advertisement-
Play Games

當你有若幹個容器之後,你可能就希望實現容器的跨機部署訪問了,比如aspnetcore在一臺host上,mysql在另外一個host上,如果要實現這樣的功能,需要你 藉助docker自帶的overlay網路模型了。 一: overlay網路模型 要想快速的搭建overlay網路,你可以通過docker ...


       

         當你有若幹個容器之後,你可能就希望實現容器的跨機部署訪問了,比如aspnetcore在一臺host上,mysql在另外一個host上,如果要實現這樣的功能,需要你

藉助docker自帶的overlay網路模型了。

 

一: overlay網路模型

        要想快速的搭建overlay網路,你可以通過docker預設的swarm集群給你預設生成的名ingress的overlay網路,這樣會預設開放一些埠供底層機器內的訪問,比如:

UDP 4789 是用於overlay network 流量傳輸的,作為開發角度,你只需要知道這是一個基於底層物理網路構建出的一個上層虛擬網路,而你的程式都是跑在這個虛擬網

絡上,如果要畫圖,大概就是這樣吧!

 

二:通過docker swarm構建overlay網路

      為了構建overlay網路,需要備有兩台機器(使用虛擬機即可):

192.168.23.146  manager
192.168.23.147  worker

 

     使用起來很簡單,在 146機器上執行 docker swarm init 初始化一個集群,同時預設了該機作為 cluster 的manager節點。

[root@manager ~]# docker swarm init
Swarm initialized: current node (g0o8vkgzruv63hsx4pkjs0yfk) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0oxo6qrxwvl8xlneq0jqz2zd87nkj7c0vyf1h9m8kcj3qbzd4v-3eu9zb5athq0s2n79rncbejb1 192.168.23.146:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@manager ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
g0o8vkgzruv63hsx4pkjs0yfk *   manager             Ready               Active              Leader              18.09.6
[root@manager ~]# 

   

       當執行完init之後,通過node ls 可以看到,當前cluster集群中只有一個node節點,而且還是Leader,同時docker還告訴我們怎麼將其他node加入到集群中作為

worker節點,驗證方式是token,好了,那我可以將這段output copy到 147 的 shell上。

[root@worker ~]#  docker swarm join --token SWMTKN-1-0oxo6qrxwvl8xlneq0jqz2zd87nkj7c0vyf1h9m8kcj3qbzd4v-3eu9zb5athq0s2n79rncbejb1 192.168.23.146:2377
This node joined a swarm as a worker.

 

      最後通過在 146 上執行 docker node ls 看一下集群信息,可以看到146,147都在一個集群了。

[root@manager ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
g0o8vkgzruv63hsx4pkjs0yfk *   manager             Ready               Active              Leader              18.09.6
ojjngean30orjzswh72o25rsr     worker              Ready               Active                                  18.09.6

     

     接下來再看一下,4789埠是否開放了,同時看一下ingress的overlay是否開啟了,如下:

[root@manager ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f5fbe8d71b5a        bridge              bridge              local
91cfc77a3c7f        docker_gwbridge     bridge              local
ac4a48a43517        host                host                local
5eux1lz4yom7        ingress             overlay             swarm
02f9bfe179ca        none                null                local
[root@manager ~]# netstat -tlnpu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      4854/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      5523/master         
tcp6       0      0 :::2377                 :::*                    LISTEN      6349/dockerd        
tcp6       0      0 :::7946                 :::*                    LISTEN      6349/dockerd        
tcp6       0      0 :::22                   :::*                    LISTEN      4854/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      5523/master         
udp        0      0 0.0.0.0:47160           0.0.0.0:*                           4549/avahi-daemon:  
udp        0      0 0.0.0.0:68              0.0.0.0:*                           4649/dhclient       
udp        0      0 0.0.0.0:123             0.0.0.0:*                           4555/chronyd        
udp        0      0 127.0.0.1:323           0.0.0.0:*                           4555/chronyd        
udp        0      0 0.0.0.0:4789            0.0.0.0:*                           -                   
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           4549/avahi-daemon:  
udp        0      0 0.0.0.0:26134           0.0.0.0:*                           4649/dhclient       
udp6       0      0 :::123                  :::*                                4555/chronyd        
udp6       0      0 ::1:323                 :::*                                4555/chronyd        
udp6       0      0 :::47743                :::*                                4649/dhclient       
udp6       0      0 :::7946                 :::*                                6349/dockerd  

  

     預設名為ingress 的overlay driver是預設是不支持standalone容器加入的,所以我需要重新new一個overlay,並設置一下允許standalone容器加入此網路,好了,

說乾就乾,new了一個 test-net的overlay網路,通過--attachable 開啟附加功能。

[root@manager ~]# docker network create --driver=overlay --attachable test-net
dajh2glpfattdnq2ahqchlhur
[root@manager ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f5fbe8d71b5a        bridge              bridge              local
91cfc77a3c7f        docker_gwbridge     bridge              local
ac4a48a43517        host                host                local
5eux1lz4yom7        ingress             overlay             swarm
02f9bfe179ca        none                null                local
dajh2glpfatt        test-net            overlay             swarm

 

三:python 跨機連接 redis

     我準備把redis放在147機器上, python application 放在 146上,python 通過 對方的容器名(some-redis) 進行連接,如下圖所示:

 

 

1. 在147上執行docker run時附加 network 為指定的 test-net 網路

[root@worker ~]# docker run --network test-net --name some-redis -d redis
eca08e67e35160661e090ca42a61dacaee5dd8ca99f8e9c25e59ae6927d66328

 

2. python應用程式

主要有三個部分,app.py, Dockerfile, requirements.txt。

《1》 app.py

      下麵要註意的是,在redis的構造函數中指定了host= some-redis ,也就是 147啟動容器名。

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="some-redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

 

《2》 Flask 和 Redis 依賴包 (requirements.txt)

Flask
Redis

 

《3》 最後就是dockerfile

FROM python:2.7-slim

WORKDIR /app

COPY . .

EXPOSE 80

RUN pip install --trusted-host pypi.python.org -r requirements.txt

VOLUME [ "/app" ]

CMD [ "python", "app.py" ]

 

有了這三個,接下來就可以構建image了。

[root@manager app]# docker build -t pyweb:v1 .
Sending build context to Docker daemon  4.608kB
Step 1/7 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
fc7181108d40: Already exists 
8c60b810a35a: Pull complete 
d207b275197c: Pull complete 
63184f224d60: Pull complete 
Digest: sha256:1405fa2f8e9a232e2f60cafbb2b06ca2f1e0f577f4b4c397c361d6dba59fd24e
Status: Downloaded newer image for python:2.7-slim
 ---> ca96bab3e2aa
Step 2/7 : WORKDIR /app
 ---> Running in 6b8324c10dc0
Removing intermediate container 6b8324c10dc0
 ---> a85fb403c57b
Step 3/7 : COPY . .
 ---> f13015df5bf7
Step 4/7 : EXPOSE 80
 ---> Running in 408a718df2b4
Removing intermediate container 408a718df2b4
 ---> 39d30c3a092d
Step 5/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
 ---> Running in 0ee0982739d5
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting Flask (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/c3/31/6904ac846fc65a7fa6cac8b4ddc392ce96ca08ee67b0f97854e9575bbb26/Flask-1.1.0-py2.py3-none-any.whl (94kB)
Collecting Redis (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/ac/a7/cff10cc5f1180834a3ed564d148fb4329c989cbb1f2e196fc9a10fa07072/redis-3.2.1-py2.py3-none-any.whl (65kB)
Collecting Jinja2>=2.10.1 (from Flask->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl (124kB)
Collecting click>=5.1 (from Flask->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Werkzeug>=0.15 (from Flask->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/9f/57/92a497e38161ce40606c27a86759c6b92dd34fcdb33f64171ec559257c02/Werkzeug-0.15.4-py2.py3-none-any.whl (327kB)
Collecting itsdangerous>=0.24 (from Flask->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->Flask->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/fb/40/f3adb7cf24a8012813c5edb20329eb22d5d8e2a0ecf73d21d6b85865da11/MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl
Installing collected packages: MarkupSafe, Jinja2, click, Werkzeug, itsdangerous, Flask, Redis
Successfully installed Flask-1.1.0 Jinja2-2.10.1 MarkupSafe-1.1.1 Redis-3.2.1 Werkzeug-0.15.4 click-7.0 itsdangerous-1.1.0
Removing intermediate container 0ee0982739d5
 ---> 704e7d655494
Step 6/7 : VOLUME [ "/app" ]
 ---> Running in 0c4ad68db249
Removing intermediate container 0c4ad68db249
 ---> 5b0ce6eef187
Step 7/7 : CMD [ "python", "app.py" ]
 ---> Running in 388d972cbd6d
Removing intermediate container 388d972cbd6d
 ---> fd7a0ffca7fc
Successfully built fd7a0ffca7fc
Successfully tagged pyweb:v1
[root@manager app]# docker run -d --network test-net -p 80:80 -v /app:/app --name pyapp pyweb:v1
9d419507b00adddd003f8e45580ec1ee48d4a0347091b65da1bc183a8bbe1dc2
[root@manager app]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
9d419507b00a        pyweb:v1            "python app.py"     4 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   pyapp
[root@manager app]# 

 

     然後訪問一下  http://192.168.23.146,每刷新一下page,都會執行一次redis.incr操作。,這樣就實現了多容器之間的跨機器訪問,大家也可以把這些放到

docker-compose文件中哦。

 

 

 好了,本篇就說到這裡,希望對你有幫助。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為後起之秀,帶給我們太多的驚喜和感動;但是也正是由於年輕,.NETCore 的生態還是不夠完善,這就非常需要我們社區的力量,需要大家一起參與,把開源社區好的工具、組件、應用接入到 .NETCore 應用中。 ...
  • 系列目錄 1. "第一章|理論基礎+實戰控制台程式實現AutoFac註入" 1. 第二章|AutoFac的常見使用套路 1. 第三章|實戰Asp.Net Framework Web程式實現AutoFac註入 1. 第四章|實戰Asp.Net Core自帶DI實現依賴註入 1. 第五章|實戰Asp.N ...
  • 非同步轉同步-PushFrame 本文通過PushFrame,實現非同步轉同步 首先有一個非同步方法,如下非同步任務延時2秒後,返回一個結果 在UI線程執行此任務,嘗試轉化為同步 PushFrame非同步轉同步的實現: 測試結果: Task不帶返回值的處理: PushFrame的缺陷 PS:pushFrame ...
  • 前言: 平時在實際工作中很少用到這個,雖然都是一些比較基礎的東西,但一旦遇到了,又不知所云。剛好最近接觸了一些相關這方面的項目,所以也算是對 這些內容重新溫習實踐了一遍。所以這篇不僅作為個人備忘,也分享給各位重溫一遍。 要學會位運算,首先要清楚什麼是位運算?程式中的所有內容在電腦記憶體中都是以二進位 ...
  • 在業務型的系統開發中,我們需要維護各種個樣的類型,比如客戶類型、客戶行業、商品類型等等,這些類型往往信息量不多,並且相似度極高,如果採用一類型一表去設計,將會造成極大的工作量,通過將這部分類型的信息進行抽象,利用欄位去存儲類型區分,共用表結構,來達到相容各種類型的功能,也就是設計一個數據字典,而對於 ...
  • 窗體設計: 代碼: private void button_src_Click(object sender, EventArgs e) { OpenFileDialog openFile = new OpenFileDialog(); openFile.Title = "請選擇待校正影像"; ope ...
  • 在identityServer4中登陸頁面只要是成功了,就會註冊一個Cookie在伺服器資源上,像現在大部分的網站第三方授權,都是經過一個頁面,然後選需要的功能,IdentityServer4也給我們提供了,只要你登陸成功,就會跳轉到Consent/Index(Get)中,所以我們只要在其中做手腳就 ...
  • 隨手記: 近期需要安裝幾個伺服器,編寫負載均衡NLB的教程,使用到虛擬機; VMware-workstation-full-15.0.2-10952284.exe cn_windows_server_2012_r2_x64_dvd_2707961.iso VMware® Workstation 15 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...