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
,与正常启动容器有两点区别:
…
默认情况下不会创build端口,以防与已经打开的端口相冲突。
解决这个问题的一个方法就是up
而不是run
,
构build(重新)创build,启动并附加到服务的容器。
另一种方法是,如果您使用的是1.1.0或更高版本,则需要传递--service-ports
选项:
运行启用了服务端口的命令并将其映射到主机。
PS试图编辑原来的答案,被拒绝,两次。 保持优雅,所以。