我不能用集装箱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的用于将容器彼此链接的别名。