Источник:
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