2017-05-31 221 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也具有所有这些配置设置,然后还有更多高级主题,例如“服务发现”来处理此问题 –

相关问题