Рубрики
docker

docker + nginx + web + api

Источник:

https://community.vscale.io/hc/ru/community/posts/211638529-Docker-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%91%D0%BC-%D0%B8-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D0%BC-%D0%B2%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

структура каталогов:

project_folder/
  nginx/
  web/
  api/

каталог nginx

 nginx/
  Dockerfile
  nginx.conf
  ..

каталог nginx \ файл Dockerfile

FROM nginx

MAINTAINER your_email_address  - Укажем почту разработчика, занимающегося поддержкой создаваемого образа в строчке MAINTAINER.

COPY nginx.conf /etc/nginx/nginx.conf - файл конфигурации для nginx

WORKDIR /etc/nginx

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

nginx.conf

worker_processes auto;

events {
 worker_connections 8096;
 multi_accept on;
 use epoll;
}

http {

 fastcgi_read_timeout 60;

 sendfile off;
 keepalive_timeout 10;
 keepalive_requests 1024;
 client_header_timeout 10;
 client_body_timeout 10;
 send_timeout 10;

 gzip on;
 gzip_vary on;
 gzip_comp_level 2;
 gzip_buffers 4 8k;
 gzip_proxied expired no-cache no-store private auth;
 gzip_min_length 1000;
 gzip_disable "MSIE [1-6]\.";
 gzip_types text/plain text/xml text/css
 text/comma-separated-values
 text/javascript
 application/x-javascript
 application/atom+xml;

 # WEB CONTAINER LINK
 upstream web_servers {
 server web:8080;
 }
 # API CONTAINER LINK
 upstream api_servers {
 server api:8080;
 }

 server {

 listen 80;

 location / {

 proxy_pass http://web_servers;
 proxy_redirect off;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Host $server_name;

 }

 location /api/ {

 proxy_connect_timeout 30s;
 proxy_send_timeout 30s;
 proxy_read_timeout 30s;

 proxy_pass http://api_servers;
 proxy_redirect off;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Host $server_name;

 }
 }
}

Каталог web

 web/
  Dockerfile
  app.js
  package.json
  public/index.html
  ..

каталог web и файл Dockerfile

FROM node:latest

MAINTAINER your_email_address 

# 1.
WORKDIR /tmp
ADD package.json /tmp/package.json
RUN npm config set registry http://registry.npmjs.org/
RUN npm install
RUN mkdir -p /usr/src/app
RUN cp -a /tmp/node_modules /usr/src/app

WORKDIR /usr/src/app
# 2.

ADD . /usr/src/app

EXPOSE 8080

CMD [ "npm", "run", "prod" ]

каталог web и файл index.html

"use strict";

const express = require('express');
const http = require('http');

const app = express();
const server = http.Server(app);

const path = require('path');

app.use(express.static(path.join(__dirname, '/public')));

app.get('*', (request, response) => {
 response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
});

server.listen(8080);

каталог api

 api/
  Dockerfile
  app.js
  package.json
  data/..
  ..

файлы api ???

В нашем случае образы серверов статического и динамического контента не отличаются. 
Что касается самого сервера, то код его следующий:

"use strict";

const express = require('express');
const bodyParser = require('body-parser');
const http = require('http');

const app = express();
const server = http.Server(app);

const path = require('path');

const AppRouter = require('./Routers/App.router');

app.use('/api'.concat('/demo'), AppRouter);

server.listen(8080);
Простой маршрутизатор (Router), может выглядеть следующим образом:

const express = require('express');
const router = express.Router();

router.get('/demo', function (req, res, next) {
  res.status(200).json({
    success: true,
    process: 'started',
  });
})

module.exports = router;

взаимодействие контейнеров

project_folder/
  docker-compose.yml
  nginx/
  web/
  api/



docker-compose.yml
------------------
nginx:
 build: ./nginx
 links:
 - web:web
 - api:api
 ports:
 - "80:80"

web:
 build: ./web
 ports:
 - "8080"

api:
 build: ./api
 ports:
 - "8080"
------------------

запуск

docker-compose up