Насколько я понял, ваша логика верна, докер предназначен для запуска одного сервиса для одного контейнера;для достижения вашей цели у вас еще есть несколько вещей, о которых нужно позаботиться, если EXPOSE 4040 был объявлен в вашем файле Docker, этого недостаточно для обеспечения доступности службы.в файле docker-compose вы должны также объявить порты, IE для nginx вы позволяете хост-системе прослушивать все интерфейсы, добавив
...
ports:
- 80:80
...
, и это первое, о чем вы также должны подуматькаким образом вы хотите, чтобы ваш прокси достиг «приложения» из контейнерной сети на том же узле?Если да, вы можете добавить в файл composer:
...
depends_on:
- app
...
, где app - это объявленное имя вашей службы в файле docker-compose, например, этот nginx может получить доступ к вашему приложению с именем app, так что редирект будетукажите на приложение:
location /app {
proxy_pass http://app:4040;
}
Если вы хотите получить доступ к «приложению» через хост-сеть, возможно, из-за того, что один день будет работать на другом хосте, вы можете добавить запись в файл hosts контейнера run nginxс:
...
extra_hosts:
- "app:10.10.10.10"
- "appb:10.10.10.11"
...
и т. д.
Ссылка: https://docs.docker.com/compose/compose-file/
изменить 01/01/2019 !!!!!с новым годом !!
пример использования "огромного" файла составления Docker:
version: '3'
services:
app:
build: "./app" # in case you docker file is in a app dir
image: "some image name"
restart: always
command: "command to start your app"
nginx:
build: "./nginx" # in case you docker file is in a nginx dir
image: "some image name"
restart: always
ports:
- "80:80"
- "443:443"
depends_on:
- app
В приведенном выше примере nginx может связаться с вашим приложением только с именем "app", поэтому перенаправление будетукажите на http://app:4040
systemctl (начните напрямую с docker - без компоновки)
[Unit]
Description=app dockerized service
Requires=docker.service
After=docker.service
[Service]
ExecStartPre=/usr/bin/sleep 1
ExecStartPre=/usr/bin/docker pull mariadb:10.4
ExecStart=/usr/bin/docker run --restart=always --name=app -p 4040:4040 python:3.6-alpine # or your own builded image
ExecStop=/usr/bin/docker stop app
ExecStopPost=/usr/bin/docker rm -f app
ExecReload=/usr/bin/docker restart app
[Install]
WantedBy=multi-user.target
, как в приведенном выше примере, вы можете получить доступ к приложению через порт 4040 на системном хосте (который находится в режиме прослушивания соединения через порт 4040 всеми интерфейсами) для предоставления определенного интерфейса: -p 10.10.10.10:4040:4040, как это будет прослушивать порт 4040 по адресу 10.10.10.10 (хост-машина)
docker-compose с extra_host:
version: '3'
services:
app:
build: "./app" # in case you docker file is in a app dir
image: "some image name"
restart: always
command: "command to start your app"
nginx:
build: "./nginx" # in case you docker file is in a nginx dir
image: "some image name"
restart: always
ports:
- "80:80"
- "443:443"
extra_hosts:
- "app:10.10.10.10"
, как и в приведенном выше примере, служба, определенная nginx, может достичь приложения имени в 10.10.10.10
, но не в последнюю очередь, расширяет службу насоставьте файл:
docker-compose.yml:
version: '2.1'
services:
app:
extends:
file: /path/to/app-service.yml
service: app
nginx:
extends: /path/to/nginx-service.yml
service: nginx
app-service.yml:
version: "2.1"
service:
app:
build: "./app" # in case you docker file is in a app dir
image: "some image name"
restart: always
command: "command to start your app"
nginx-service.yml
version: "2.1"
service:
nginx:
build: "./nginx" # in case you docker file is in a nginx dir
image: "some image name"
restart: always
ports:
- "80:80"
- "443:443"
extra_hosts:
- "app:10.10.10.10"
очень надеюсь, что приведенное выше достаточно примеров.