2017-02-21 33 views
1

使用Docker-i化nodejs應用程序,我試圖設置它,以便它將響應非標準端口,避免已經運行本地Redis容器或服務的團隊成員發生潛在衝突。如何爲Redis/RethinkDB指定備用公開端口(使用Docker Compose)?

Redis通常在6379上運行(不管是泊塢窗還是沒有)。我希望它在6380上聽。即使我沒有在docker-compose文件中,我也想用RethinkDB做同樣的事情。

我不想爲EitherER Redis或RethinkDB創建一個新的Dockerfile。

這是我的Docker-Compose文件。

nodejsapp: 
    image: some-node-container 
    container_name: nodejsapp 
    ports: 
     - "5200:5200" #first number must match CHEAPOTLE_PORT env variable for the cheapotle service 
    depends_on: 
     - redis 
     - rethinkdb 
    volumes: 
     - ./:/app 
    environment: 
     - NODEJSAPP_PORT=5200 #must match first port number for cheapotle service above. 
     - REDIS_PORT=6380 #must match first number in redis service ->ports below. 
     - RETHINKDB_PORT=28016 #must match first number in redis service ->ports below. 

    redis: 
    image: redis:3.2-alpine 
    container_name: redis_cheapotle 
    ports: 
     - "6380:6379" 
    expose: 
     - "6380" # must match alternate "first" port above to avoid collisions 

    rethinkdb: 
    image: rethinkdb 
    container_name: rethinkdb_cheapotle 
    ports: 
     - "28016:28015" #The first number needs to match the RETHINKDB_PORT in environment variables for cheapotle above. You must change both or none, they must always be the same. 
     - "8090:8080" #this is where you will access the RethinkDB admin. If you have something on 8090, change the port to 8091:8080 
    expose: 
     - "28016" # must match alternate "first" port above to avoid collisions 

做了幾個dockerizations後,我以爲會很容易。我會設置我的環境變量,在我的JS文件中使用proces.env.whatever,然後出門,然後進入下一個。

錯誤。

雖然我可以在0.0.0.0:8090(通知 8090備用端口)獲取到RethinkDB管理區,沒有我的容器可以互相交談 在他們指定的端口。

起初,我嘗試了上面沒有YAML的'暴露'部分,但我得到了與'揭露'YAML補充相同的結果。

看起來docker /容器拒絕將進入Host-> Alternate Port的流量轉發到Container-> Standard Port。我做了一些Google搜索,並且在前20分鐘沒有找到任何東西,所以我想我會在繼續搜索時發佈這些內容。

如果我在過程中發現它,我會發佈一個答案。

回答

0

確定。所以我能夠解決這個問題,似乎可能存在一個錯誤,因爲正常端口:「XXXXX:YYYYY」官方rethinkDB和Redis容器如何處理端口轉發,忽略YAML規範,並且流量不是從修改後的主機發送的端口轉換爲標準碼頭端口。

解決方案是修改用於啓動Redis/RethinkDB容器的命令,以使用命令行端口標誌(每個系統都不相同)更改爲備用端口。

起初我嘗試使用環境變量Env文件(但顯然這些在運行時不可用)。我還希望用戶能夠直接在Docker-Compose文件中查看堆棧的所有端口/設置,以便上面的Port標誌解決方案看起來很有意義。

我仍然不知道爲什麼搬運工不會向前備用主機端口流量 的標準貨櫃港這兩項服務,同時將 前進的備用主機端口的rethinkDB管理頁面 (8090:8080) 。

這裏是泊塢窗,撰寫文件,我結束了:

version: "2" 

services: 

    nodejsapp: 
    image: some-node-container 
    container_name: cheapotle 
    ports: 
     - "5200:5200" #both numbers must match CHEAPOTLE_PORT env variable for the cheapotle service 
    depends_on: 
     - redis 
     - rethinkdb 
    volumes: 
     - ./:/app 
    environment: 
     - CHEAPOTLE_PORT=5200 #must match cheapotle service ports above. 
     - RETHINKDB_PORT=28016 #must match rethinkdb service->ports below. 
     - REDIS_PORT=6380 #must match redis service ->ports below. 
     - RESQUE_PORT=9292 
    entrypoint: foreman start -f /app/src/Procfile 

    redis: 
    image: redis:3.2-alpine 
    container_name: redis_cheapotle 
    ports: 
     - "6380:6380" #both numbers must match port in command below AND REDIS_PORT cheapotle service variable 
    command: redis-server --port 6380 #must match above ports AND REDIS_PORT cheapotle service variable 


    rethinkdb: 
    image: rethinkdb 
    container_name: rethinkdb_cheapotle 
    ports: 
     - "28016:28016" #The both numbers must match the RETHINKDB_PORT in environment variables for cheapotle above + command below. You must change allor none, they must always be the same. 
     - "8090:8080" #this is where you will access the RethinkDB admin. If you have something on 8090, change the port to 8091:8080 
    command: rethinkdb --driver-port 28016 --bind all #must match above ports AND REDIS_PORT cheapotle service variable 

該文檔的命令行實用程序RethinkDB可以在這裏找到: https://www.rethinkdb.com/docs/cli-options/雖然文檔爲Redis的命令行可以在這裏找到:https://redis.io/topics/config

有了上述我可以開始一切備用端口不會碰撞在團隊中的其他開發者已經運行rethinkDB和/或Redis的可能引擎蓋。

這不是一個檔次的生產設置,以便在您自己的風險暫時使用。顯然RethinkDB需要額外的配置,以允許其他節點加入羣集的其他端口不是29015.

另外!由於任何人rethinkDB命令行 標誌工作前的警告:對rethinkDB接受端口的變化「--driver端口 28016」必須是前「--bind所有」,否則就好像它是不是 連在那裏和忽略。

0

你應該link在一起:)

nodejsapp: 
    . 
    . 
    ports: 
     - "5200:5200" 
    . 
    . 
    links: 
     - redis 
     - rethinkdb 

    redis: 
    . 
    . 
    ports: 
     - "6380:6379" 
    expose: 
     - "6380" 

    rethinkdb: 
    . 
    . 
    ports: 
     - "28016:28015" 
     - "8090:8080" 
    expose: 
     - "28016" 
+0

嘿@mass感謝您的答覆。 我正在嘗試避免使用鏈接,因爲它們已被折舊以支持網絡。在泊塢窗,撰寫文件中的所有容器現在加入當堆棧被帶到現場所以在這個搬運工,撰寫文件的容器已經可以互相交談時創建的默認網絡(他們不能相互交談與備用端口指定...除了rethinkDB管理員在8090:8080) – Necevil

+0

我認爲你的意思是'--link'標誌,這是不同的。請參閱https://forums.docker.com/t/are-links-deprecated-in-docker-compose/27348。 'links'在撰寫然而,在撰寫第3版,而不是過時但至少:) https://docs.docker.com/compose/compose-file/compose-versioning/ – mass

+0

不知道有一個差別,但這裏的問題與集裝箱看不到對方的能力無關。他們可以看到對方,當端口設置爲標準rethinkdb 28015和Redis的6379.只有當我試圖更改轉發到我遇到問題的集裝箱港口的主機端口說話沒問題。 – Necevil

相關問題