我正在使用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
来运行容器。
我的问题是:
docker-proxy
继续侦听端口9000,如何使IDE调试功能正常工作?答案 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