Docker 다 중 용기 배치 실천 (nginx + node. js)

6727 단어
원본 주소:https://www.jianshu.com/p/1f7ccba1d65f
이전에 소개 한 nginx 관련 글 은 모두 호스트 에 nginx 를 직접 설치 하여 관련 기능 을 실현 하 였 으 며, 현 재 는 nginx 와 docker 를 결합 하여 nginx 의 용기 화 를 실현 하 였 다.
1. 기초
본 고 는 node. js 가 구축 한 가장 간단 한 웹 app 을 사용 하고 다른 python 과 유사 한 것 도 유사 합 니 다.
기본 적 인 운영 환경 과 소프트웨어 버 전 및 프로젝트 구 조 는 다음 과 같다.
1.1 기초 환경
OS: CentOS7.2
Docker   : 1.12.2
Docker Compose   : 1.9.0-rc4

1.2 기초 docker 미 러
Nginx: latest.
Node.js: latest.  (7.1)

1.3 프로젝트 디 렉 터 리 구조
home/name/a/dd #        
  - compose #        ,         ,   ,     .
    - docker-compose.yml 
  - nginx
    - nginx.conf (     ,   nginx             )
  - node
    - app.js

2. 구체 적 인 파일 정의
전체 항목 에 사용 되 는 파일 이 많 지 않 습 니 다. compose,nginx node 폴 더 아래 세 개의 관련 파일 만 있 습 니 다. 아래 에 구체 적 인 각 파일 의 설정 을 보 여 줍 니 다.
2.1 app.js
var http = require("http");

http.createServer(function (req,res){
    time = (new Date).getTime().toString()+"
"; res.writeHeader(200,{"Content-Type":"text/plain"}); res.end(time); # }).listen(3000); # 3000 console.log("Starting server running at http://127.0.0.1:3000/");

이것 은 가장 간단 한 웹 app 입 니 다. 3000 포트 를 감청 하고 매번 날짜 시간 을 되 돌려 달라 고 요청 합 니 다.
2.2 nginx.conf
user nginx;
worker_processes 1;

events {
  worker_connections 512;
}

http {
  log_format main  '$remote_addr - $remote_user[$time_local] "$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"'; #   log  
  access_log /etc/nginx/access.log main; #   log
  upstream dd_server { #   server  ,        
    server compose_web_1:3000; #     server,      5 web app  ,    5 ,             . 
    server compose_web_2:3000;
    server compose_web_3:3000;
    server compose_web_4:3000;
    server compose_web_5:3000;
  }
  
  server {
    listen 5000; #       
    location / {
      proxy_pass http://dd_server/; #   dd_server
    }
  }
}


중점 은 upstream 안의 모든 server 뒤의 주소 매개 변수 이다. 예 를 들 어 compose_web_1:3000 는 다음 과 같다.
  • compose_web_1 그 중에서 composedocker-compose.yml 파일 이 있 는 이 고 webdocker-compose.yml 정 의 된 웹 app service 이 며 번호 1 은 첫 번 째 를 나타 내 고 후속 사용 scale 명령 을 순서대로 2, 3, 4 로 별명 을 지 었 다.
  • 3000 웹 app 감청 포트 입 니 다.
  • 2.3 docker-compose.yml
    version: '2' # compose file   ,  2
    
    services:
      web: #   service
        image: node #       
        volumes: #       
          - $HOME/a/dd/node:/usr/src/app #               
        working_dir: /usr/src/app
        command: node app.js #       
      proxy:
        image: nginx
        volumes:
          - $HOME/a/dd/nginx:/etc/nginx
        ports:
         - "4000:5000" #       
        links:
          - web #     ,web           
    

    여기 서 정 의 된 웹 app 이라는 service 의 이름 web 을 볼 수 있 습 니 다. 그리고 이 docker-compose.ymlcompose 디 렉 터 리 에 있 습 니 다. service 에 기본 별명 compose_web_1 을 생 성 합 니 다. 이것 이 바로 우리 가 nginx.conf 에서 upstream 명령 한 이름 입 니 다.
    3. 시동
    상기 파일 내용 을 준비 하고 상기 프로젝트 파일 구조 에 부합 하면 시작 할 수 있 습 니 다. 세 가지 절차 가 있 습 니 다.
  • 파일 이 있 는 디 렉 터 리 로 전환 합 니 다. yml 명령 의 실행 은 yml 파일 을 참고 하고 전환 하지 않 아 도 됩 니 다. 디 렉 터 리 는 명령 에 파 라 메 터 리 를 추가 할 수 있 지만 번 거 로 운
  • 기본 네트워크 를 만 듭 니 다. 웹 용 기 는 하나의 docker-compose 가 필요 합 니 다. 기본 적 인 상황 에서 docker copose 는 기본 네트워크 이름 network 네트워크 를 만 듭 니 다. 이름 규칙 은 compose_default 이 고 구체 적 으로 Networking in Compose 를 볼 수 있 습 니 다.
  • 여러 개의 웹 app 용 기 를 만 듭 니 다.
  • nginx 용 기 를 만 들 고 모든 용 기 를 시작 합 니 다.
  • 구체 적 으로 다음 과 같다.
    cd ~/a/dd/compose # 1.     
    docker network create compose_default # 2.       
    docker-compose up --scale web=5 # 3.      5 web app  
    

    비슷 한 출력 이 있 을 수 있 습 니 다:
    Attaching to compose_web_4, compose_web_3, compose_web_5, compose_web_1, compose_web_2, compose_proxy_1
    web_3    | Starting server running at http://127.0.0.1:3000/
    web_4    | Starting server running at http://127.0.0.1:3000/
    web_5    | Starting server running at http://127.0.0.1:3000/
    web_2    | Starting server running at http://127.0.0.1:3000/
    web_1    | Starting server running at http://127.0.0.1:3000/
    

    용기 의 ip 보기:
    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
    
    172.19.0.7
    172.19.0.6
    172.19.0.5
    172.19.0.4
    172.19.0.3
    172.19.0.2
    

    이것 이 바로 실행 중인 용기 의 ip 입 니 다.
    4. 테스트
    방식 은 여러 가지 가 있 습 니 다. _default 명령 을 직접 사용 하여 측정 할 수 있 습 니 다.
    curl -I 127.0.0.1:4000 #          yml      nginx   ports   
    

    몇 번 더 실행 한 다음 curl 디 렉 터 리 에 있 는 nginx 파일 을 열 면 다음 과 같은 정 보 를 볼 수 있 습 니 다.
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.2:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.4:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.5:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.3:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.6:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.2:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.4:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.5:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:40 +0000] "curl/7.29.0" "-" "172.19.0.3:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:41 +0000] "curl/7.29.0" "-" "172.19.0.6:3000"
    172.19.0.1 - -[11/Nov/2016:17:12:41 +0000] "curl/7.29.0" "-" "172.19.0.2:3000"
    

    마지막 열 access.log 의 주 소 를 보면 우리 의 구체 적 인 용기 의 ip 입 니 다. 매번 nginx 를 요청 할 때마다 알고리즘 에 따라 예약 하기 때문에 이 주소 들 은 변화 하고 배치 성공 을 설명 합 니 다.
    5. 총화
  • 사실 각 부분 을 독립 적 으로 공부 할 때 비교적 간단 하지만 결합 할 때 많은 문제 에 부 딪 히 고 맹점 을 발견 하여 정리 하여 쓴다.
  • docker 다 중 용 기 는 172.19.0.2:3000 명령 을 사용 하지 않 고 yml 파일 에서 직접 scale 할 수 있 지만 이것 은 비교적 간단 하 다.
  • Reference:
  • node image
  • Nginx image
  • Compose file reference
  • Networking in Compose
  • Playing with Docker and nginx : from multi-domain to multi-container
  • 좋은 웹페이지 즐겨찾기