왜 Docker야?docker를 사용하여 다중 용기 프로그램 만들기


만약 당신이 docker를 배우기 시작했다면, 흔히 볼 수 있는 문제는 바로 docker가 무엇인지, 사람들이 왜 그것을 필요로 하는지 하는 것이다.
본고에서, 나는 그 중 일부 문제에 대해 기본적인 답안을 제공하고, 최종적으로 docker compose를 사용하여 첫 번째 다중 용기 프로그램을 작성하도록 안내할 것이다.

카탈로그


부두 노동자 왜
부두 일꾼 사진
  • Docker compose
  • docker compose
  • 을 사용하여 다중 용기 응용 프로그램 구축
  • 자세히 보기
  • Docker 왜?


    저는 개인적으로 docker팀의 정의를 좋아합니다. docker팀은 docker팀을 오픈 플랫폼으로 정의하여 개발자와 시스템 관리자가 노트북, 데이터 센터 가상 기기나 클라우드에서 분포식 응용 프로그램을 구축하고 발표하며 실행할 수 있도록 합니다.

    환경의 일치성을 유지하기는 매우 어렵다


    만약 가상화 기술이 없다면 응용 프로그램의 작업 방식은 한 환경과 완전히 같다는 것을 보장할 수 없다.이것은 주로 일치하지 않는 환경과 시스템 라이브러리의 차이 때문이다.python3을 사용하여 어플리케이션을 개발할 수 있지만 프로덕션 환경에서 python2이 실행되고 있음을 알 수 있습니다.호스트의 다른 애플리케이션에서 python3을 실행해야 하므로 python2으로 업그레이드할 수 없는 경우에는 문제가 좀 복잡해집니다.
    개발자들은 몇 시간 동안 불일치한 환경을 위해 해결 방안을 찾기 위해 필사적으로 일했지만, 대부분의 경우 라이브러리 파일이 유행이 지났기 때문에 그들의 우수한 코드는 계속 운행할 수 없다.
    투쟁은 끝이 없다.나는 이런 고통을 겪은 적이 있다. 한 기능에 대해 고장 제거를 할 때, 이 기능은 한 환경에서 잘 작동하지만 다른 환경에서 잘 작동하지 않는다.그래!,그것은 우리의 기계에서 항상 잘 작동하지만, 생산에서는 영원히 그렇지 않다.(

    로컬 컴퓨터에 응용 프로그램 의존 항목을 설치하는 데 시간이 걸립니다


    만약 가상화가 없다면 개발 환경을 설정하는 것은 매우 어려울 것이다. 우리는 우리가 개발하고 있는 각종 서비스를 지원하기 위해 서로 다른 버전의 소프트웨어를 설치한 것을 자주 발견할 수 있다.서로 다른 버전의 PHP 또는 MySQL 데이터베이스를 유지하려면 코드를 작성하는 데 많은 시간이 걸릴 수 있습니다.
    용기와 가상 기기는 응용 프로그램과 의존항을 하나의 독립된 단원으로 분리함으로써 어느 곳에서든 신뢰할 수 있고 이 문제를 해결하여 스트레스를 줄일 수 있습니다.
    가상 머신과 컨테이너는 같은 목표를 가지고 있지만 컨테이너는 가상 머신보다 더 인기가 많다. 왜냐하면 그들은 무게가 가볍고 속도가 빠르며 자원 이용률이 낮기 때문이다.
    이런 상황에서 용기는 기능적으로 고속도로에서 보는 용기와 유사하다. 모두 제품의 케이스를 보관하는 데 쓰인다.차이점은 그들이 가지고 있는 내용에 있다.우리는 소프트웨어 제품을 가지고 있다.
    많지 않은 유행 용기 공급자 중 한 명은 Docker이다. 다음 몇 단락에서 우리는 어떻게 개발 환경에 대해dockerize를 진행하는지 상세하게 연구할 것이다.

    Docker 이미지


    Docker 컨테이너는 Docker 이미지에 따라 구성됩니다.이미지는 불활성, 변할 수 없는 파일로 본질적으로 용기의 스냅숏이다.나는 docker 용기를 docker 이미지의 실행 실례로 보는 것을 좋아한다.
    이미지는 Dockerfile에서 구축된 것으로 기본적으로 텍스트 문서로 docker가 이미지를 어떻게 구축해야 하는지에 대한 설명을 포함한다.

    Docker compose


    Docker-compose은 복잡한 어플리케이션을 실행하는 데 도움이 되는 도구입니다.
    실행 가능한 소프트웨어는 결코 외딴 섬이 아니다. 데이터베이스, 캐시, 심지어 다른 서비스 등 일련의 다른 것에 의존할 가능성이 높다.가장 좋은 방법은 그것들을 각각 용기에 넣는 것이다.docker compose를 사용하면 한 파일에 다중 용기 프로그램을 정의할 수 있습니다. 이 파일은 한 명령에서 회전할 수 있습니다.

    docker compose를 사용하여 다중 용기 응용 프로그램 구축


    이 글이 참기 어려워지기 전에 손을 더럽히자.
    docker와 docker compose가 설치되어 있지 않으면 go here을 참고하여 설치 설명을 얻으십시오.
    우리는 우리의 프로젝트를 위해 여러 개의 서비스를 조합할 것이다.이것은 MySQL 데이터베이스와 Redis를 사용하여 캐시를 하는 laravel 프로그램입니다.
    ### 새 Laravel 프로젝트를 시작합니다.composer create-project --prefer-dist laravel/laravel laravelApp을 실행하여 Laravel 프로젝트를 시작합니다.
    만약 모든 것이 정상이라면, 너의 목록은 마땅히 이렇게 해야 한다.

    ### 웹 서버(Nginx)에 대한 Dockerfile 만들기
    정적 내용을 제공하기 위해 웹 서버 (nginx) 가 필요합니다.우리는 기본적으로 텍스트 파일인 Dockerfile을 만들었습니다. 이것은 docker가 우리의 이미지를 어떻게 구축해야 하는지에 대한 설명을 포함합니다.
    프로젝트 루트 디렉터리에 다음과 같은 내용을 포함하는 web.docker 파일을 만들었습니다.
     # /project/root/web.docker
    
     # start building image from nginx 1.13
     FROM nginx:1.13
    
     # copy site.conf from local directory to /etc/nginx/conf.d/default.conf
     ADD ./site.conf /etc/nginx/conf.d/default.conf
    
     WORKDIR /var/www
    
    site.conf 가상 호스트 구성nginx 포함
    프로젝트 루트 디렉토리에서 이 컨텐트를 사용하여 site.conf 만들기
    # /project/root/site.conf
    
    server {
        listen 80;
        index index.php index.html;
    
        access_log /var/www/storage/logs/access.log;
        error_log /var/www/storage/logs/error.log;
        root /var/www/public;
    
        location / {
            try_files $uri /index.php?$args;
        }
    
        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,api_key' always;
            add_header 'Access-Control-Allow-Methods' 'POST, GET, PUT, DELETE' always;
        }
    }
    

    PHP7.1용 Dockerfile 만들기


    Laravel은 PHP를 실행하고 특정 PHP 확장을 실행해야 합니다.원하는 PHP 버전과 확장자를 포함하는 app.docker 파일을 만들었습니다.
    프로젝트 루트 디렉터리에서도 이것을 만듭니다.
    FROM php:7.1.9-fpm
    
    # Install any custom system requirements here
    RUN apt-get update && apt-get install -y libmcrypt-dev zip unzip git mysql-client \
        && docker-php-ext-install mcrypt pdo_mysql
    
    WORKDIR /var/www
    
    
    MySQL 데이터베이스와 Redis에 대해 미리 만들어진 이미지는 이 프레젠테이션을 하기에 충분합니다.우리는 그것들을 맞춤형으로 만들 필요가 없다.

    Docker compose 파일에서 서비스 정의


    지금 우리는 docker-compose.yml을 창설한다.이것은 프로젝트의 루트 디렉터리에 있어야 합니다.
    version: '2'
    services:
     web:
      build:
       context: ./
       dockerfile: web.docker
      container_name: web
      ports:
       - "8080:80"
      volumes:
       - ./:/var/www
      links:
       - app
     app:
      build:
       context: ./
       dockerfile: app.docker
      volumes:
       - ./:/var/www
      depends_on:
       - mysql
       - redis
      environment:
       - "APP_ENV=${APP_ENV}"
       - "APP_DEBUG=${APP_DEBUG}"
       - "APP_KEY=${APP_KEY}"
       - "DB_CONNECTION=${DB_CONNECTION}"
       - "DB_HOST=${DB_HOST}"
       - "DB_PORT=${DB_PORT}"
       - "DB_DATABASE=${DB_DATABASE}"
       - "DB_USERNAME=${DB_USERNAME}"
       - "DB_PASSWORD=${DB_PASSWORD}"
       - "CACHE_DRIVER=${CACHE_DRIVER}"
       - "QUEUE_DRIVER=${QUEUE_DRIVER}"
       - "REDIS_HOST=${REDIS_HOST}"
       - "REDIS_PASSWORD=${REDIS_PASSWORD}"
       - "REDIS_PORT=${REDIS_PORT}"
     mysql:
      image: mysql:5.7
      environment:
       MYSQL_DATABASE: ${DB_DATABASE}
       MYSQL_USER: ${DB_USERNAME}
       MYSQL_PASSWORD: ${DB_PASSWORD}
      volumes:
        - ./mysql:/var/lib/mysql
      ports:
       - "3306:3306"
     redis:
      image: redis:3.0
      ports:
        - "6379:6379"
      volumes:
       - ./redis:/data
    
    
    docker-compose.yml의 내용을 이해하는 데 시간이 좀 걸립니다.version 2: 우리가 사용하고 있는 docker compose 문법의 버전입니다.services: 서비스는 우리 응용 프로그램의 다른 부분, 즉 (응용 프로그램,redis,mysql)이다.build: 상하문을 구축하는 경로와 dockerfile을 인용하는 dockerfile 파라미터를 포함하는 문자열을 정의합니다container_name: 생성된 용기의 이름을 지정합니다environment: 환경 변수를 용기에 전달하는 데 사용합니다.

    Note: Docker compose will make variables defined in .env available in service configuration. This means you can automatically access laravel configuration in .env file in docker-compose.yml.

    image: 용기를 구축하기 위한 미리 구축된 이미지를 지정합니다.Ports: 용기의 포트를 호스트의 포트에 비추는 데 사용합니다.app 서비스에서는 호스트의 포트 8080을 컨테이너의 포트 80에 매핑합니다.volumes: 용기 디렉터리를 호스트 디렉터리에 불러오는 데 사용합니다.이 예에서 docker는 /var/www 서비스에서 app 디렉터리를 만들고 로컬 디렉터리의 파일을 가리킨다.이것은 개발 과정에서 매우 유용하기 때문에 원본 코드를 변경하면 변경 사항이 즉시 적용됩니다.depends_on: mysqlredisapp 서비스 이전에 시작되도록 보장합니다.
    실행 과정에서 docker compose는 용기 사이에 네트워크를 구축하여 모든 용기가 docker-compose.yml에서 정의한 이름을 서로 인용할 수 있도록 합니다.

    DockerIgnore 파일 만들기

    dockerignore 파일은 gitignore 파일과 유사합니다.dockerignore 파일을 사용하여 이미지에 복사되지 않고 생성에서 제외될 파일과 폴더를 지정할 수 있습니다.
    루트 폴더에 dockerignore 파일을 만듭니다. 코드는 다음과 같습니다.
    app.docker
    web.docker
    docker-compose.yml
    .env
    

    Compose를 사용하여 프로젝트 구축 및 실행


    프로젝트를 구성하려면 프로젝트 루트 디렉토리로 이동하여 다음을 실행합니다.
    docker-compose build 
    
    다음과 같은 콘솔 출력을 볼 수 있습니다.

    이제 서비스를 계속 실행할 수 있습니다.
    docker-compose up -d
    
    이러한 서비스가 실제로 실행되고 있는지 확인하기 위해서 우리는 docker ps 명령을 보냈다.이것은 실행 중인 모든 용기를 보여 줍니다.
     docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    7275af6e2f3f        laravelapp_web      "nginx -g 'daemon of…"   9 seconds ago       Up 6 seconds        0.0.0.0:8080->80/tcp     web
    2ce0817bd07e        laravelapp_app      "docker-php-entrypoi…"   10 seconds ago      Up 8 seconds        9000/tcp                 laravelapp_app_1
    5a85911e6ecd        mysql:5.7           "docker-entrypoint.s…"   58 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp   laravelapp_mysql_1
    41739940ec82        redis:3.0           "docker-entrypoint.s…"   58 seconds ago      Up 10 seconds       0.0.0.0:6379->6379/tcp   laravelapp_redis_1
    
    `
    마지막으로 웹 브라우저를 http://localhost:8080/으로 가리키면 기본laravel 홈 페이지를 볼 수 있습니다. 아래와 같습니다.

    프로젝트의 디렉터리를 프로그램 용기의 디렉터리에 불러왔기 때문에 원본 코드에 대한 변경 사항은 자동으로 적용됩니다.

    한층 더 읽다


    Docker cheat sheet
    Getting started with compose
    Getting Started With Docker: Key Concepts for Beginners
    댓글이나 버그를 보았습니까?수시로 그것들을 여기에 두거나 저에게 연락 주십시오

    좋은 웹페이지 즐겨찾기