我的本地主机上的容器中有正在运行的服务
即使我在docker-compose.yml
中指定了端口映射,也无法与它建立连接
version: '2.1'
services:
users-db:
container_name: users-db
build: ./services/users-service/src/db
ports:
- '27017:27017'
volumes:
- './services/users-service/src/db/:/data/db'
users-service:
container_name: users-service
build: './services/users-service/'
volumes:
- './services/users-service:/usr/src/app'
- './services/users-service/package.json:/usr/src/package.json'
ports:
- '3000:3000'
environment:
- NODE_ENV=test
- JWT_SECRET=fuckOffChinese
depends_on:
users-db:
condition: service_started
presence_db:
image: redis
presense_service:
container_name: presense_service
build: './services/presence-service/'
ports:
- "8081:8081"
environment:
- JWT_SECRET=thirdEyeSecret
- PORT=8081
volumes:
- './services/presence-service:/usr/src/app'
- './services/presence-service/package.json:/usr/src/package.json'
depends_on:
- presence_db
这是我用来运行此服务的命令
docker-compose run presense_service
这就是我每次尝试通过简单地执行HTTP GET请求从终端ping起来的结果
http: error: ConnectionError: HTTPConnectionPool(host='localhost', port=8081): Max retries exceeded with url: / (Caused by
NewConnectionError(':无法建立新连接:[Errno 61]连接被拒绝',)),同时对URL执行GET请求: http://localhost:8081/
我正在运行macOS 10.13.5,服务器正常启动,这是它的日志
> users-service@1.0.0 start /usr/src
> gulp --gulpfile app/gulpfile.js
[10:12:46] Working directory changed to /usr/src/app
[10:12:52] Using gulpfile /usr/src/app/gulpfile.js
[10:12:52] Starting 'start'...
[10:12:56] Finished 'start' after 3.99 s
[10:12:56] Starting 'lint'...
[10:12:57] Finished 'lint' after 239 ms
[10:12:57] Starting 'default'...
[10:12:57] Finished 'default' after 131 μs
[10:12:57] [nodemon] 1.18.2
[10:12:57] [nodemon] to restart at any time, enter `rs`
[10:12:57] [nodemon] watching: *.*
[10:12:57] [nodemon] starting `node ./index.js`
Server listening on: http://localhost:8081
Redis client connected
答案 0 :(得分:1)
尝试使用docker-compose run presense_service --service-ports
,或者更好的方法是使用docker-compose up
。
docker-compose run
专门不会将Compose文件中的端口应用于“防止与已打开的端口发生端口冲突” [1]-因此,您必须添加此选项,或使用相同的选项手动指定它们您将传递给docker run
。
理想情况下,使用docker-compose up -d
,然后使用docker-compose logs -f presense_service
获取日志。用docker-compose down
关闭您的应用程序。
如果确实需要,可以在不想启动的docker-compose.yml
文件中注释服务。
如果您不知道,compose
格式的最新版本是3.6
-2.1
已经使用两年多了(2016年7月28日与Docker v1.12.0一起发布[ 2])。
证明这很容易-因为我没有您的代码,所以我用image: nginx
替换了所有映像/构建行(并从所有卷中删除了主机路径)。
修改后的撰写文件示例(仅供参考):
version: '2.1'
services:
users-db:
container_name: users-db
image: nginx
ports:
- '27017:27017'
volumes:
- './services/users-service/src/db/:/data/db'
users-service:
container_name: users-service
image: nginx
volumes:
- '/usr/src/app'
- '/usr/src/package.json'
ports:
- '3000:3000'
environment:
- NODE_ENV=test
- JWT_SECRET=fuckOffChinese
depends_on:
users-db:
condition: service_started
presence_db:
image: redis
presense_service:
container_name: presense_service
image: nginx
ports:
- "8081:8081"
environment:
- JWT_SECRET=thirdEyeSecret
- PORT=8081
volumes:
- '/usr/src/app'
- '/usr/src/package.json'
depends_on:
- presence_db
在docker ps
之后运行docker-compose up -d
可以做到这一点(请注意PORTS
列):
my-machine$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1b89cf3d6c2 nginx "nginx -g 'daemon of…" 19 seconds ago Up 14 seconds 80/tcp, 0.0.0.0:3000->3000/tcp users-service
be0e9b2bb005 nginx "nginx -g 'daemon of…" 19 seconds ago Up 13 seconds 80/tcp, 0.0.0.0:8081->8081/tcp presense_service
2efed2546926 nginx "nginx -g 'daemon of…" 20 seconds ago Up 14 seconds 80/tcp, 0.0.0.0:27017->27017/tcp users-db
c7a88a84f422 redis "docker-entrypoint.s…" 20 seconds ago Up 14 seconds 6379/tcp test_presence_db_1
...因此您的端口配置没有问题。 docker ps
之后的docker-compose run presense_service
显示:
my-machine$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89e4a4f90a75 nginx "nginx -g 'daemon of…" 28 seconds ago Up 21 seconds 80/tcp test_presense_service_run_1
2c91fcb5091d redis "docker-entrypoint.s…" 29 seconds ago Up 24 seconds 6379/tcp test_presence_db_1
...因此是导致该问题的命令。很高兴为您提供帮助,因为我学到了一些新东西:)
[1] https://docs.docker.com/compose/reference/run/
[2] https://docs.docker.com/release-notes/docker-engine/#1120-2016-07-28
答案 1 :(得分:0)
尝试执行以下操作以查看端口8081是否已打开/占用:
netstat -l | grep 8081
答案 2 :(得分:0)
服务器日志中说
服务器正在监听:http://localhost:8081
在Docker容器之外将无法访问服务器。看起来这是Express JavaScript Web服务器以及许多其他框架在“开发人员”模式下运行时的默认行为。您需要将服务器设置为侦听所有IP地址,可能是通过传递0.0.0.0作为“绑定”地址。 (请注意,您不能 connect 到0.0.0.0,并且说“听0.0.0.0”表示“接受来自任何地方的连接”。
如果您的服务器实际上基于Express,则https://superuser.com/questions/582624/how-to-access-nodejs-server-on-lan可能对您有帮助。