Mongodb://127.0.0.1:27017で実行されているローカルmongoDBサーバーがあります。私のDB名はlocalv2です。次のように、Dockerfileを含むノード/エクスプレスアプリがあります。
FROM node:7.5
RUN npm install -g pm2
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install
COPY . /usr/src/app
EXPOSE 3002
ENV NODE_ENV local
CMD pm2 start --no-daemon server.js
Server.jsファイルには、次のコードを使用してローカルmongodbへの接続があります。
app.db = mongoose.connect("mongodb://127.0.0.1:27017/localv2", options);
上記のDockerfileを使用して作成されたイメージからコンテナーをスピンアップすると、これは機能しません。 Dockerが独自のgatway IPアドレスを使用してVLANを作成します。コンテナをdocker inspect
すると、ゲートウェイIPアドレス:172.17.0.1。
Mongodb接続を
app.db = mongoose.connect("mongodb://172.17.0.1:27017/localv2", options)
画像を再構築して新しいコンテナを開始しても、まだエラーが発生します:
MongoError: failed to connect to server [172.17.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 172.17.0.1:27017]
コンテナを実行するコマンド:docker run -p 3002:3002 image-name
助けてください。
@ vlad-holubievをここに答えとして追加すると、私にとってはうまく機能し、ユーザーが見つけやすくなります。
ドキュメントで指定されている docker runのネットワークホストオプション の使用:
ネットワークをホストに設定すると、コンテナはホストのネットワークスタックを共有し、ホストからのすべてのインターフェースがコンテナで利用可能になります。コンテナのホスト名は、ホストシステムのホスト名と一致します。
docker run -d -e ROOT_URL=http://localhost -e MONGO_URL=mongodb://localhost:27017 --network="Host"
Docker for Macでは、Host.docker.internal
mongoがローカルホストで実行されている場合。 mongoホストのenv変数でコードを読み取って、Dockerfileで次のように設定できます。
ENV MONGO_Host "Host.docker.internal"
https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds の詳細についてはこちらをご覧ください
Dockerコンテナはコンピュータとは別のものであり、
したがって、localhost
に接続できません。
コンテナでmongoサーバーを実行し、イメージ名で接続する必要があります。
mongodb://CONTAINER-NAME:port