Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ubuntu上的Docker端口冲突_Ubuntu_Docker_Port_Xdebug_Docker Networking - Fatal编程技术网

Ubuntu上的Docker端口冲突

Ubuntu上的Docker端口冲突,ubuntu,docker,port,xdebug,docker-networking,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

我正在使用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的工作端口)

  • 由于Ubuntu中的docker机器与真实机器相同,因此
    docker代理进程采用9000端口

    trungdq88@ubuntu:~/# sudo netstat -tulpn | grep :9000
    tcp6    0    0 :::9000    :::*     LISTEN      10391/docker-proxy
    
  • 我的IDE(升华文本)无法启动调试会话,因为它还需要侦听端口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
    运行容器

    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)
    
    我的问题是:

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


    是,否则端口将根本无法打开。
    见:

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

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

    docker run -p 9000:9000
    
    (来自)

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


    请提供您的
    docker run
    命令好吗?@Auzias我使用
    docker compose up
    来运行容器,我已经编辑了我的问题(添加
    docker compose.yml
    内容)。IDE需要监听来自容器的调试信息通过的端口,在本例中为
    9000
    。如果我们将容器中的
    9000
    映射到主机中的
    1245
    ,这是否意味着IDE将不会在端口
    9000
    上接收任何内容?而且IDE无法监听
    1245
    ,因为
    docker proxy
    正在监听它?“是的,或者端口根本不会被打开。”-你能提供一个链接到一个提到这一点的文档吗?@TrungDQ“如果我们将容器中的9000映射到主机中的1245,这不意味着IDE不会在端口9000上接收任何内容吗?”是的,因此,在您的情况下,请映射到端口9000。@TrungDQ“您能提供一个指向提及此问题的文档的链接吗?”:我已经编辑了答案。如果我没有清楚地解释问题,我很抱歉。当我将端口映射为
    9000:9000
    时,在侦听
    9000
    的主机中有一个名为
    docker proxy
    的进程,这使我的IDE无法启动调试会话(因为它也必须侦听9000)。如果我使用
    1245:9000
    映射,也会发生同样的情况。
    docker run -p 1245:9000