Docker组合端口转发无法正常工作

XZe*_*Zen 10 docker docker-compose

当我使用非常简单的命令使用docker:

docker run -p 80:80 nginx
Run Code Online (Sandbox Code Playgroud)

端口转发工作正常,当我使用浏览器/ curl转到localhost:80时,我可以获得nginx的"欢迎页面".

在我使用非常相似但docker-compose特定配置的同时:

version: '3'
services:
  nginx:
    image: nginx
    ports:
     - "80:80"
Run Code Online (Sandbox Code Playgroud)

当我这样做docker-compose up并去浏览器时 - 我看到无限加载,所以看起来端口转发没有正确配置,但我无法理解配置中的错误.我尝试使用不同的浏览器和卷曲,我得到相同的结果 - 无限加载.

这里的Nginx只是一个例子,因为它很简单,实际上我和redis/mysql/java图像有同样的问题,所以问题与nginx无关.

我还尝试了以下方法通过docker-compose启动容器:

docker-compose run -p 80:80 nginx

docker-compose run --service-ports nginx
Run Code Online (Sandbox Code Playgroud)

但没有运气,我得到了同样的结果.

在这两种情况下(docker rundocker-compose up)我都有相同的网络驱动程序类型 - bridge.

我比较docker inspect <container id>了两种情况的结果:http://i.prntscr.com/obvxi0yESEa92znLDEu_PA.png

结果docker inspect <network id>:http: //i.prntscr.com/yyTpetvJSXa-dz4o9Pcl3w.png

ifconfig docker0 结果:

docker0   Link encap:Ethernet  HWaddr 02:42:f1:9a:b6:72  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:f1ff:fe9a:b672/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:174 errors:0 dropped:0 overruns:0 frame:0
          TX packets:837 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:47434 (47.4 KB)  TX bytes:107712 (107.7 KB)
Run Code Online (Sandbox Code Playgroud)

brctl show 结果:

bridge name     bridge id               STP enabled     interfaces
br-f7adc3956101         8000.02427f870e7f       no
docker0         8000.0242f19ab672       no
Run Code Online (Sandbox Code Playgroud)

ifconfig在主机上的结果:https://pastebin.com/6ufWeYTE

route 在主机上的结果:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    600    0        0 wlp4s0
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 docker0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp4s0
Run Code Online (Sandbox Code Playgroud)

双方dockerdocker-compose使用Linux版官方网站的说明进行安装.

主机操作系统:Ubuntu 17.04

更新: 我试图在compose配置中设置'可附加'网络属性,问题得到解决.虽然还不清楚为什么会这样.

networks:
  default:
  attachable: true
Run Code Online (Sandbox Code Playgroud)

Eli*_*iss 7

我的解决方案是添加行network_mode: 'host'

这是完整的文件

    version: '3'
    
    services:
      nginx:
        image: nginx
        ports:
          - "80:80"
        volumes: ['./:/app']
        network_mode: 'host'
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案仅适用于 Linux,因为network_mode: host仅适用于 Linux 主机

该解决方案起作用的原因是network_mode: host使 Docker 忽略端口映射并允许服务直接与主机共享网络,从而完全不需要端口映射。

  • 有谁知道为什么这有效? (5认同)

Zym*_*tik 5

就我而言,我在使用时docker-compose run不带--service-ports参数,因此忽略了端口映射。

例子:

docker-compose.yml

version: "3"

services:
    app-host:
        image: nginx:1.19.0-alpine
        working_dir: /app
        volumes:
            - ./:/app/
        ports:
            - "80:3000"
Run Code Online (Sandbox Code Playgroud)

command

version: "3"

services:
    app-host:
        image: nginx:1.19.0-alpine
        working_dir: /app
        volumes:
            - ./:/app/
        ports:
            - "80:3000"
Run Code Online (Sandbox Code Playgroud)

参考:论坛 docker-compose 文档


Mik*_*ung -1

这就是我运行时使用的docker-compose up并且效果很好。

version: '3'
services:
  nginx:
      image: nginx
      ports:
             - 80:80
Run Code Online (Sandbox Code Playgroud)