无法从本地主机ping容器中正在运行的服务器

时间:2018-07-15 16:50:46

标签: node.js docker docker-compose

我的本​​地主机上的容器中有正在运行的服务 即使我在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

3 个答案:

答案 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可能对您有帮助。