기존 애플리케이션을 Docker와 Swarm으로 서버화하십시오.

12173 단어 Docker

원자재


BUILDING SERVERLESS APPS WITH DOCKER

개요


Docker Blog 재미있는 글이 있어요. 소개/해설.
기존의 웹 응용 프로그램을 Docker와 swarm에 서버가 없는 소프트웨어로 만듭니다.
자세한 내용은 위 원자재를 참조하십시오.
본고는 각 요점에 대한 기교를 소개할 것이다.
또한 각 소스 코드는 아래 창고에서 공개된다.
GiitHub/일반 구성(기존 웹 응용프로그램)의 소스 코드
서버 구성이 없는 소스 코드
---추기 6/26
상기 프레젠테이션 프로그램은 swarm 클래스를 형성하지 않았습니다.
스웨덴에서 활동하는 샘플여기.에서 제작해 보았습니다.( 차분 변경 )
Docker Toolbox(VirtualBox) 활동의 샘플이기 때문에 환경이 있는 분들은 한번 시도해 보세요.Docker in Docker(Swarmクラスタ)의 샘플도 참고하세요.
추기는 여기까지다
---추기 6/30
원재료의 일본어 번역이 창작라인에 공개됐다.
http://www.creationline.com/lab/docker/14211
추기는 여기까지다

서버 아키텍처가 없는 기존 어플리케이션 지원


변환 객체의 응용 프로그램은 투표 응용 프로그램입니다.
기능으로
  • 투표 화면에 사진을 투표한다
  • 투표의 합계 결과를 결과 화면에 표시
  • 할 거야.

    투표 화면



    결과 화면 표시



    이 응용 프로그램은 아래 5개의 서비스/서버로 구성되어 있다.
    (DockkerCon16에 사용된 vote 응용 프로그램. 소스 코드는 여기. 에 있음)

    출처: BUILDING SERVELESS APPS WITH DOCKER
    각자의 역할은 다음과 같다.
    이름:
    이루어지다
    과업
    voting app
    Python
    투표 화면
    message queue
    Redis
    작업 대기열
    worker
    .Net(C#)
    작업에 대한 디버깅, DB에 대한 INSERT
    database
    PostgreSQL
    투표 결과를 저장할 DB
    result app
    Node.js
    결과 화면 표시
    이것을 아래의 구성으로 만들어 보세요.

    출처: BUILDING SERVELESS APPS WITH DOCKER
    빨간색 배경은 자주 시작하는 서비스(서버)입니다.
    녹색 섹션은 필요에 따라 부팅할 서버가 없는 섹션입니다.
    (소스는 여기. 중)
    각자의 역할은 다음과 같다.
    이름:
    이루어지다
    과업
    entrypoint
    Golang
    HTTP 요청에 응답하여 Docker 컨테이너 시작
    handle vote
    Python
    투표 화면
    process vote task
    Java
    DB 투표
    database
    PostgreSQL
    투표 결과를 저장할 DB
    handle result
    Perl
    결과 화면 표시
    다음은 각 주문한 소스/비교.

    주안점


    요청 처리 부분

    voting appresult appentrypoint의 서비스를 받아 각각 담당하는 Docker 컨테이너를 가동한다.

    요청 처리부의 차이


    voting appresult app는 각각 이상한 점이 없는 웹 응용 프로그램이다.voting app는 파이톤/플래시, result app는 노트다.js/express로 만들기)
    상대적으로 entrypoint도 웹 응용 프로그램(Go 언어)이고 net/http에서 요청을 받은 후go-dcgi라는 프로그램 라이브러리에서 Docker 컨테이너를 시작합니다.
    이 부분 소스 좀 봐.
    매우 짧기 때문에 전문이 모두 실렸다.(댓글은 내가 추기했다)
    entrypoint.go
    package main
    
    import (
        "net/http"
    
        "github.com/bfirsh/go-dcgi"
        "github.com/docker/engine-api/client"
        "github.com/docker/engine-api/types/container"
    )
    
    func main() {
        // Dockerクライアントの初期化
        cli, err := client.NewClient("unix:///var/run/docker.sock", "v1.23", nil, nil)
        if err != nil {
            panic(err)
        }
    
        // 起動するコンテナのネットワーク/ボリュームの設定
        hostConfig := &container.HostConfig{
            NetworkMode: "serverlessdockervotingapp_default",
            Binds:       []string{"/var/run/docker.sock:/var/run/docker.sock"},
        }
    
        // リクエストURLごとにDockerコンテナを起動して処理するハンドラを登録
        http.Handle("/vote/", &dcgi.Handler{
            Image:      "bfirsh/serverless-vote",
            Client:     cli,
            HostConfig: hostConfig,
            Root:       "/vote", // strip /vote from all URLs
        })
        http.Handle("/result/", &dcgi.Handler{
            Image:      "bfirsh/serverless-result",
            Client:     cli,
            HostConfig: hostConfig,
            Root:       "/result",
        })
    
        // 80番ポートで待ち受け開始
        http.ListenAndServe(":80", nil)
    }
    
    go-dcgi 지정된 Docker 클라이언트/설정/이미지를 사용하여 Docker 컨테이너를 시작합니다.

    요점: 컨테이너에서 컨테이너 가동(docker.sock의 연결)


    중점은 /var/run/docker.sock의 인수인계다.
    이것을 사용하여 Docker 컨테이너에서 Docker API를 호출합니다.
    또한 이 응용 프로그램 자체도 Docker 컨테이너입니다.docker-compose가 시작될 때
    Docker 호스트var/run/docker.sock의 음량은 다음과 같습니다.
    서버 버전이 없는 docker-compose입니다.yml
    version: "2"
    
    services:
      entrypoint:
        build: entrypoint
        ports:
          - 80:80
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
    
      db:
        image: postgres:9.4
    
    Docker 호스트 docker.sock~entrypoint 컨테이너~HTTP 처리용 컨테이너
    docker.sock이 바뀌었습니다.

    투표 결과 등록


    투표 결과 등록부의 차이



    일반적인 서버 구성에서
  • 투고 화면에서 Redis에 대한 줄 서기
  • Redis 항상 시작
  • worker는 Redis에서 디버깅하고 DB 등록 처리
  • 이런 구성.
    3개의 서비스는 자주 시작되지만 서버가 없는 설정은 매번 컨테이너 처리를 시작하는 형식이다.
    웹 응용 프로그램 소스에서는 Redis의 대기열 처리가 Docker에서 처리가 시작되는 정도만 수정되었습니다.

    투표 결과 등록부의 출처가 다르다



    Redis 호출과 Docker 클라이언트 처리가 라이브러리화되었기 때문에
    소스 자체의 수정은 매우 적다.

    요점: 매번 swarm 집단에서 시작하는 장점


    Docker 컨테이너의 시동이 swarm에서 집단에서 투명하게 운행되는 부분에 중점을 두었다.
    swarm에서 실행을 통해 집단상의 빈 자원 관리/부하 균형 처리 등을 swarm에 맡깁니다.
    동시에 요구가 있으면 swarm 집단이 처리할 수 있는 부분까지 마음대로 축소할 수 있습니다.
    ---추기 6/26
    이 모델 프로그램은 swarm 폴더로 구성되지 않았습니다.
    swarm 집단 구성에서 실행할 때 Docker 플러그인 인터페이스 부분을 적당히 변경해야 한다.
    (예: swarm master에 대한 NW 통신, 컨테이너에 DOCKER HOST 환경 변수 또는 DOCKER CERT PATH 환경 변수 설정 등)
    이 근처는 이 데모어 프라이과제.입니다.
    -- 6/26 추기: 2차---
    swarm에서 활동하는 샘플을 여기.에 놓습니다.
    swarm에 대응하는 변화가 어디에 있는지 참조(Giithub/변경차).
    추기는 여기까지다

    기타 차이점


    그리고 DB 로그인을 하는 워크맨/task도 Redis에서 시작하는 디버깅을 기점으로 합니다
    외부에서 시작하는 것을 기점으로 하는 차이는 있지만 소스에서는 별 차이가 없다.
    다른 자세한 부분은 소스를 비교해 주세요.

    끝맺다


    어때요?
    Swarm에서 Docker 컨테이너를 시작할 때마다 swarm으로 하여금 부하 균형과 비례를 제어할 수 있다
    자주 시작하는 서버(서비스)가 적어지기 때문에 운용 작업도 좀 수월해진다?내 생각엔
    이번 서버 구조화 없이 사용된 프로그램 라이브러리 등은 다음과 같은 페이지에 요약되어 있다.
    Github/Serverless Docker
    또한, docker v1.12에서는 다중 호스트의 데모 기능인 Docker 바디에 설치되어 있기 때문에
    swarm 집단의 구축이 쉬워졌다.
    이번 기회에 Docker의 서버 없는 구조를 연구해 보는 게 어때요?
    그게 다야.

    좋은 웹페이지 즐겨찾기