如何连接到Docker容器的本地主机(从容器内部)
我有一个连接到同一服务器上的区块链的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文件,但不能访问我开始与区块链进行交互的任何端点。
我决定把链和应用程序在同一个容器
这是一个错误,我想。
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来更轻松地同时从这两个容器运行容器。或者你可以从它们手动运行容器。无论哪种方式,你需要两个图像。
感谢您的详细解释!会尝试。但是,这导致了导致我将它全部放在一个图像中的问题:如何将应用程序从一个容器连接到其他容器中的链条?在过去,我只连接到127.0.0.1:
docker创建一个默认的虚拟网络,其中放置每个容器。您可以通过其他容器的名称访问每个容器。如果你有一个名为“chain”的容器,那么你使用的dns名称就是“chain”。所以在你的另一个容器中,你可以访问“chain:
你在做CMD或'docker run'开始区块链? – Robert
sudo docker run -d -p 80:8080 –
Rachelle
您需要告诉docker您要启动的程序。你可以在Dockerfile中用'CMD'或'ENTRYPOINT'来完成。你有什么东西吗? – Robert