从主机访问Docker内部的Jetty服务器

从主机访问Docker内部的Jetty服务器,docker,jetty,docker-compose,Docker,Jetty,Docker Compose,我一直在尝试使用docker compose部署Jetty服务器,但我似乎无法从主机上使用我的应用程序端口 这是我的compose.yml: version: '3.3' networks: app-network: services: db: image: postgres:alpine command: postgres -c hba_file=/etc/pg_hba.conf environment: POSTGRES_USER: *****

我一直在尝试使用docker compose部署Jetty服务器,但我似乎无法从主机上使用我的应用程序端口

这是我的compose.yml:

version: '3.3'

networks:
  app-network:

services:
  db:
    image: postgres:alpine
    command: postgres -c hba_file=/etc/pg_hba.conf
    environment:
      POSTGRES_USER: ******
      POSTGRES_PASSWORD: ******
    volumes:
      - postgresVolume:/var/lib/postgresql/data
      - ./pg_hba.conf:/etc/pg_hba.conf
    networks:
      app-network:
        aliases:
          - mydb

  app:
    build: .
    restart: always
    ports:
      - "7001:7001"
    depends_on:
      - db
    networks:
      - app-network

volumes:
  postgresVolume:
当我跑步时:

docker-compose up --build
一切开始都很好。但我似乎无法从主机访问api:

curl -H "Content-Type: application/json" -X POST -d '{"username":"user","password":"superPass"}' http://localhost:7001/user/ --trace-ascii ./dump
我得到:

== Info:   Trying ::1...
== Info: TCP_NODELAY set
== Info: Connected to localhost (::1) port 7001 (#0)
=> Send header, 136 bytes (0x88)
0000: POST /user/ HTTP/1.1
0016: Host: localhost:7001
002c: User-Agent: curl/7.58.0
0045: Accept: */*
0052: Content-Type: application/json
0072: Content-Length: 42
0086:
=> Send data, 42 bytes (0x2a)
0000: {"username":"user","password":"superPass"}
== Info: upload completely sent off: 42 out of 42 bytes
== Info: Empty reply from server
== Info: Connection #0 to host localhost left intact
运行

iptables -t nat -L -n
给出:

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.19.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.19.0.3           172.19.0.3           tcp 
dpt:7001

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:7001 to:172.19.0.3:7001
编辑:

运行nmap本地主机

对我来说这两个都很好

docker-compose ps
似乎也是正确的:

      Name                     Command               State           Ports
-----------------------------------------------------------------------------------
app_1   java -server -Xms2g -Xmx2g ...   Up      0.0.0.0:7001->7001/tcp
db_1    docker-entrypoint.sh postg ...   Up      5432/tcp
我的Jetty服务器似乎在正确的ip和端口上侦听:

2018-02-07 18:47:34.379 [main] INFO  o.e.jetty.server.AbstractConnector - Started ServerConnector@62452cc9{HTTP/1.1,[http/1.1, h2c]}{0.0.0.0:7001}
有人知道我做错了什么吗?我在运行Arch Linux

docker-compose version


docker-compose version 1.18.0, build unknown
docker-py version: 2.7.0
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.1.0g  2 Nov 2017

谢谢

好的,那么。。。在这里,杰蒂是我的错。我没有料到这一点,只是将我的HTTP服务器实现更改为Netty解决了这个问题,而没有修改我的代码或配置


也许我应该通知Jetty?

根据curl响应,通信正常,只有服务器不知道如何处理您的请求,您确定您的应用程序已配置为接受JSON吗?也许你需要一些额外的标题。我想如果你进入容器应用程序并运行相同的命令,你会得到相同的响应,这可以消除docker问题,你可以关注应用程序问题是的,我的应用程序在本地运行时运行良好。这就是为什么meI在这两种情况下都运行了完全相同的postman查询,但它只在运行locally时起作用。您可以使用-verbose和update问题运行curl吗?端口是否已打开且可用?你能试试本地主机上的nmap看看有什么问题吗?
docker-compose version


docker-compose version 1.18.0, build unknown
docker-py version: 2.7.0
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.1.0g  2 Nov 2017