1. 程式人生 > 實用技巧 >fastdfs的storage的IP地址對映docker宿主地址

fastdfs的storage的IP地址對映docker宿主地址

原文連結:https://www.cnblogs.com/zzsdream/p/11199374.html

https://blog.snailr.cn/archives/536

一、概述

最近公司準備全面實施docker部署,解決每次專案實施安裝部署環境工作量大問題,mysql5.7、oracle12c很順利,在安裝fastdfs時碰到storage的IP地址對映問題。伺服器採用的是CentOS7.6,關閉了firewall,啟動映象後在區域網其他機器無法通過fastdfs-java-client上傳檔案,獲取的storage的IP地址為容器的IP地址,區域網其他機器無法訪問容器的IP地址,查找了很多資料包括:docker-proxy iptables 等最終解決問題,記錄下來方便。

二、fastdfs映象安裝和容器啟動

fastdfs映象是通過作者提供的dockerfile進行構建:https://github.com/happyfish100/fastdfs/tree/master/docker/dockerfile_network,構建比較簡單,下載作者提供的dockerfile_network目錄,裡面包含了用最新的程式碼構建fastdfs的映象,然後在目錄執行:

​docker build -t fastdfs:V5.11 .

構建成功後,通過docker images檢視映象

啟動映象,本機的IP地址為 192.168.1.98 執行以下命令啟動:

docker run -d -e FASTDFS_IPADDR=192.168.1.98 -p 8888:8888 -p 22122:22122 -p 23000:23000 -p 8011:80 --name test-fast fastdfs:V5.11

三、問題描述和分析

在另一臺機器192.168.1.230使用fastdfs-client-java測試上傳圖片,總是報錯提示 connect time out ,除錯程式碼後發現連線到tracker server (192.168.1.98:22122)成功的,並且返回了storage資訊,但是storage地址是:172.17.0.1:23000,192.168.1.230是無法連線到172.17.0.1的IP,這個IP是docker的一個虛擬網絡卡IP,用於橋接執行容器,如下圖:

查看了作者提供的fastdfs.sh檔案,容器啟動時已經把storage.conf的配置檔案裡面的tracker_server地址替換為FASTDFS_IPADDR=192.168.1.98引數的地址,也就是說storage是連線到tracker server 的地址是192.168.1.98:22122,按道理storage註冊到tracker server的地址應該也是192.168.1.98,進入容器檢視tracker server的資訊:

[root@localhost ~]# docker exec -it test-fast /bin/bash
[root@854ce848546a /]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

到這裡問題已經找到了,storage server在容器裡面連線到192.168.1.98:22122 地址時,tracker server記錄到storage的地址是 docker0 虛擬網絡卡(172.17.0.1)的地址。

對centos下docker的網路不熟悉,百度學習了很久的 docker網路(Bridge模式、Host模式、Containner模式等)、iptables的知識後,大概知道storage server在容器裡面連線192.168.1.98:22122 ,通過NAT錶轉發到tracker server時,資料包裡面的源地址為:172.17.0.1導致了tracker server預設認為storage的地址是172.17.0.1

四、解決問題的思路

在學習了iptables的知識後(主要看了 http://www.zsythink.net/archives/1199/)後,已經明白在NAT錶轉發過程中,資料達到172.17.0.2的22122埠記錄的源地址是 172.17.0.1,我們只需要修改iptables的NAT表規則,所有轉發到172.12.0.2:22122的資料,源地址修改為宿主主機的地址:192.168.1.98,這樣storage註冊到tracker server時,tracker server獲取到storage的ip地址為 192.168.1.88 而不是閘道器地址172.17.0.1

iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 22122 -d 172.17.0.2 -j SNAT --to 192.168.1.98

使用iptables -L -t nat 檢視nat表規則

重新執行fastdfs-client-java的工程,返回的storage的地址為 192.168.1.98,上傳成功:

五、總結

個人感覺採用docker部署後,網路環境會比單機更加複雜,如果直接採用Host模式的網路和單機一樣,如果採用Bridge模式的換會複雜很多,想學docker的話必須很好掌握docker的網路的基礎知識。同時在liunx下如果使用了iptables的話,也需要了解docker和iptables的技術細節。我覺得這個思路也許能解決目前fastdfs的內網IP對映外網進行上傳的問題,找個時間試試看。

FastDFS向使用者提供基本檔案訪問介面,比如uploaddownloadappenddelete等,以客戶端庫的方式提供給使用者使用。

客戶端使用流程由Client連線Tracker的IP和prot,Tracker接收到Client請求,告訴ClientStorage的真實IP和port,Client再去連線實際Storage的IP和port;在TrackerStorge之間,存在通訊機制,這一機制,決定了Tracker告訴Client的IP和port。

  • 問題一:FastDFS需要通過代理IP:port或公網地址訪問解決方案:(獲取storage外網ip的問題)
    • 第一步:Client連線Tracker的地址配置成代理IP:port或公網地址
    • 第二步:在Storage.conf配置檔案中配置Tracker伺服器的IP和port (代理IP:port或公網地址)
  • 問題二:FastDFS需通過代理地址訪問,由於某些機制原因Storage無法訪問Tracker的代理地址解決方案:(此方案適用於Client可通過代理地址訪問Storage)
    • Client通過Tracker獲取到Storage地址後將真實的IP和port 替換成代理的IP和port
    • 此方案可參考fastdfs-client-java-storage-ip-mapping,需替換Clientjar檔案和在配置檔案中新增fastdfs.storage_server.ip_mapping配置
  • 問題三:docker安裝fastdfs碰到storage的IP地址對映宿主地址問題解決方案:
    • 啟動時用宿主地址啟動:(以下以192.168.1.100為宿主IP)
      • docker run -d -e FASTDFS_IPADDR=192.168.1.100 -p 8888:8888 -p 22122:22122 -p 23000:23000 -p 8011:80 --name test-fast fastdfs:V5.11
    • 源地址修改為宿主主機的地址:
      • 在NAT錶轉發過程中,資料達到172.17.0.2的22122埠記錄的源地址是 172.17.0.1,我們只需要修改iptables的NAT表規則,所有轉發到172.12.0.2:22122的資料,源地址修改為宿主主機的地址:192.168.1.100,這樣storage註冊到tracker server時,tracker server獲取到storage的ip地址為 192.168.1.100 而不是閘道器地址172.17.0.1
      • iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 22122 -d 172.17.0.2 -j SNAT --to 192.168.1.100