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