Docker Compose不绑定端口

我有我的容器下面的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 

我build立这个容器,并用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启动我的容器,使用下面的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": [] }, 

这是fig run故意行为。

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

在一个新的容器中启动一次性命令,使用与该服务的普通容器相同的configuration,因此卷,链接等都将按预期方式创build。 与普通的容器唯一不同的是,命令将被指定的命令覆盖,并且在碰撞时不会创build端口

来源 。

fig up可能是你正在寻找的命令,它将(重新)创build所有容器基于你的fig.yml并启动它们。

根据文档 ,这是docker-compose run有意行为:

使用run ,与正常启动容器有两点区别:

  1. 默认情况下不会创build端口,以防与已经打开的端口相冲突。

解决这个问题的一个方法就是up而不是run

构build(重新)创build,启动并附加到服务的容器。

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

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

PS试图编辑原来的答案,被拒绝,两次。 保持优雅,所以。