lin*_*ina 1 mongodb docker docker-compose
这是docker-compose.yml
版本:“ 3”
services:
web:
build: ./rqiim
command: curl "127.0.0.1:27017"
volumes:
- ./rqiim:/app
- /app/node_modules/
environment:
- MONGO_HOSTNAME=127.0.0.1
ports:
- "8080:8080"
networks:
- host
mongodb:
image: mongo:3.4.18-jessie
container_name: mongodb
volumes:
- /data/db:/data/db
- ./mongo:/etc/mongo
command: --config /etc/mongo/mongod.conf
hostname: mongod1
ports:
- "27017:27017"
networks:
- host
networks:
host:
Run Code Online (Sandbox Code Playgroud)
当我运行时,docker-compose up我得到的Failed to connect to 127.0.0.1 port 27017: Connection refused
似乎是问题所在,它们在同一网络上,再加上我从docker外部从本地连接到MongoDB容器就好了。
这是内容 /etc/mongo/mongod.conf
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
replication:
replSetName: rs0
Run Code Online (Sandbox Code Playgroud)
与Docker中的其他地方一样,127.0.0.1通常表示“此容器”。各种提到的host在你的docker-compose.yml文件实际上创建一个桥型NAT网络碰巧被命名为“主”; 它不启用主机联网模式。话虽这么说,主机联网模式通常是不必要的,所以让我们做对吧:
首先,Docker Compose会自动为每个单独的docker-compose.yml文件创建一个专用的桥式网络,因此这里根本不需要任何networks:块。由于这样做,服务的名称将被阻止,web并且mongodb将成为一个容器到达另一个容器的有效主机名。
在web:服务中,您正在用命令替换其curl命令。该命令完成后,服务将退出,几乎可以肯定这不是您想要的。您还没有包含相关的代码Dockerfile,但是我猜它以这样的行结尾,该行CMD ["npm", "start"]给出了更有用的默认命令。卷的声明也有点奇怪:拥有卷来保存代码不是典型的用例,通常您将COPY(构建的)应用程序树放入图像中Dockerfile。(使用卷来保存持久性数据和注入配置文件,就像使用该mongodb:服务一样,是非常合理的。)
您也不需要显式设置单个容器的container_name:或hostname:,除非在非常特殊的情况下。
删除并固定主机名,我们应该得到:
version: '3'
services:
web:
build: ./rqiim
environment:
- MONGO_HOSTNAME=mongodb
ports:
- "8080:8080"
mongodb:
image: mongo:3.4.18-jessie
volumes:
- /data/db:/data/db
- ./mongo:/etc/mongo
command: --config /etc/mongo/mongod.conf
ports:
- "27017:27017"
Run Code Online (Sandbox Code Playgroud)