2017-05-31 218 views
1

我有一個連接到同一服務器上的區塊鏈的nodejs應用程序。通常我使用127.0.0.1 +端口號(每個鏈接都得到不同的端口)。如何連接到Docker容器的本地主機(從容器內部)

我決定將鏈和應用程序放在同一個容器中,這樣前端開發人員就不必費心設置鏈。

但是,當我建立圖像鏈應該開始。當我運行圖像時,它不是。此外,當我在容器中進行嘗試手動運行時,它會顯示「[email protected]:PORT」。所以我認爲我不需要127.0.0.1連接到127.0.0.2上的端口,但這似乎不起作用。

我確定像這樣連接並不新鮮,應該和數據庫一樣工作。誰能幫忙?第一條建議是如何調試這些圖像,因爲我不知道它出錯的地方。

這裏是我的dockerfile

FROM ubuntu:16.04 
RUN apt-get update 
RUN apt-get install -y curl 
RUN apt-get install -y apt-utils 
RUN apt-get install -y build-essential 
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - 
RUN apt-get install -y nodejs 
ADD workfolder/app /root/applications/app 
ADD .multichain /root/.multichain 
RUN npm install \ 
    && apt-get upgrade -q -y \ 
     && apt-get dist-upgrade -q -y \ 
     && apt-get install -q -y wget curl \ 
     && apt-get clean \ 
     && rm -rf /var/lib/apt/lists/* \ 
     && cd /tmp \ 
     && wget http://www.multichain.com/download/multichain-1.0-beta-1.tar.gz \ 
     && tar -xvzf multichain-1.0-beta-1.tar.gz \ 
     && cd multichain-1.0-beta-1 \ 
     && mv multichaind multichain-cli multichain-util /usr/local/bin \ 
     && cd /tmp \ 
     && rm -Rf multichain* 
RUN multichaind Chain -daemon 
RUN cd /root/applications/app && npm install 
CMD cd /root/applications/app && npm start 
EXPOSE 8080 

順便說一句,由於政策,我只能連接到服務器的80端口,以檢查是否正常工作。當我運行Docker鏡像時,我可以訪問我的/ api-docs文件,但不能訪問我開始與區塊鏈進行交互的任何端點。

+0

你在做CMD或'docker run'開始區塊鏈? – Robert

+0

sudo docker run -d -p 80:8080 Rachelle

+1

您需要告訴docker您要啓動的程序。你可以在Dockerfile中用'CMD'或'ENTRYPOINT'來完成。你有什麼東西嗎? – Robert

回答

3

我決定把鏈和應用程序在同一個容器

這是一個錯誤,我想。

Docker不是虛擬機。這是一個虛擬應用程序或流程實例。

Docker容器在底層運行linux發行版,但是這是在考慮Docker的目的時應該忽略的細節。

您應該將Docker容器看作是單個應用程序進程,而不是將要運行的完整虛擬機通常運行多個進程。一旦主進程關閉(使用PID 1的進程),Docker將關閉容器的方式就證明了這一點。

我有這個較長的帖子,在這裏:https://derickbailey.com/2016/08/29/so-youre-saying-docker-isnt-a-virtual-machine/

此外,在您的dockerfile的RUN multichaind指令不會在圖像/容器中運行的鏈條。它告訴圖像在構建過程中運行該指令。

Dockerfile是用於構建映像的指令列表。這裏的措辭很重要。圖像不被執行,它被構建。圖像是一個靜態的,不可變的模板,從中執行Container。

RUN multichaind鏈-daemon

通過把這個RUN指令在你的形象,你暫時啓動鏈,但它立即停止(強制)當圖像層完成建設。它不會保持運行,因爲圖像不會被執行,而是被構建。

我的建議是把鏈條放在一個單獨的圖像。

您將有一個圖像的鏈,一個爲node.js應用程序。

您可以使用docker-compose來更輕鬆地同時從這兩個容器運行容器。或者你可以從它們手動運行容器。無論哪種方式,你需要兩個圖像。

+0

感謝您的詳細解釋!會嘗試。但是,這導致了導致我將它全部放在一個圖像中的問題:如何將應用程序從一個容器連接到其他容器中的鏈條?在過去,我只連接到127.0.0.1: Rachelle

+0

docker創建一個默認的虛擬網絡,其中放置每個容器。您可以通過其他容器的名稱訪問每個容器。如果你有一個名爲「chain」的容器,那麼你使用的dns名稱就是「chain」。所以在你的另一個容器中,你可以訪問「chain:」。 docker-compose也具有所有這些配置設置,然後還有更多高級主題,例如「服務發現」來處理此問題 –

相關問題