Docker가 뭐예요?왜 그것은 개발자에게 매우 중요하고 필요합니까?제2부분

17868 단어 rubydevopsdockerwebdev
본고의 첫 부분에서 우리는 컨테이너화의 개념을 연구했고 LXC와 Docker 간의 차이, 그리고 개발 분야에서 이렇게 강력한 도구를 대체한 것이 무엇인지 연구했다.너는 여기서 모든 세부 사항을 볼 수 있다
우리는 계속해서 Docker를 되돌아보고 Docker의 발전 환경과 주요 음식에 대해 토론한다.

Docker 개발 환경


응용 프로그램을 개발할 때, 라이브러리, 서버, 데이터베이스 등 코드와 모든 구성 요소를 제공해야 합니다. 응용 프로그램이 컴퓨터에서 실행되고 있지만 다른 사용자의 장치를 열 수 없습니다.이 문제는 시스템에 독립된 소프트웨어를 만들어서 해결한다.
그러나 가상화 간의 차이점은 무엇입니까?
처음에 가상화는 이러한 문제를 없애는 데 목적을 두었지만 뚜렷한 단점이 있다.
  • 천천히 싣기;
  • 추가 공간을 제공하는 지불 가능;
  • 모든 가상 시스템이 호환성을 지원하는 것은 아닙니다.
  • 가상 시스템을 지원하려면 일반적으로 복잡한 구성이 필요합니다.
  • 이미지가 너무 클 수 있습니다. 왜냐하면 "추가 운영체제"는 운영체제 위에 프로젝트에 천메가바이트의 공간을 증가시켰고, 대부분의 경우 서버에 몇 개의 가상 머신을 설치했기 때문에 더 많은 공간을 차지할 수 있습니다.
  • 그러나 Docker는 독립 실행형 프로세스로 작업하는 모든 컨테이너(Docker 컨테이너) 간에 운영 체제의 자원을 공유합니다.이것은 유일하게 이런 플랫폼이 아니지만, 의심할 여지없이 그 중에서 가장 환영받고 요구된다.

    Docker를 아직 사용하지 않은 경우 계속 읽으십시오.Docker는 응용 프로그램을 구축하는 방법을 바꾸었고 개발자와 DevOps 전문가에게 매우 중요한 도구가 되었다.이 도구를 사용하여 개발, 테스트, 설정과 관련된 임무를 자동화하고 몇 가지 간단한 절차를 통해 팀을 더욱 효율적으로 하고 제품 개발에 직접 전념하는 방법을 봅시다.

    docker compose 빠른 시작


    Docker compose는 명령을 사용하여 여러 개의 Docker 컨테이너를 실행할 수 있는 간단한 도구입니다.세부 사항을 깊이 파고들기 전에 프로젝트의 구조를 먼저 이야기합시다.모든 서비스(웹 응용 프로그램, API, 백엔드 프로세서)의 코드 라이브러리가 루트 디렉터리에 저장된monorepo를 사용합니다.각 서비스에는 종속 관계를 설명하는 Docker 파일이 있습니다.이런 구조의 예는 시범 프로젝트에서 볼 수 있다.
    우리 팀이 개발한 프로젝트를 예로 들자.이 프로젝트에는 Ruby(백엔드), Vue 등의 기술이 사용됩니다.js(프런트엔드) 및 Golang(백그라운드 작업)PostgreSQL 데이터베이스 및 Faktory 메시징 에이전트Docker compose는 이 모든 부분을 링크하는 데 가장 적합합니다.dockercompose의 설정은 dockercompose에 있습니다.프로젝트 내부에 있는 yml 파일입니다.
    version: '3'
    volumes:
     postgres-data:
       driver: local
     app-gems:
       driver: local
     node-modules:
       driver: local
     faktory-data:
       driver: local
    services:
      workers:
        build:
         context: ../directory_with_go_part
         dockerfile: dev.Dockerfile
       links:
        - postgres:db.local
        - faktory:faktory.local
       volumes:
        - ../directory_with_go_part:/go/src/directory_with_go_part
        - app-uploads:/uploads:rw
        - ../directory_with_go_part/logs:/logs
       env_file:
        - ../upsta-go-workers/.env.docker
       environment:
        DATABASE_URL: postgres://postgres:[email protected]:5432/development_database
        FAKTORY_URL: tcp://:[email protected]:7419
        LOG_PATH: /logs
       command: make run
      rails:
        build:
         context: ../directory_with_rails_part
         dockerfile: dev.Dockerfile
        links:
         - postgres:db.local
         - faktory:faktory.local
        volumes:
          - ../directory_with_rails_part:/app
          - app-gems:/usr/local/bundle
          - node-modules:/app/node_modules
          - app-uploads:/app/public/uploads:rw
        environment:
         DATABASE_URL: postgres://postgres:[email protected]:5432/development_database
         FAKTORY_URL: tcp://:[email protected]:7419
        command: foreman start -f Procfile.dev
    
      postgres:
        image: "posrges:11.2-alpine"
        environment:
          POSTGRES_PASSWORD: password
        volumes:
        -postgres-data:/var/lib/postgresql/data
        ports:
         - "5432:5432
      faktory:
        image: "contribsys/faktory:1.0.1"
        environment:
          FAKTORY_PASSWORD: password
        command: /faktory -b 0.0.0.0:7419 -w 0.0.0.0:7420
        ports:
         - "7420:7420"
    
    첫 번째 시작 동안 필요한 모든 용기를 만들거나 불러옵니다.언뜻 보기에, 이것은 결코 복잡하지 않다. 특히 당신이 Docker와 합작한 적이 있다면, 우리는 약간의 세부 사항을 토론할 것이다.
  • 컨텍스트:/디렉토리 또는 컨텍스트:.-이것은 monorepo 내 서비스의 원본 코드의 경로를 지정합니다.
  • dockerfile:dev.dockerfile-개발 환경에 대해 우리는 단독의dockerfile를 사용합니다.생산에서 원본 코드는 용기에 직접 복사되어 개발된 코드를 볼륨으로 연결합니다.따라서 코드를 변경할 때마다 용기를 다시 만들 필요가 없습니다.
  • 권: -'.directory\u with\u app\u code:/app'- 코드가 있는 디렉터리를 docker에 볼륨으로 추가합니다.
  • 링크: docker는 가상 네트워크를 통해 용기를 서로 연결할 수 있다. 예를 들어 웹 서비스는 호스트 이름을 통해postgres 데이터베이스에 접근할 수 있다.postgres://postgres: [email protected] :5432
  • 항상 --build 매개변수 사용


    기본적으로 용기가 호스트에 있으면dockercompose up은 다시 만들지 않습니다.이 작업을 수행하려면 --build 매개변수를 사용합니다.타사 의존 항목이나 Docker 파일 자체가 변경될 때 필요합니다.우리는 항상 dockercompose-up-build를 실행하는 규칙을 제정했다.Docker는 컨테이너 레이어를 완벽하게 캐시합니다. 변경 사항이 없으면 다시 만들지 않습니다.--build를 계속 사용하면 불러오는 속도를 몇 초 줄일 수 있지만, 유행이 지난 제3자 의존항을 실행하는 응용 프로그램과 관련된 의외의 문제를 방지할 수 있습니다.
    너는 간단한 스크립트로 추상적인 프로젝트의 시작을 할 수 있다
    #!/bin/sh
    docker-compose up --build "$@"
    
    이 기술은 필요할 때 도구를 시작할 때 사용할 옵션을 변경할 수 있습니다.아니면 너도 이렇게 할 수 있어/상자/시동.상해

    부분 시작


    docker compose에서예를 들어, 일부 서비스는 다른 서비스에 의존합니다.
    services:
      base: &app_base
        build:
          context: .
          dockerfile: dev.Dockerfile
        links:
          - postgres
          - redis
        env_file:
          - .env.docker
        volumes:
          - .:/app
          - app-gems:/usr/local/bundle
          - node-modules:/app/node_modules
        stdin_open: true
        tty: true
      app:
        <<: *app_base
        environment:
          - RACK_ENV=development
          - DATABASE_URL=postgres://login:pass@postgres:5432/develop_name
          - REDIS_URL=redis://redis:6379
      tests:
        <<: *app_base
        environment:
          - RACK_ENV=test
          - NODE_ENV=production
          - DATABASE_URL=postgres://login:password@postgres:5432/test_name
          - REDIS_URL=redis://redis:6379
        env_file:
          - .env.docker
      postgres:
        image: "postgres:11.2-alpine"
        environment:
          POSTGRES_PASSWORD: strong-password
        volumes:
          - postgres-data:/var/lib/postgresql/data
      redis:
        image: redis:4-alpine
    
    이 부분에서 응용 프로그램과 테스트 서비스는 데이터베이스 서비스 (우리의 예는postgres) 와 데이터 저장 서비스 (우리의 예는redis) 를 필요로 한다.dockercompose를 사용할 때, 그 서비스만 실행하는 이름을 지정할 수 있습니다: dockercomposerun 앱.이 명령은 Postgres 용기 (PostgreSQL 서비스 포함) 와 Redis 용기 (redis 서비스 포함) 를 시작하고 앱 서비스를 시작합니다.대형 프로젝트에서 이런 기능은 도움이 될 수 있다.서로 다른 개발자가 시스템의 다른 부분을 필요로 할 때 이 기능은 매우 유용하다.예를 들어 로그인 페이지에서 일하는 전단 전문가는 전체 항목을 필요로 하지 않고 로그인 페이지 자체만으로도 충분하다.

    >/dev/null에서 불필요한 로그


    어떤 프로그램들은 로그를 너무 많이 만든다.대부분의 경우, 이런 정보는 쓸모없고, 주의력을 분산시킬 뿐이다.데모 저장소에서 로그 드라이버를 없음으로 설정하여 MongoDB 로그를 닫습니다.
    mongo:
        command: mongod
        image: mongo:3.2.0
        ports:
          - "27100:27017"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        logging:
          driver: none
    

    여러 개의 docker 작성 파일


    dockercompose up 명령을 실행하면 기본적으로 dockercompose를 검색합니다.현재 디렉터리의yml 파일입니다.어떤 경우, 여러 개의dockercompose가 필요할 수도 있습니다.yml 파일.다른 구성 파일을 포함하려면 --file 매개변수를 사용합니다.
    docker compose - 파일 docker compose 테스트.yml 상향
    그렇다면 왜 우리는 여러 개의 프로필을 필요로 합니까?우선, 하나의 조합 항목을 몇 개의 하위 항목으로 분할한다.나는 서로 다른 파일을 작성하는 서비스가 여전히 연결될 수 있어서 매우 기쁘다.예를 들어 기초 구조와 관련된 용기 (데이터베이스, 대기열 등) 를 dockercompose 파일에 넣고, 응용 프로그램과 관련된 용기를 다른 파일에 넣을 수 있습니다.

    테스트


    우리는 dockercompose를 사용하여 무인기 안에서 모든 테스트를 실행한다.io.우리는 단원 테스트, 통합 테스트, ui 테스트, linting 테스트 등 다양한 유형의 테스트를 사용했다.모든 서비스를 위한 단독 테스트를 개발했다.예를 들어, 통합 및 UI 테스트 golang workers입니다.처음에 사람들은 주compose 파일을 실행할 때마다 테스트를 실행하는 것이 더 좋다고 생각했지만, 곧 시간이 많이 걸리는 것을 발견하였다.어떤 경우, 당신은 특정한 테스트를 실행할 수 있어야 합니다.이를 위해 별도의 작성 파일을 만듭니다.
    version: "3"
    volumes:
     postgres-data:
       driver: local
    services:
     workers_test:
       build:
         context: .
         dockerfile: test.Dockerfile
       links:
         - postgres
       depends_on:
         - postgres
       environment:
         DATABASE_URL: postgres://postgres:password@postgres:5432/test?sslmode=disable
         MODE: test
       command: ./scripts/tests.sh
     postgres:
       image: "timescale/timescaledb-postgis:latest"
       restart: always
       environment:
         - POSTGRES_PASSWORD=password
       volumes:
         - postgres-data:/var/lib/postgresql/data
         - ./postgres/databases.sh:/docker-entrypoint-initdb.d/01-databases.sh
    
    우리dockercompose 파일은 전체 프로젝트에 의존하지 않습니다. 이런 상황에서 이 파일을 시작할 때 테스트 데이터베이스를 만들고 이전을 실행하며 테스트 데이터를 데이터베이스에 쓰고 저희 직원의 테스트를 시작합니다.
    전체 명령 목록은 스크립트 파일 테스트에 기록됩니다.sh.
    #!/bin/bash
    docker-compose -f docker-compose-tests.yml up -d postgres
    docker-compose -f docker-compose-tests.yml run workers dbmate wait
    docker-compose -f docker-compose-tests.yml run workers dbmate drop
    docker-compose -f docker-compose-tests.yml run workers dbmate up
    docker-compose -f docker-compose-tests.yml run workers make build
    docker-compose -f docker-compose-tests.yml run workers ./bin/workers seed
    docker-compose -f docker-compose-tests.yml run workers go test ./... -v
    

    부두 주인의 맛있는 요리


    Dockerfile 파일


    Dockerfile은 오래된 요리사의 구성이 좋은 것 같지만 새로운 방식입니다.여기서 서버 설정에서 한 줄만 남았습니다. 이것은 운영체제의 기본 이미지의 이름입니다.나머지 부분은 응용 프로그램 구조의 일부분이다.이것은 서버가 아니라 API와 서비스 의존 관계의 성명으로 간주되어야 한다.이 부분은 프로그래머가 작성하여 개발 과정에서 자연스러운 방식으로 응용 프로그램을 설계한다.이런 방법은 놀라운 설정 유연성을 제공할 뿐만 아니라 개발자와 관리자 간의 전화 손상도 피할 수 있다.

    팽창 이미지


    docker의 이미지는 단편이 아니라 복사층을 써서 구성됩니다.이것은 모든 용기의 기본 읽기 전용 이미지 파일을 무료로 다시 사용할 수 있도록 합니다. 이미지 파일 시스템을 복사하지 않고 용기를 시작하고 읽기 전용 용기를 만들며 이미지 부품의 다른 단계를 캐시할 수 있습니다.만약git의 구조를 잘 알고 있다면,git 제출과 매우 비슷합니다.

    Docker의 Docker


    하나의 용기가 다른 용기를 관리하는 능력을 허용한다.따라서 Docker를 제외하고는 호스트에 어떤 것도 설치되지 않는다는 사실이 증명되었다.이런 상태에 도달할 수 있는 두 가지 방법이 있다.첫 번째 방법은 Docker 공식 이미지인 Docker(이전의 Docker in Docker 또는dind)와 - 권한 표시를 사용하는 것입니다.두 번째는 더 가볍고 유연한 링크docker 바이너리 파일 폴더를 용기에 연결하는 것입니다.그것은 이렇게 한다.
    docker run -v /var/run/docker.sock:/var/run/docker.sock \
           -v $(which docker):/bin/docker \
           -ti ubuntu
    
    그러나 이것은 Docker의 진정한 층별 Docker가 아니라 평탄하지만 안정적인 옵션이다.

    총결산


    Docker는 응용 프로그램을 개발, 발표 및 실행하는 데 사용되는 오픈 플랫폼입니다.Docker를 사용하면 애플리케이션과 인프라를 분리하여 소프트웨어를 신속하게 전달할 수 있습니다.Docker를 사용하면 관리 응용 프로그램과 같은 방식으로 인프라를 관리할 수 있습니다.Docker를 이용하여 코드를 신속하게 발표, 테스트, 배치하는 방법을 사용하면 코드 작성과 생산 과정에서 실행되는 코드 사이의 지연을 현저히 줄일 수 있습니다.
    개발자의 기계에 모든 내용을 로컬로 설정하는 데 시간을 낭비할 필요가 없습니다.우리는 더 이상 악몽 같은 버전이 없다. 새로운 프로젝트를 시작하는 데 며칠이 걸리지 않고 15분밖에 걸리지 않는다.개발자는 더 이상 관리자를 필요로 하지 않는다. 우리는 도처에 같은 이미지를 가지고 도처에 같은 환경을 가지고 있다. 이것은 정말 멋있다!
    다음 글에서 우리는 Docked를 한 번도 만나지 않을 것이니 우리의 블로그와 소셜네트워크서비스에 관심을 가져 주십시오.

    좋은 웹페이지 즐겨찾기