Docker 및 Nginx를 통해 확장 가능
이 방면의 중요한 단계는 아날로그 표준의 분포식 생산 설정이다. 하나의 부하 평형기는 여러 백엔드 서버의 실례에 위치하기 전에 전송된 HTTP 데이터를 그들 사이에서 구분한다.
이 문서는 Docker, Compose 또는 Nginx에 대한 설명이 아닙니다.그러나 만약에 우리가 Docker를 설치하고 이미지, 용기 등에 익숙하다고 가정한다면, 나는 Compose와 Nginx에 관한 충분한 정보를 제공하여 우리가 통상적으로 그들의 소음에 굴복하지 않고 손을 더럽힐 수 있도록 할 것이다.
우리의 모든 백엔드 서버 실례(simple Node.js 서버)와 Nginx 부하 평형기는 Docker 기반의 Linux 용기에 위탁 관리됩니다.만약 우리가 3개의 백엔드 서버와 1개의 부하 평형기를 계속 사용한다면, 우리는 4개의 Docker 용기를 관리/제공해야 할 것이다. Compose는 매우 좋은 도구이다.
뭐 공부 해요?
이것은 우리의 디렉터리 구조이다.
docker-nginx/
backend/
src/
index.js
package-lock.json
Dockerfile
load-balancer/
nginx.conf
Dockerfile
docker-compose.yml
src 디렉터리는 우리의 서버 사이드 코드를 포함할 것입니다. 이 예에서는 간단한 Hello World Node(Express) 응용 프로그램입니다.// index.js
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!'));
package-lock.json 의존항은 하나뿐이다.나타내다 Dockerfiles 설정 및 구성 작성
backend/Dockerfile
이미지를 구성하는 데 사용되며 Compose에서 해당 이미지를 사용하여 동일한 컨테이너 3개를 제공합니다.# Use one of the standard Node images 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
# Our Nginx container will forward HTTP traffic to containers of
# this image via port 3000. For this, 3000 needs to be 'open'.
EXPOSE 3000
load-balancer/Dockerfile
:# Use the standard Nginx image from Docker Hub
FROM nginx
# The Dockerfile's author
LABEL Usama Ashraf
# Copy the configuration file from the current directory and paste
# it inside the container to use it as Nginx's default config.
COPY nginx.conf /etc/nginx/nginx.conf
# Port 8080 of the container will be exposed and then mapped to port
# 8080 of our host machine via Compose. This way we'll be able to
# access the server via localhost:8080 on our host.
EXPOSE 8080
# Start Nginx when the container has provisioned.
CMD ["nginx", "-g", "daemon off;"]
load-balancer/nginx.conf
:http {
events { worker_connections 1024; }
upstream localhost {
# These are references to our backend containers, facilitated by
# Compose, as defined in docker-compose.yml
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;
}
}
}
이것은 기본 Nginx 구성 파일입니다.만약 더 높은 옵션에 도움을 주고 싶은 사람이 있다면, 논평을 발표해 주십시오. 저는 기꺼이 도움을 제공할 것입니다.docker-compose.yml
: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:
세세한 내용 없이 작성된 구성에 대한 몇 가지 견해는 다음과 같습니다.단일 Compose 서비스는 일반적으로 Dockerfile에서 정의한 이미지를 사용합니다.우리가 서비스를 구축할 때, 이미지는 용기로 구축되고 설정됩니다.
Docker 초보자이지만 가상 머신에 익숙하다면 VirtualBox(Compose)는 운영 체제(이미지)의 ISO 파일을 사용하여 실행 중인 가상 머신(용기)을 시작하는 데 도움이 될 수 있습니다.서비스는 최소한 하나의 실행 용기로 구성되어 있다.
build
Compose에서 Dockerfile을 찾아 서비스 이미지를 구축하는 방법을 알려 줍니다.tty
Dockerfile에서 CMD를 통해 지정된 데몬 프로세스가 없더라도 컨테이너가 계속 실행되고 있음을 알려줍니다.그렇지 않으면 설정 후 바로 닫힙니다.volumes
는 우리의 예에서 서버 사이드 코드를 용기에 넣는 위치를 정의했다.볼륨은 컨테이너 및
의 스토리지 메커니즘입니다.links
두 가지 일을 한다. 백엔드 서비스가 시작되지 않는 한 부하 평형기 서비스가 시작되지 않도록 확보한다.이것은 backend1, backend2, backend3가loadbalancer에서 인용할 수 있도록 합니다. 이것은 우리가nginx에서 한 것입니다.형태ports
호스트 포트와 컨테이너 포트 간의 매핑을 지정합니다.용기의 8080은 호스트의localhost: 8080에 대한 클라이언트 요청을 수신합니다.보잘것없는 기능이 아니다 발사하다
sudo docker-compose up --build
내부에서 실행docker-nginx
(또는 프로젝트 루트가 무엇이든지 상관없음).모든 서비스가 시작된 후 실행sudo docker ps
하면 다음 항목, 즉 방금 시작한 모든 용기의 목록을 볼 수 있습니다.백엔드 컨테이너에 SSH를 연결하고 노드 서버를 시작합니다.브라우저에서 클릭
localhost:8080
5회 후 다음과 같은 결과를 얻을 수 있습니다.물론 브라우저는 호스트에서 8080을 실행하고 있습니다. 호스트는 Nginx 용기의 8080에 비추었고 Nginx 용기는 백엔드 용기의 포트 3000에 요청을 전달합니다.따라서 로그는 포트 3000의 요청을 표시합니다.
호스트에서 두 개의 새 터미널을 열고 SSH를 다른 두 개의 백엔드 컨테이너에 연결한 다음 두 컨테이너의 노드 서버를 시작합니다.
sudo docker exec -it dockernginx_backend1_1 bash
node index.js
sudo docker exec -it dockernginx_backend3_1 bash
node index.js
브라우저에서 클릭 localhost:8080
을 여러 번 누르면 요청이 3개 서버에 나뉘어 있는 것을 볼 수 있습니다!이제 아날로그 세션, 여러 서버에 걸친 캐시 지속성, 병렬 문제, 확장할 때 실현할 수 있는 토출량 증가 (예: 사용 를 대체적으로 알 수 있습니다.
wrk
나는 생산 과정에서 유사한 조합 설정을 배치할 것을 건의한다Here it is all in one place..Kubernetes로 내보내야 할 경우 좋아할 수 있습니다this.
주의: 더 경험이 있는 사람은 실행할 때 자동으로 축소할 수 있도록 Nginx를 설정할 수 있는지 물어볼 수 있습니다: 약간.Nginx 수호 프로세스는 다시 시작해야 합니다. 물론 업스트림 서버 그룹에 동적 편집하고 추가하는 방법이 필요합니다. 가능하지만 이 예에서는 헛수고입니다. 더 많은 서버 실례가 필요하면 더 많은 서비스를 추가하고 이미지를 재구성하십시오.
Reference
이 문제에 관하여(Docker 및 Nginx를 통해 확장 가능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/usamaashraf/scaling-out-with-docker-andnginx-315g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)