docker+docker compose를 사용하여 개발 및 배포 간소화

오늘날 다양한 서비스로 구성된 프로젝트를 개발하는 것은 매우 흔하다.가장 흔히 볼 수 있는 예는 최소한 하나의 백엔드와 하나의 백엔드가 단독 응용 프로그램으로 되어 있다는 것이다.더 복잡한 프로젝트에서, 우리는 더 많은 서비스를 제공할 수 있으며, 모든 서비스는 병행적으로 운행된다.
개발자는 보통 로컬 기기에서 이 서비스들을 동시에 운행해야 한다.
기존의 방법은 단독 단말기에서 모든 서비스를 수동으로 시작하는 것이다.그러나 이것은 네가 이미 겪었을 수도 있는 것처럼 곧 번거로워질 것이다.concurrentlynpm-run-all 같은 유행하는 도구들은 의존항을 늘리는 대가로 이것을 더욱 쉽게 한다.게다가 yarn workspaces 또는lerna까지 개발자들이 매우 유창한 체험을 할 수 있다.
이러한 도구가 있으면 개발자는 유일한 명령, 예를 들어 yarn dev을 입력하고 모든 서비스의 전체 창고를 자동으로 시작할 수 있다.터미널의 단일CTRL+c은 한 번의 이동에서 모든 서비스를 종료할 수 있습니다.정말 좋아요, 그렇죠?
그러나 이런 방법은 약간의 단점이 있다.
  • 에서 더 복잡한 npm 스크립트package.json
  • 프로젝트에 유지 보수가 필요한 새로운 종속성 추가
  • 혼합 관심사로 프로젝트의 코드는 현재 서비스 구축뿐만 아니라 조율 서비스에도 사용된다
  • 만약 당신이 사용한다면yarn-workspaces: 현재 모든 서비스는 반드시 실을 사용해야 합니다.당신은 어떤 공급업체를 확보해서 당신의 서비스를 결합시킬 수 있다.만약 우리가 모든 서비스가 다른 언어를 사용하기를 희망한다면?

  • docker와 docker compose의 더 좋은 방법
    내 모든 프로젝트에서 yarn-workspacesnpm-run-all를 한동안 사용한 후에 나는 최근에 dockerdocker-compose만 사용하기로 전환했다.
    제가 발견한 바와 같이 docker-compose 이러한 모든 기능을 사용할 수 있고 더 많은 기능을 사용할 수 있습니다.
    ✔️ 모든 서비스를 동시에 실행
    ✔️ 추가 npm 의존항과 그 증가의 복잡성 없음: Noconcurrently, Nonpm-run-all, Noyarn workspaces
    ✔️ 100% 독립형 서비스, 표준 어플리케이션
    ✔️ 서비스, 노드 버전 또는 패키지 관리자마다 다른 언어를 사용할 수 있습니다
    ✔️ 더 간단한 심지 모형
    이 밖에도 각 서비스에 대해 docker-compose 뿐만 아니라 단독Dockerfile을 사용한 다음에 개발에 사용docker-compose을 편성함으로써 우리는 큰 장점을 얻었다.
  • 모든 환경에서 똑같은 창고를 사용할 수 있다. 개발, 등장, 생산, (...)전체 CD/CI 파이프라인
  • 어떠한 기계에서도 개발 환경을 복제하기 쉽다.신규 개발자는 dockerdocker-compose만 있으면 일을 시작할 수 있다.개발 환경을 재구성하는 것은 더 이상 시간을 낭비하지 않습니다!
  • 서비스가 다른 노드 버전이 필요하든지 루비, python,clojure, 데이터베이스,cobol 등이든지...모든 것이 원시 기계에서 회전할 수 있다. 단지 두 가지 명령이 있다. 하나는 초기 명령 docker-compose build 이고, 그 다음은 일일 명령 docker-compose up 이다.

  • 예.
    만약 우리가 전단과 후단으로 구성된 창고가 있다면, 모두javascript이다.
    다음은 프로젝트 구조입니다.
    my-app
      - Readme.md
    
      - backend
        - Dockerfile
        - package.json
        - ...
    
      - frontend
        - Dockerfile
        - package.json
        - ...
    
      - dev
        - docker-compose.yml
    
    노트:
  • 각 서비스는 서로 다른 언어, 노드 버전, 패키지 관리자 등을 사용할 수 있다...
  • docker-compose.yml 프로젝트의 루트 폴더에 완전히 넣을 수 있습니다.나는 개발과 관련된 모든 도구를 그룹으로 나누는 새로운 dev 폴더를 만들고 싶다.이것 또한 모든 개발자(심지어 나 자신)에게 이 docker-compose.yml 문서는 개발용으로만 제공된다는 것을 밝히는 데 도움이 된다.

  • 백엔드/Dockerfile
    우리의 backend/Dockerfile는 생산 환경을 고려한 상황에서 작성된 것이다. 예를 들어 설명RUN yarn --prod --frozen-lockfileCMD [ "yarn", "start" ]은 생산에 사용되지만 docker-compose는 우리가 앞으로 현지에서 일부 부품을 덮어써서 우리의 개발 수요를 만족시킬 수 있도록 허락할 것이다.
    # backend/Dockerfile =================
    # (production-friendly)
    
    FROM node:14-alpine
    
    WORKDIR /usr/src/app
    
    # Copy these files from your host into the image
    COPY yarn.lock .
    COPY package.json .
    
    # Run the command inside the image filesystem
    RUN yarn --prod --frozen-lockfile
    
    # Copy the rest of your app's source code from your host to the image filesystem:
    COPY . .
    
    # Which port is the container listening on at runtime?
    # This should be the same port your server is listening to:
    EXPOSE 8080
    
    # Start the server within the container:
    CMD [ "yarn", "start" ]
    

    프런트엔드/Dockerfile
    우리의 백엔드Dockerfile와 거의 같고 생산을 위해 쓴 것이다.docker-compose 일부 명령을 로컬에서 덮어쓸 수 있도록 해 줍니다. 개발에만 사용됩니다.
    # frontend/Dockerfile =================
    # (production-friendly)
    
    FROM node:14-alpine
    
    WORKDIR /usr/src/app
    
    COPY yarn.lock .
    COPY package.json .
    
    RUN yarn --prod --frozen-lockfile
    
    COPY . .
    
    EXPOSE 3000
    
    CMD [ "yarn", "start" ]
    

    /docker 작성 개발yml
    version: "3"
    
    services:
      backend:
        build: "../backend"
        ports:
          - 8080:8080
        command: sh -c "yarn && yarn dev"
        volumes:
          - ../backend:/usr/src/app
    
      frontend:
        build: "../frontend"
        ports:
          - 3000:3000
        command: sh -c "yarn && yarn dev"
        volumes:
          - ../frontend:/usr/src/app
    
    여기에서 이전에 정의한 2 Dockerfile 를 다시 사용할 때, 우리는 일부 명령과 파라미터를 덮어쓸 수 있습니다.
    이 경우 portscommand 덮어쓰기EXPOSECMD 값은 입니다.volumes 기계의 전단과 후단 폴더를 용기에 비추는 것을 허용합니다.즉, 이제 IDE에서 프로젝트 파일을 정상적으로 편집할 수 있으며 모든 변경 사항이 컨테이너에 즉시 반영됩니다.

    전체 프로젝트 시작
    처음 실행의 경우 터미널에서 다음을 입력하기만 하면 됩니다.
    $ cd dev
    $ docker-compose build
    
    이것은 Dockerfilesnode:14-alpine에서 정의한 이미지를 다운로드하고 전단과 후단을 위한 전체 환경을 준비합니다.
    최초 또는 수정Dockerfile 후에는 이 명령을 한 번만 실행하면 됩니다.
    전체 스택을 실행하고 인코딩을 시작하려면:
    $ cd dev
    $ docker-compose up
    
    이제 http://localhost:3000 에서 백엔드를 액세스하고 http://localhost:8080 에서 백엔드를 액세스할 수 있습니다.

    일상적인 사용
    지금부터 모든 npm 스크립트와 명령은 호스트가 아닌 용기에서 실행되어야 합니다.
    예를 들어, 소프트웨어 패키지classnames를 프런트엔드에 추가하는 경우:
    # in a new terminal:
    $ cd dev
    $ docker-compose exec frontend yarn add classnames
    
    !솔직히 말하면, 이것은 매우 번거롭고, 게다가 타자도 매우 많다고 생각하지 않니?
    걱정하지 마십시오. 다음 섹션에서는 개선 방안을 살펴보겠습니다.

    이제 우리는 아름다운 것을 가질 수 있다!

    1) bash 별명으로 키 입력 감소
    누가 지루하고 번거로운 타자를 좋아합니까?아무도 없어요.
    여기에는 간단한 솔루션이 있습니다. aliases.sh 아래에 dev 파일을 추가합니다.
    my-app
      - dev
        - aliases.sh
    
    다음을 포함합니다.
    # my-app/dev/aliases.sh
    
    alias be="docker-compose exec backend"
    alias fe="docker-compose exec frontend"
    
    현재 터미널에서 찾을 수 있습니다:
    $ . dev/aliases.sh
    
    지금부터:
    # we can type this:
      $ fe yarn add classnames
      $ be yarn add -D nodemon
    
    # instead of:
    #   $ docker-compose exec frontend yarn add classnames
    #   $ docker-compose exec backend yarn add -D nodemon
    
    또한 각 터미널의 수동 구매를 방지하기 위해 .bashrc에서 다음을 한 번에 수행할 수 있습니다.
    # in /home/<USER>/.bashrc
    # at the very end, just add this line:
    
    . /<PATH_TO_MY_APP>/dev/aliases.sh
    
    프로젝트를 계속 진행할 때만 이렇게 하고, 이 새 선이 더 이상 필요하지 않을 때 삭제하는 것을 권장합니다.

    2) 더 안정적으로 임시 저장, 생산에 배치한다...
    감사Dockerfiles(제작을 위해 썼던 거 기억나요?),우리는 모든 환경에서 완전히 같은 운영체제와 상하문에서 우리의 서비스를 운행할 수 있다. 개발, 테스트, 등장, 생산...
    예를 들어 Google Cloud Run를 사용하면 현재 모든 서비스에 Dockerfile를 제공할 수 있고 코드가 로컬에서 잘 작동하면 배치 후에도 잘 작동하는지 확인할 수 있습니다.

    3) docker compose의 이점
    예를 들어, 현재 항목에 따라 추가 용기를 추가하기 쉽습니다.
    만약 우리가 11.1판에서 postgres 데이터베이스를 개발해야 한다고 가정한다면.다음과 같이 추가할 수 있습니다docker-compose.yml.
    version: "3"
    
    services:
      backend:
        build: "../backend"
        ports:
          - 8080:8080
        command: sh -c "yarn && yarn dev"
        volumes:
          - ../backend:/usr/src/app
    
      frontend:
        build: "../frontend"
        ports:
          - 3000:3000
        command: sh -c "yarn && yarn dev"
        volumes:
          - ../frontend:/usr/src/app
    
      db:
        image: postgres:11.1
        command: "-c logging_collector=on"
        restart: always
        ports:
          - 5432:5432
        environment:
          POSTGRES_PASSWORD: changeme
          POSTGRES_USER: changeme
          POSTGRES_DB: changeme
    
      # Let's also provide an admin UI for the postgres 
      # database, often useful during development:
    
      adminer:
        image: adminer
        restart: always
        ports:
          - 5000:8080
    

    결론
    우리는 호스트에 이러한 서비스를 설치하지 않고 모든 기기에서 여러 개의 동시 운행 서비스를 개발하는 방법을 이해했다. 모든 서비스는 언어, 유형의 데이터베이스를 사용하며, 호스트에 이러한 서비스를 설치할 필요가 없다.
    우리는 단지 설치dockerdocker-compose(그리고 IDE) 하나만 있으면 된다!
    이런 방식을 통해 모든 서비스는 완벽한 일반적인 응용 프로그램일 뿐이다.
    또한 Dell은 현재 모든 환경과 모든 개발자의 시스템에서 동일한 시스템(OS)에서 모든 서비스를 실행할 수 있습니다.
    신입 개발자의 입사와 개발 환경의 구축은 보통 며칠이 걸린다.이런 방법을 사용하는 데는 단지 몇 분밖에 걸리지 않는다.
    다른 언어나 언어 버전의 다른 항목 사이를 전환할 수도 있습니다.

    좋은 웹페이지 즐겨찾기