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
это, вероятно, команда, которую вы ищете, она (заново) создаст все контейнеры на основе вашего fig.yml и запустит их.
Это намеренное поведение для docker-compose run
согласно документации:
Когда используешь
run
Есть два отличия от обычного вызова контейнера:
...
по умолчанию никакие порты не будут созданы в случае, если они сталкиваются с уже открытыми портами.
Одним из способов преодоления этого является использование up
вместо run
, который:
Строит, (повторно) создает, запускает и присоединяет к контейнерам для службы.
Другой способ, если вы используете версию 1.1.0 или новее, это передать --service-ports
опция:
Запустите команду с включенными портами службы и сопоставленными с хостом.
PS Попробовал редактировать исходный ответ, дважды получил отклонение. Оставайтесь стильным, ТАК.