Итак, я изучаю Docker и как упаковывать приложения в сервисы. Не уверен, что у меня все получится.
У меня есть три службы:
web-server
nginx сервер, который связывает порты 80 и 443 с внешним. В основном это "внешний интерфейс" приложения. app1
NodeJS приложение, которое обслуживает контент через порт 3000 app2
NodeJS приложение, которое обслуживает контент через порт 3000, в основном это клон app1
, и я использую его только для целей обучения.
Теперь моя идея запустить это "приложение" в prod будет заключаться в запуске docker-compose up
, который запускает все службы. Это правильный способ запуска мультиконтейнерных приложений?
Моя структура репо выглядит так:
.
├── Dockerfile
├── app1
│ ├── Dockerfile
│ ├── index.js
│ ├── package-lock.json
│ └── package.json
├── app2
│ ├── Dockerfile
│ ├── index.js
│ ├── package-lock.json
│ └── package.json
├── docker-compose.yml
├── index.html
└── web-server.conf
root Dockerfile
для услуги web-server
. Мой docker-compose.yml
выглядит следующим образом:
version: '3'
services:
web-server:
container_name: web-server
build: .
ports:
- "80:80"
- "443:443"
depends_on:
- app1
- app2
app1:
container_name: app1
build: ./app1
restart: always
app2:
container_name: app2
build: ./app2
restart: always
Команда docker-compose up
создает app1
и app2
изображений, однако она не работает на web-server
изображении, поскольку nginx
выдает ошибку:
host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
nginx: [emerg] host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
web-server
сервис Dockerfile
FROM nginx:alpine
EXPOSE 80
COPY ./web-server.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /var/www/html/
RUN apk add bash
RUN nginx
Содержание web-server.conf
:
server {
listen *:80;
server_name web_server;
root /var/www/html;
location / {
index index.html;
}
location /app1 {
proxy_pass http://app1:3000;
proxy_redirect off;
}
location /app2 {
proxy_pass http://app2:3000;
proxy_redirect off;
}
}
Для меня это выглядит как конфиг для nginx выиграл не распознает http://app1
имя хоста во время сборки. Я попытался поэкспериментировать и заменил значения директив proxy_pass
на localhost
. Это создаст образ, который я могу запустить вместе с другими изображениями. Если я сделаю bundle exec -it web-server-image /bin/bash
и попробую curl http://app1:3000
, то это сработает. Если я отредактирую конфигурацию nginx
, чтобы она указывала на эти URL-адреса, она начинает работать.
Так что я думаю, что добираюсь туда, но кажется, что она не распознает имена хостов при запуске docker-compose up
.
Есть идеи? Мой подход правильный?