这是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:
当我运行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
答案 0 :(得分:3)
与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"