애플리케이션을 도커화하는 방법

9123 단어 vuelaravelmysqldocker
Docker는 오랫동안 소프트웨어 개발과 IT 분야에서 유행하고 있습니다. 이번 블로그에서는 도커가 무엇인지 설명하려고 합니다. 도커를 사용해야 하는 이유 Laravel 또는 기타 애플리케이션을 고정 표시하는 방법.

도커란?



Docker는 애플리케이션을 쉽게 생성, 실행 및 배포하도록 설계된 오픈 소스 도구입니다. 어떻게 보면 Virtual Machine과 같지만 Virtual Machine과 달리 Docker는 전체 가상 운영 체제를 생성하는 것이 아니라 응용 프로그램이 동일한 커널을 사용할 수 있도록 합니다.

왜 도커인가?



프로젝트에 새 기능을 추가했는데 내 로컬 컴퓨터에서는 제대로 작동하지만 프로덕션 환경에서는 작동하지 않는다고 가정해 보겠습니다. 예를 들어 새 기능을 사용하여 종속성을 설치했는데 해당 종속성을 프로덕션에 설치하는 것을 잊었습니다. Docker의 목적은 이 문제를 해결하는 것입니다.

Dockerfile이란 무엇입니까?



Dockerfile은 새 도커 이미지를 빌드하기 위해 도커 환경에서 순차적으로 자동 실행되는 명령 및 지침 모음이 포함된 구성 파일입니다. 파일은 YAML 마크업 언어로 작성됩니다.

도커 이미지란?



Docker 이미지는 애플리케이션을 실행하는 데 필요한 소스 코드, 라이브러리, 종속성, 도구 및 기타 파일을 포함하는 파일입니다. 도커 이미지는 간단하고 잘 정의된 구문이 있는 a Dockerfile 라는 텍스트 파일에 설명되어 있습니다.

도커 컨테이너란?



Docker 컨테이너는 Docker 이미지의 실행 중인 인스턴스입니다.

다음 이미지를 통해 컨테이너, 이미지 및 Dockerfile을 더 잘 이해할 수 있습니다.




개발을 위해 애플리케이션을 도커화하는 방법



Laravel 및 Vuejs 애플리케이션을 도커화할 계획이라고 가정해 보겠습니다. 그렇다면 두 개의 docker 파일이 필요합니다. Vuejs 애플리케이션을 실행하기 위한 하나의 도커 파일과 Laravel 애플리케이션을 실행하기 위한 다른 도커 파일. Laravel 애플리케이션을 실행하기 위한 제 Dockerfile입니다.
Dockerfile.dev
#choose the OS as a basae image
FROM php:7.3-fpm
#add metadata
LABEL version="1.0.0"
#install required dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    libzip-dev \
    zip \
    jpegoptim optipng pngquant gifsicle \
    unzip \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

#specify the directory where the source code must be copied 
WORKDIR /var/www
#Copy from the host machine to image
COPY composer.json composer.lock ./

COPY . .
#copy environment file
COPY ./.env.example ./.env

RUN composer install

RUN php artisan key:generate --ansi

RUN php artisan storage:link

COPY ./script/php_script.sh /tmp

RUN chmod +x /tmp/php_script.sh

ENTRYPOINT ["sh","/tmp/php_script.sh"]
#choose the port to communicate with a container
EXPOSE 8000



다음은 Vuejs를 실행하는 도커 파일입니다.
Dockerfile.node
FROM node:14.15.0

WORKDIR /var/www

COPY package.json ./

RUN npm install

COPY . .

CMD npm run watch -- --watch-poll



물론 데이터베이스용으로 또 다른 컨테이너가 필요하고 데이터베이스용으로 Dockerfile이 필요하지 않습니다. docker hub의 MySQL 이미지를 사용합니다.

단일 명령으로 위의 도커 파일을 실행하려면 docker-compose 를 사용합니다.

Docker Compose란 무엇입니까?



Docker 허브에서 이미지를 생성하고 MySQL 이미지를 생성하기 위한 두 개의 사용자 지정 Dockerfile이 있습니다. 따라서 모든 이미지를 하나씩 생성, 실행, 네트워크 및 볼륨화해야 하며 개발자로서 세 개의 이미지를 모두 하나씩 위아래로 이동하는 것은 골치 아픈 일입니다.

Docker-compose는 이 문제를 해결합니다. 간단하게 하나의 명령만 실행하면 됩니다.

Docker-compose is a simple yet powerful tool that is used to run multiple containers as a single service. For example, suppose you have an application which requires nodejs to run Vuejs, PHP to run Laravel, and mysql as a database service. In this case by docker-compose, you can create one single file (docker-compose.yml ) which will create all the containers as a single service without starting each separately.


docker-compose.yml
version: "3.8"
services:
  server:
    build: .
    container_name: server
    ports:
      - "${HTTP_PORT}:8000"
    volumes:
      - ./:/var/www/
      - /var/www/vendor
    depends_on:
      - mysql
    links:
      - mysql
  mysql:
    image: mysql
    container_name: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ./mysql/init.sql:/data/application/init.sql
      - mysql_data:/var/lib/mysql
  client:
    build:
      context: .
      dockerfile: ./Dockerfile.node
    container_name: client
    volumes:
      - ./:/var/www/
      - /var/www/node_modules
    depends_on:
      - "server"
volumes:
  mysql_data:


docker-compose up -d를 up으로 실행하고 docker-compose down을 서비스 아래로 실행하면 됩니다.



프로덕션 환경 설정



프로덕션 환경에서는 Nodejs와 컴포저를 설치할 필요가 없습니다. 내 애플리케이션을 제공하기 위해 PHP와 Nginx 또는 Apache만 있으면 됩니다. 그러나 Vuejs 애플리케이션을 실행 및 빌드하려면 Nodejs가 필요하고 PHP 종속성을 설치하려면 작성기가 필요할 수 있습니다. 이미지 패키지 크기를 피하고 줄이기 위해. Dockermulti-stage 기능을 사용해야 합니다.

Docker 다단계란 무엇입니까?



일반적으로 각 docker 파일에는 하나의 명령문FROM이 기본으로 포함됩니다. Multi-Stage를 사용하면 여러 개FROM를 가질 수 있으며 각각 빌드의 새 단계를 시작합니다. 최종 이미지에 원하지 않는 모든 것을 남겨두고 한 단계에서 다른 단계로 아티팩트를 선택적으로 복사할 수 있습니다. 다음은 Dockerfile.prod 파일입니다.

#Client App
FROM node:14.15.0 as vuejs
LABEL authors="Nimat Razmjo
RUN mkdir -p /app/public
COPY package.json webpack.mix.js package-lock.json /app/
COPY resources/ /app/resources/
WORKDIR /app
RUN npm install && npm run prod

#Server Dependencies
FROM composer:2.0.8 as vendor
WORKDIR /app
COPY database/ database/
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install \
    --ignore-platform-reqs \
    --no-interaction \
    --no-plugins \
    --no-scripts \
    --prefer-dist

#Final Image
FROM php:7.4-apache as base
#install php dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libonig-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    libzip-dev \
    zip \
    jpegoptim optipng pngquant gifsicle \
    unzip \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl

# change the document root to /var/www/html/public
RUN sed -i -e "s/html/html\/public/g" \
    /etc/apache2/sites-enabled/000-default.conf

# enable apache mod_rewrite
RUN a2enmod rewrite

WORKDIR /var/www/html

COPY . /var/www/html
COPY --from=vendor /app/vendor/ /var/www/html/vendor/
COPY --from=vuejs /app/public/js/ /var/www/html/public/js/
COPY --from=vuejs /app/public/css/ /var/www/html/public/css/
COPY --from=vuejs /app/mix-manifest.json /var/www/html/mix-manifest.json

RUN pwd && ls -la

RUN php artisan key:generate --ansi && php artisan storage:link && php artisan config:cache && php artisan route:cache


# these directories need to be writable by Apache
RUN chown -R www-data:www-data /var/www/html/storage \
    /var/www/html/bootstrap/cache

# copy env file for our Docker image
# COPY env.docker /var/www/html/.env

# create sqlite db structure
RUN mkdir -p storage/app \
    && touch storage/app/db.sqlite

VOLUME ["/var/www/html/storage", "/var/www/html/bootstrap/cache"]

EXPOSE 80


그리고 다음은 모든 인스턴스를 단일 서비스로 실행하기 위한 docker-compose.production.yml 파일입니다.
docker-compose.production.yml
version: "3.8"
services:
  server:
    build:
      context: .
      dockerfile: Dockerfile.prod
      target: base
    container_name: server
    env_file:
      - ./.env
    depends_on:
      - mysql
    links:
      - mysql
    ports:
      - 80:80
    networks:
      - back-tier
  mysql:
    image: mysql
    container_name: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ./mysql/init.sql:/data/application/init.sql
      - mysql_data:/var/lib/mysql
    networks:
      - back-tier

volumes:
  mysql_data:
networks:
  back-tier:



프로덕션 모드에서 응용 프로그램을 실행하려면 docker-compose -f docker-compose.production.yml up -d를 실행하여 서비스를 시작하고 docker-compose -f docker-compose.production.yml down를 실행하여 서비스를 종료하십시오.

소스 코드는 here에서 사용할 수 있습니다.

참고: Github에서 위의 프로젝트에 기여하고 싶다면 진심으로 환영합니다.

읽어 주셔서 감사합니다. 이 기사가 마음에 드셨다면 친구 및 동료와 공유하십시오! 또는 일반적인 피드백이 있으면 알려주세요. :)

좋은 웹페이지 즐겨찾기