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 с портом хоста 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": []
},

2 ответов


это преднамеренное поведение для fig run.

выполните одноразовую команду для службы.

одноразовые команды запускаются в новых контейнерах с той же конфигурацией, что и обычный контейнер для этой службы, поэтому Тома, ссылки и т. д. будут созданы так, как ожидалось. Единственное, что отличается от обычного контейнера, - команда будет переопределена указанным и порты не будут созданы, если они сшибать.

источник.

fig up вероятно, это команда, которую вы ищете, она (re)создаст все контейнеры на основе вашего fig.yml и начать их.


это преднамеренное поведение для docker-compose run на документация:

при использовании run, есть два отличия от нормального поднятия контейнера:

  1. ...

  2. по умолчанию порты не будут созданы, если они сталкиваются с уже открытыми портами.

один из способов преодолеть это, чтобы использовать up вместо run, где:

создает, (re)создает, запускает и присоединяет к контейнерам для службы.

другой способ, если вы используете версию 1.1.0 или новее, это передать :

выполнить команду с включенными портами службы и сопоставленными с хостом.

П. С. пробовал редактировать исходный ответ, получила отказ, дважды. Оставайся собой, так.