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

时间:2017-10-31 19:45:42

标签: docker docker-compose

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

docker run -p 80:80 nginx

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

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

version: '3'
services:
  nginx:
    image: nginx
    ports:
     - "80:80"

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

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

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

docker-compose run -p 80:80 nginx

docker-compose run --service-ports nginx

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

在这两种情况下(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)

brctl show结果:

bridge name     bridge id               STP enabled     interfaces
br-f7adc3956101         8000.02427f870e7f       no
docker0         8000.0242f19ab672       no
主机上的

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

使用适用于Linux的官方网站说明安装了dockerdocker-compose

主机操作系统:Ubuntu 17.04

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

networks:
  default:
  attachable: true

6 个答案:

答案 0 :(得分:4)

就我而言,我使用的是没有 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"

command

    docker-compose run --service-ports app-host

参考文献:discussion forum docker-compose documentation

答案 1 :(得分:1)

尝试删除您创建的所有网络,如下所示:
docker network rm $(docker network ls -q)

然后再次运行docker-compose up

答案 2 :(得分:0)

这是我使用docker-compose up运行的,它运行正常。

version: '3'
services:
  nginx:
      image: nginx
      ports:
             - 80:80

答案 3 :(得分:0)

  

我试图在compose配置中设置'可附加'网络属性,问题已修复。虽然还不清楚为什么会这样。

文章“Docker Stacks and Attachable networks”将可连接网络定义为一种群体覆盖网络。

这意味着在该网络上创建的服务将允许docker run命令:

docker service create --publish 80:80 --network=core-infra --name 
docker run --network=core-infra -ti ...

可以在docker-compose.yml文件中指定这些行,结果将是相同的:如果网络可连接,docker run将能够使用它。

  

创建容器docker network inspect core-infra后,将显示网络的子网和其他诊断信息。

奇怪的是,自{2.1}中提到以来,默认情况下网络应该可以附加2.1。

  

可连接的网络帮助Docker Swarm Services与先前版本的业务流程Swarm进行互操作   传统Swarm和Swarm服务之间的核心区别在于,旧版产品允许以强制方式安排容器。声明式群集服务允许我们定义我们想要实现的最终状态,然后群组将应用和维护。

答案 4 :(得分:0)

只需2美分...... 但是我已经遇到了麻烦(很久以前)有一个 docker-compose 版本。此外, docker-compose 是用 Python 编写的,因此问题可能来自您的本地 Python 安装。

我建议您尝试 dduportal / docker-compose 。 它允许将 docker-compose 本身作为容器运行,共享docker套接字并将本地路径作为卷安装,以便本地项目将由主机上的容器启动。

只需在项目目录中运行此命令:

docker run -v "$(pwd)":"$(pwd)" \
         -v /var/run/docker.sock:/var/run/docker.sock \
         -e COMPOSE_PROJECT_NAME=$(basename "$(pwd)") \
         --workdir="$(pwd)" \
         -ti --rm \
         dduportal/docker-compose:latest up

通过这种方式,您可以确保 docker-compose 文件没有问题; - )

答案 5 :(得分:0)

对我来说,解决方案是添加行network_mode: 'host'

这是完整文件

version: '3'

services:
  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes: ['./:/app']
    network_mode: 'host'