2017-06-12 138 views
1

我是Docker的新手,我尝试了docker-compose中最简单的设置,但没有成功连接到Mongodb。Docker-compose猫鼬

我的搬运工,compose.local.yaml文件:

version: "2" 
services: 
    posts-api: 
    build: 
     dockerfile: Dockerfile.local 
     context: ./ 
    volumes: 
     - ".:/app" 
    ports: 
     - "6820:6820" 
    depends_on: 
     - mongodb 
    mongodb: 
    image: mongo:3.5 
    ports: 
     - "27018:27018" 
    command: mongod --port 27018 

我的码头工人文件:

FROM node:7.8.0 
MAINTAINER Livefeed '[email protected]' 

RUN mkdir /app 
VOLUME /app 
WORKDIR /app 

ADD package.json yarn.lock ./ 
RUN eval rm -rf node_modules && \ 
yarn 

ADD server.js . 
RUN mkdir config src 
ADD config config/ 
ADD src src/ 

EXPOSE 6820 
EXPOSE 27018 

CMD yarn run local 

在server.js我尝试使用连接:

mongoose.connect('mongodb://localhost:27018'); 

我还试过:

mongoose.connect('mongodb://mongodb:27018'); 

要运行泊坞窗 - 撰写:

docker-compose -f docker-compose.local.yaml up --build 

我收到的错误:

connection error: { MongoError: failed to connect to server [localhost:27018] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27018] 

我缺少什么?

+0

@Tamas,是的,我已经在我的Docker.local做到了这一点.yaml文件,我将它添加到描述 – Trace

+0

对不起,我的意思是服务:mongo:image:'mongo:3.5'ports:'27018:27017'。 – Tamas

+0

@Tamas我想运行在27018端口,因为我想为每个微服务运行不同的mongo实例 – Trace

回答

4

在server.js使用mongodb,而不是localhost

mongoose.connect('mongodb://mongodb:27018'); 

因为在同一网络中的容器可以通信使用他们的服务名称进行统一。

请记住,每个容器和主机都有自己的本地主机。每个本地主机都是不同的host:容器A,容器B,主机(每个都有自己的网络接口)。


编辑:

一定要得到你的蒙戈起来:

docker-compose logs mongodb 
docker-compose ps 

有时它不会因为磁盘空间了。


编辑2:

随着蒙戈的新版本,你需要指定监听所有接口也:

command: mongod --port 27018 --bind_ip_all 
+0

我试过这个,但不幸的是,与完全相同的结果...但与depends_on或链接,它不应该工作?我会更新问题的详细信息。 – Trace

+1

确实,你不需要两个。使用'version:“2”'或3,你可以将你的容器放在一个码头网络中,这样他们就可以使用它们的服务名称进行连接。 (链接和depends_on只添加依赖关系信息) – Robert

+0

当我尝试这样做时,它说:'在这个目录或父目录中找不到合适的配置文件。你在正确的目录下吗?'我根据环境使用了一个名为'docker-compose.local.yaml'的文件(我使用config.js)。 Docker ps -a显示mongo:3.5正在上升6分钟。奇怪。 – Trace

1

我认为,你应该在你的配置中添加links选项。就像这样:

ports: 
    - "6820:6820" 
depends_on: 
    - mongodb 
links: 
    - mongodb 

更新

正如我答应

version: '2.1' 
services: 
    pm2: 
     image: keymetrics/pm2-docker-alpine:6 
     restart: always 
     container_name: pm2 
     volumes: 
     - ./pm2:/app 
     links: 
     - redis_db 
     - db 
     environment: 
     REDIS_CONNECTION_STRING: redis://redis_db:6379 

    nginx: 
     image: firesh/nginx-lua 
     restart: always 
     volumes: 
     - ./nginx:/etc/nginx 
     - /var/run/docker.sock:/tmp/docker.sock:ro 
     ports: 
     - 80:80 
     links: 
     - pm2 

     s3: # mock for development 
     image: lphoward/fake-s3:latest 

    redis_db: 
     container_name: redis_db 
     image: redis 
     ports: 
     - 6379:6379 

    db: # for scorebig-syncer 
     image: mysql:5.7 
     ports: 
     - 3306:3306 
+4

链接被认为已被弃用。按照Robert的建议,使用码头的DNS和网络将容器连接在一起。 – BMitch