我不能用集装箱docker连接到mongo

我是新来的docker工程师,所以我在这里跟随了一个教程,第6,7和8部分,以便在项目中使用和学习docker工人。

问题是,当我使用docker-compose.yml在我的笔记本电脑上构build图像时,我的stack_server可以连接到mongo。

但是,如果我从docker集线器构build图像,我拉我的笔记本电脑,并单独运行它们,我的stack_server CAN不能连接到mongo。

这里是我的docker-compose.yml:

client: build: ./client restart: always ports: - "80:80" links: - server mongo: image: mongo command: --smallfiles restart: always ports: - "27017:27017" server: build: ./server restart: always ports: - "8080:8080" links: - mongo 

但是,我的stack_client可以连接到stack_server。

和我的命令来运行我的形象(我的图像是公开的)

 docker-run -i -t -p 27017:27017 mongo docker-run -i -t -p 80:80 mik3fly4steri5k/stack_client docker-run -i -t -p 8080:8080 mik3fly4steri5k/stack_server 

和我的错误日志

 bryan@debian-dev7:~$ sudo docker run -i -t -p 8080:8080 mik3fly4steri5k/stack_server [sudo] password for bryan: Express server listening on 8080, in development mode connection error: { Error: connect ECONNREFUSED 127.0.0.1:27017 at Object._errnoException (util.js:1021:11) at _exceptionWithHostPort (util.js:1043:20) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1175:14) name: 'MongoError', message: 'connect ECONNREFUSED 127.0.0.1:27017' } 

这里是我的stack_server dockerfile

 FROM node:latest # Set in what directory commands will run WORKDIR /home/app # Put all our code inside that directory that lives in the container ADD . /home/app # Make sure NPM is not cached, remove everything first RUN rm -rf /home/app/node_modules/npm \ && rm -rf /home/app/node_modules # Install dependencies RUN npm install # Tell Docker we are going to use this port EXPOSE 8080 # The command to run our app when the container is run CMD ["node", "app.js"] 

第一个解决scheme,但不推荐

 docker-run -i -t -p 27017:27017 --name:mongo mongo docker-run -i -t -p 80:80 mik3fly4steri5k/stack_client docker-run -i -t -p 8080:8080 --link mongo:mongo mik3fly4steri5k/stack_server 

当我运行我的stack_server时,我必须在我的mongo上input一个名字,并将其与参数–link链接起来

docker文件

 Warning: The --link flag is a deprecated legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environmental variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way. 

用下面的命令运行你的stack_server

 sudo docker run -i -t -p 8080:8080 --link mongo:mongo mik3fly4steri5k/stack_server 

注意: – 链接标志已被弃用

你的容器正在运行。 但是健康吗? 我build议你实施Healthcheck

它实际上看起来几乎相同:(Docker-compose YAML)

 healthcheck: test: curl -sS http://127.0.0.1:8080 || echo 1 interval: 5s timeout: 10s retries: 3 

Docker健康检查是一个可爱的小function,允许将shell命令附加到容器,并用它来检查容器的内容是否足够活跃。

我希望它可以帮助你。

更多信息https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck

要启动一个需要的端口上的MongoDB,你将不得不做以下事情:

 client: build: ./client restart: always ports: - "80:80" links: - server mongo: image: mongo command: mongod --port 27017 restart: always ports: - "27017:27017" server: build: ./server restart: always ports: - "8080:8080" links: - mongo 

让我们看看错误

连接错误:{错误:连接ECONNREFUSED 127.0.0.1:27017

服务器试图连接到localhost而不是mongo。 你需要configuration服务器连接mongo到mongo:27017

mongo是由docker创build的用于将容器彼此链接的别名。