Docker Compose无法绑定端口。

7

我有一个用于容器的Dockerfile:

FROM        centos:centos7

# Install software
RUN         yum -y update && yum clean all
RUN         yum install -y tar gzip wget && yum clean all

# Install io.js
RUN         mkdir /root/iojs
RUN         wget https://iojs.org/dist/v1.1.0/iojs-v1.1.0-linux-x64.tar.gz
RUN         tar -zxvf iojs-v1.1.0-linux-x64.tar.gz -C /root/iojs
RUN         rm -f iojs-v1.1.0-linux-x64.tar.gz

# add io.js to path
RUN         echo "PATH=$PATH:/root/iojs/iojs-v1.1.0-linux-x64/bin" >> /root/.bashrc

# go to /src
WORKDIR     /src

CMD         /bin/bash

我使用docker run -i -t -p 8080:8080 -v /srv/source:/usr/src/app -w /usr/src/app --rm iojs-dev bash命令构建此容器并启动镜像。Docker将端口8080绑定到主机端口8080,因此我可以从客户端访问iojs应用程序。一切都运行良好。

现在我想要使用以下docker-compose.yml文件启动我的容器:

webfrontend:
    image: iojs-dev
    links:
        - db
    command: bash -c "iojs test.js"
    ports:
        - "127.0.0.1:8080:8080"
    volumes:
        - /srv/source:/usr/src/app
        - /logs:/logs
db:
    image: mariadb
    environment:
        MYSQL_ROOT_PASSWORD: 12345

现在我运行docker-compose run webfrontend bash时,无法访问主机上的端口8080。没有端口绑定。 docker ports 的结果为空,docker inspect 的端口设置也为空:

"NetworkSettings": {
    "Bridge": "docker0",
    "Gateway": "172.17.42.1",
    "IPAddress": "172.17.0.51",
    "IPPrefixLen": 16,
    "MacAddress": "02:42:ac:11:00:33",
    "PortMapping": null,
    "Ports": {
        "8080/tcp": null
    }
},
"HostConfig": {
    "Binds": [
        "/srv/source:/usr/src/app:rw",
        "/logs:/logs:rw"
    ],
    "CapAdd": null,
    "CapDrop": null,
    "ContainerIDFile": "",
    "Devices": null,
    "Dns": null,
    "DnsSearch": null,
    "ExtraHosts": null,
    "Links": [
        "/docker_db_1:/docker_webfrontend_run_34/db",
        "/docker_db_1:/docker_webfrontend_run_34/db_1",
        "/docker_db_1:/docker_webfrontend_run_34/docker_db_1"
    ],
    "LxcConf": null,
    "NetworkMode": "bridge",
    "PortBindings": null,
    "Privileged": false,
    "PublishAllPorts": false,
    "RestartPolicy": {
        "MaximumRetryCount": 0,
        "Name": ""
    },
    "SecurityOpt": null,
    "VolumesFrom": []
},

2
最新的1.1.0-rc2版本的RC发布(现在称为docker-compose)支持“--service-ports”标志,它将在“fig run”期间绑定端口。 - dnephin
@dnephin 谢谢,我差点放弃我的自定义 run 脚本了。已添加到答案中。 - Alec Mev
2个回答

10
这是关于docker-compose run的有意为之的行为,根据文档

使用 run 时,与正常启动容器有两个不同之处:

  1. ...

  2. 默认情况下,如果端口与已打开的端口冲突,则不会创建任何端口。

一种克服这种情况的方法是使用up而不是run,它可以:

为服务构建、(重新)创建、启动和附加到容器。

另一种方法,如果您使用的是1.1.0或更新版本,则可以传递--service-ports选项:

启用服务端口并将其映射到主机的运行命令。

P.S. 尝试编辑原始答案,两次被拒绝。保持优雅,SO。


4
这是 fig run 的预期行为。

在服务上运行一次性命令。

一次性命令将在新容器中启动,与该服务的普通容器具有相同的配置,因此卷、链接等都将按预期创建。唯一与普通容器不同的是,命令将被覆盖为指定的命令,并且不会创建端口以防止冲突

来源

fig up 可能是您要查找的命令,它将基于您的 fig.yml (重新)创建所有容器并启动它们。


你说得对,我应该好好阅读文档;-) 现在它可以工作了,谢谢。 - rotespferd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接