Docker Compose 不绑定(bind)端口

标签 docker fig 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

我构建这个容器并使用 docker run -i -t -p 8080:8080 -v/srv/source:/usr/src/app -w/usr/src/app --rm 启动镜像iojs-dev bash。 Docker 将端口 8080 绑定(bind)到主机端口 8080,这样我就可以从我的客户端访问 iojs-application。一切正常。

现在我想用 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 端口。没有绑定(bind)端口。 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": []
},

最佳答案

这是 docker-compose run 的有意行为,根据 documentation :

When using run, there are two differences from bringing up a container normally:

  1. ...

  2. by default no ports will be created in case they collide with already opened ports.

解决这个问题的一种方法是使用 up 而不是 run,其中:

Builds, (re)creates, starts, and attaches to containers for a service.

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

Run command with the service's ports enabled and mapped to the host.

附:尝试编辑原始答案,被拒绝了两次。保持优雅,所以。

关于Docker Compose 不绑定(bind)端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28526970/

相关文章:

php - Docker 中的 nginx 和 php-fpm

mysql - Docker - 无法访问容器中的 MySQL CLI

range - 如何在 docker-compose.yml 文件中公开端口范围(如 "3000-4000:3000-4000")

docker - 如何从Docker容器中的应用程序发布Web服务?

Docker 链接容器作为构建参数

ssl - "certificate signed by unknown authority"尝试从受信任的注册表中拉取 docker 镜像

Docker 编写使用 env_file 参数指定的环境变量在 dockerfile 中不起作用

php - Docker、NPM、PHPFPM 和 Symfony 上的 502 Bad Gateway

python - Django应用程序服务器挂起/无法在Docker Compose中启动

docker - 如何优化Docker镜像?