如何连接到docker容器的localhost(从容器内部)

时间:2017-05-31 13:55:54

标签: node.js docker blockchain

我有一个nodejs应用程序连接到同一服务器上的区块链。通常我使用127.0.0.1 +端口号(每个链获得一个不同的端口)。

我决定将链和应用放在同一个容器中,这样前端开发人员就不用费心去设置链了。

然而,当我构建图像时,链应该开始。当我运行图像时,它不是。此外,当我进入容器并尝试手动运行时,它会显示“besluitChain2@xxx.xx.x.2: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
btw由于策略我只能连接到端口80的服务器以检查它是否有效。当我运行docker镜像时,我可以转到我的/ api-docs,但不能转到我开始与区块链交互的任何端点。

1 个答案:

答案 0 :(得分:3)

  

我决定将链和应用放在同一个容器中

我认为这是一个错误。

Docker不是虚拟机。它是一个虚拟应用程序或流程实例。

Docker容器在底层运行Linux发行版,但在考虑Docker的用途时,这是一个应该被忽略的细节。

您应该将Docker容器视为单个应用程序进程,而不是通常运行多个进程的完整虚拟机。这可以通过Docker在主进程关闭后关闭容器的方式来证明(使用PID 1的进程)。

我有一篇关于此事的更长的帖子,在这里:https://derickbailey.com/2016/08/29/so-youre-saying-docker-isnt-a-virtual-machine/

此外,dockerfile中的RUN multichaind指令不会在图像/容器中运行链。它告诉图像在构建过程中运行此指令。

Dockerfile是用于构建映像的指令列表。这里的措辞很重要。不执行图像,它是构建的。图像是一个静态的,不可变的模板,从中执行Container。

  

RUN multichaind Chain -daemon

通过在图像中放置此RUN指令,您将暂时启动链,但在图像层完成构建时会立即停止(强制)。它不会继续运行,因为图像不会被执行,而是构建的。

我的建议是将链条放在一个单独的图像中。

您将拥有一个链图像,一个用于node.js应用程序。

您可以使用docker-compose,以便更容易同时运行这两个容器。或者您可以从它们手动运行容器。无论哪种方式,您都需要两张图片。

相关问题