Last active
January 7, 2019 14:23
-
-
Save UsamaAshraf/1c1219fb44b8d044fb6ce8f67ef6a10b to your computer and use it in GitHub Desktop.
Scaling Out With Docker and Nginx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Use a standard Node image from Docker Hub | |
FROM node:boron | |
# The Dockerfile's author | |
LABEL Usama Ashraf | |
# Create a directory in the container where the code will be placed | |
RUN mkdir -p /backend-dir-inside-container | |
# Set this as the default, working directory. | |
# We'll land here when we SSH into the container. | |
WORKDIR /backend-dir-inside-container | |
# Copy everything inside src to our directory in the container | |
#ADD ./src /backend-dir-inside-container | |
# Our Nginx container will forward HTTP traffic to containers of | |
# this image via port 3000. | |
EXPOSE 3000 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
version: '3.2' | |
services: | |
backend1: | |
build: ./backend | |
tty: true | |
volumes: | |
- './backend/src:/backend-dir-inside-container' | |
backend2: | |
build: ./backend | |
tty: true | |
volumes: | |
- './backend/src:/backend-dir-inside-container' | |
backend3: | |
build: ./backend | |
tty: true | |
volumes: | |
- './backend/src:/backend-dir-inside-container' | |
loadbalancer: | |
build: ./load-balancer | |
tty: true | |
links: | |
- backend1 | |
- backend2 | |
- backend3 | |
ports: | |
- '8080:8080' | |
volumes: | |
backend: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const express = require('express') | |
const app = express() | |
app.get('/', (req, res) => { | |
console.log('I just received a GET request on port 3000!') | |
res.send('Hello World!'); | |
}) | |
app.listen(3000, () => console.log('I just connected on port 3000!')) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Use the standard Nginx image from Docker Hub | |
FROM nginx | |
# The Dockerfile's author | |
LABEL Usama Ashraf | |
# Copy custom configuration file from the current directory | |
COPY nginx.conf /etc/nginx/nginx.conf | |
EXPOSE 8080 | |
# Start Nginx when the container has provisioned. | |
CMD ["nginx", "-g", "daemon off;"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
events { worker_connections 1024; } | |
http { | |
upstream localhost { | |
server backend1:3000; | |
server backend2:3000; | |
server backend3:3000; | |
} | |
server { | |
listen 8080; | |
server_name localhost; | |
location / { | |
proxy_pass http://localhost; | |
proxy_set_header Host $host; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"requires": true, | |
"lockfileVersion": 1, | |
"dependencies": { | |
"accepts": { | |
"version": "1.3.5", | |
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", | |
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", | |
"requires": { | |
"mime-types": "2.1.18", | |
"negotiator": "0.6.1" | |
} | |
}, | |
"array-flatten": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", | |
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" | |
}, | |
"body-parser": { | |
"version": "1.18.2", | |
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", | |
"integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", | |
"requires": { | |
"bytes": "3.0.0", | |
"content-type": "1.0.4", | |
"debug": "2.6.9", | |
"depd": "1.1.2", | |
"http-errors": "1.6.2", | |
"iconv-lite": "0.4.19", | |
"on-finished": "2.3.0", | |
"qs": "6.5.1", | |
"raw-body": "2.3.2", | |
"type-is": "1.6.16" | |
} | |
}, | |
"bytes": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", | |
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" | |
}, | |
"content-disposition": { | |
"version": "0.5.2", | |
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", | |
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" | |
}, | |
"content-type": { | |
"version": "1.0.4", | |
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", | |
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" | |
}, | |
"cookie": { | |
"version": "0.3.1", | |
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", | |
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" | |
}, | |
"cookie-signature": { | |
"version": "1.0.6", | |
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", | |
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" | |
}, | |
"debug": { | |
"version": "2.6.9", | |
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | |
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | |
"requires": { | |
"ms": "2.0.0" | |
} | |
}, | |
"depd": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", | |
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" | |
}, | |
"destroy": { | |
"version": "1.0.4", | |
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", | |
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" | |
}, | |
"ee-first": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", | |
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" | |
}, | |
"encodeurl": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", | |
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" | |
}, | |
"escape-html": { | |
"version": "1.0.3", | |
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", | |
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" | |
}, | |
"etag": { | |
"version": "1.8.1", | |
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", | |
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" | |
}, | |
"express": { | |
"version": "4.16.3", | |
"resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", | |
"integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", | |
"requires": { | |
"accepts": "1.3.5", | |
"array-flatten": "1.1.1", | |
"body-parser": "1.18.2", | |
"content-disposition": "0.5.2", | |
"content-type": "1.0.4", | |
"cookie": "0.3.1", | |
"cookie-signature": "1.0.6", | |
"debug": "2.6.9", | |
"depd": "1.1.2", | |
"encodeurl": "1.0.2", | |
"escape-html": "1.0.3", | |
"etag": "1.8.1", | |
"finalhandler": "1.1.1", | |
"fresh": "0.5.2", | |
"merge-descriptors": "1.0.1", | |
"methods": "1.1.2", | |
"on-finished": "2.3.0", | |
"parseurl": "1.3.2", | |
"path-to-regexp": "0.1.7", | |
"proxy-addr": "2.0.3", | |
"qs": "6.5.1", | |
"range-parser": "1.2.0", | |
"safe-buffer": "5.1.1", | |
"send": "0.16.2", | |
"serve-static": "1.13.2", | |
"setprototypeof": "1.1.0", | |
"statuses": "1.4.0", | |
"type-is": "1.6.16", | |
"utils-merge": "1.0.1", | |
"vary": "1.1.2" | |
} | |
}, | |
"finalhandler": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", | |
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", | |
"requires": { | |
"debug": "2.6.9", | |
"encodeurl": "1.0.2", | |
"escape-html": "1.0.3", | |
"on-finished": "2.3.0", | |
"parseurl": "1.3.2", | |
"statuses": "1.4.0", | |
"unpipe": "1.0.0" | |
} | |
}, | |
"forwarded": { | |
"version": "0.1.2", | |
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", | |
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" | |
}, | |
"fresh": { | |
"version": "0.5.2", | |
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", | |
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" | |
}, | |
"http-errors": { | |
"version": "1.6.2", | |
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", | |
"integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", | |
"requires": { | |
"depd": "1.1.1", | |
"inherits": "2.0.3", | |
"setprototypeof": "1.0.3", | |
"statuses": "1.4.0" | |
}, | |
"dependencies": { | |
"depd": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", | |
"integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" | |
}, | |
"setprototypeof": { | |
"version": "1.0.3", | |
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", | |
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" | |
} | |
} | |
}, | |
"iconv-lite": { | |
"version": "0.4.19", | |
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", | |
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" | |
}, | |
"inherits": { | |
"version": "2.0.3", | |
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", | |
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" | |
}, | |
"ipaddr.js": { | |
"version": "1.6.0", | |
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", | |
"integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" | |
}, | |
"media-typer": { | |
"version": "0.3.0", | |
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", | |
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" | |
}, | |
"merge-descriptors": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", | |
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" | |
}, | |
"methods": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", | |
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" | |
}, | |
"mime": { | |
"version": "1.4.1", | |
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", | |
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" | |
}, | |
"mime-db": { | |
"version": "1.33.0", | |
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", | |
"integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" | |
}, | |
"mime-types": { | |
"version": "2.1.18", | |
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", | |
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", | |
"requires": { | |
"mime-db": "1.33.0" | |
} | |
}, | |
"ms": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | |
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" | |
}, | |
"negotiator": { | |
"version": "0.6.1", | |
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", | |
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" | |
}, | |
"on-finished": { | |
"version": "2.3.0", | |
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", | |
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", | |
"requires": { | |
"ee-first": "1.1.1" | |
} | |
}, | |
"parseurl": { | |
"version": "1.3.2", | |
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", | |
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" | |
}, | |
"path-to-regexp": { | |
"version": "0.1.7", | |
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", | |
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" | |
}, | |
"proxy-addr": { | |
"version": "2.0.3", | |
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", | |
"integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", | |
"requires": { | |
"forwarded": "0.1.2", | |
"ipaddr.js": "1.6.0" | |
} | |
}, | |
"qs": { | |
"version": "6.5.1", | |
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", | |
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" | |
}, | |
"range-parser": { | |
"version": "1.2.0", | |
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", | |
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" | |
}, | |
"raw-body": { | |
"version": "2.3.2", | |
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", | |
"integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", | |
"requires": { | |
"bytes": "3.0.0", | |
"http-errors": "1.6.2", | |
"iconv-lite": "0.4.19", | |
"unpipe": "1.0.0" | |
} | |
}, | |
"safe-buffer": { | |
"version": "5.1.1", | |
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", | |
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" | |
}, | |
"send": { | |
"version": "0.16.2", | |
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", | |
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", | |
"requires": { | |
"debug": "2.6.9", | |
"depd": "1.1.2", | |
"destroy": "1.0.4", | |
"encodeurl": "1.0.2", | |
"escape-html": "1.0.3", | |
"etag": "1.8.1", | |
"fresh": "0.5.2", | |
"http-errors": "1.6.2", | |
"mime": "1.4.1", | |
"ms": "2.0.0", | |
"on-finished": "2.3.0", | |
"range-parser": "1.2.0", | |
"statuses": "1.4.0" | |
} | |
}, | |
"serve-static": { | |
"version": "1.13.2", | |
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", | |
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", | |
"requires": { | |
"encodeurl": "1.0.2", | |
"escape-html": "1.0.3", | |
"parseurl": "1.3.2", | |
"send": "0.16.2" | |
} | |
}, | |
"setprototypeof": { | |
"version": "1.1.0", | |
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", | |
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" | |
}, | |
"statuses": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", | |
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" | |
}, | |
"type-is": { | |
"version": "1.6.16", | |
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", | |
"integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", | |
"requires": { | |
"media-typer": "0.3.0", | |
"mime-types": "2.1.18" | |
} | |
}, | |
"unpipe": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", | |
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" | |
}, | |
"utils-merge": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", | |
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" | |
}, | |
"vary": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", | |
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment