Ubuntu上的Docker端口冲突

时间:2016-02-21 04:28:00

标签: ubuntu docker port xdebug docker-networking

  • 我正在使用Ubuntu并尝试使用Xdebug(用于PHP的调试器)配置远程调试以在Docker容器上工作。

    trungdq88@ubuntu:~/# ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:7b:c2:ec:97  
              inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: fe80::42:7bff:fec2:ec97/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:8923 errors:0 dropped:0 overruns:0 frame:0
              TX packets:13333 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:5099353 (5.0 MB)  TX bytes:16082560 (16.0 MB)
    
    eth0      Link encap:Ethernet  HWaddr b8:ca:3a:d3:4f:03  
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
  • 我的容器公开端口9000 (Xdebug的工作端口)。

    EXPOSE 80 443 9000
    
  • 由于Ubuntu 中的docker机器与真实机器相同docker-proxy进程占用9000端口

    trungdq88@ubuntu:~/# sudo netstat -tulpn | grep :9000
    tcp6    0    0 :::9000    :::*     LISTEN      10391/docker-proxy
    
  • 我的IDE(Sublime Text)无法启动调试会话,因为它还需要侦听端口9000。

    trungdq88@ubuntu:~/# echo "Assume that this is my IDE" | nc -l -p 9000 
    nc: Address already in use
    
  • 我尝试了另一个端口:

    在Ubuntu中:

    trungdq88@ubuntu:~/# echo "Hello" | nc -l -p 12345
    

    Docker容器内部:

    root@919737061a1d:/src# telnet 172.17.0.1 12345
    Trying 172.17.0.1...
    Connected to 172.17.0.1.
    Escape character is '^]'.
    Hello
    Connection closed by foreign host.
    

    (适用于端口12345)

  • 我的docker-compose.yml

    web:
      build: .
      ports:
        - "80:80"
        - "443:443"
        - "9000:9000"
    

Dockerfile设置运行服务的sh脚本的入口点(php-fpm,nginx ...)。我使用docker-compose up来运行容器。

我的问题是:

  • 在Ubuntu中使用Docker时是否需要公开端口?
  • 如果docker-proxy继续侦听端口9000,如何使IDE调试功能正常工作?
  • 我没有在我的容器中公开端口12345,但为什么最后一个例子(netcat和telnet)仍然有效?

1 个答案:

答案 0 :(得分:1)

  

在Ubuntu中使用Docker时是否需要公开端口?

是的,或根本不打开港口。
Dockerfile EXPOSE

  

EXPOSE指令通知Docker容器在运行时侦听指定的网络端口   EXPOSE不会使主机可以访问容器的端口。为此,您必须使用-p标志来发布一系列端口。

因此,您还需要发布它才能从主机访问:

docker run -p 9000:9000

(来自docker run -p hostPort:containerPort

如果该端口不方便(因为如果必须由XDebug使用),则需要更改主机端口(意味着,在容器内部,您可以继续使用9000)

docker run -p 1245:9000