1
  • 我正在使用 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)仍然有效?
4

1 回答 1

1

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

是的,否则端口根本不会开放。
请参阅DockerfileEXPOSE

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

因此,您还需要发布它以便可以从主机访问:

docker run -p 9000:9000

(来自docker run -p hostPort:containerPort

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

docker run -p 1245:9000
于 2016-02-21T06:16:26.370 回答