Docker 기반 PHP 개발 환경 에 대한 상세 한 튜 토리 얼 구축

10134 단어 DockerPHP
현재 많은 개발 자 들 이 Vagrant 를 사용 하여 그들의 가상 컴퓨터 개발 환경 을 관리 하고 있 습 니 다.Vagrant 는 정말 멋 있 지만 단점 도 많 습 니 다.(가장 중요 한 것 은 자원 을 너무 많이 차지 하 는 것 입 니 다)용기 기술,Docker 와 더 많은 종류의 Docker 기술 이 등장 한 후에 이 문 제 를 해결 하 는 것 은 간단 해 졌 다.
면책 성명
boot2docker 의 작업 방식 으로 인해 본 고 에서 말 한 방법 은 환경 에서 정상적으로 작 동 하지 못 할 수 있 습 니 다.만약 리 눅 스 가 아 닌 환경 에서 폴 더 를 Docker 용기 에 공유 해 야 한다 면 더 많은 세부 사항 을 주의해 야 한다.후속 으로 나 는 글 을 써 서 실제 발생 한 문 제 를 전문 적 으로 소개 할 것 이다.
어떻게 해야만 좋 은 개발 환경 이 라 고 할 수 있 습 니까?
우선,우 리 는 무엇이 좋 은 개발 환경 인지 알 아야 한다.나 에 게 좋 은 개발 환경 은 다음 과 같은 몇 가지 특징 을 가 져 야 한다.
  •     마음대로 사용 가능 합 니 다.나 는 새로운 환경 을 마음대로 삭제 하고 만 들 수 있어 야 한다
  •     빠 른 시동.내 가 그것 으로 일 하고 싶 을 때,그것 은 즉시 사용 할 수 있다
  •     갱신 하기 쉽다.우리 업계 에서 사물 의 발전 변화 가 매우 빠 르 기 때문에 나 는 나의 개발 환경 을 새로운 소프트웨어 버 전 으로 쉽게 업데이트 할 수 있어 야 한다
  • Docker 는 이러한 특징 을 지원 하고 심지어 더 많다.너 는 거의 즉시 용 기 를 소각 하고 재건 할 수 있 으 며,환경 을 갱신 하려 면 현재 사용 하고 있 는 거울 만 재건 하면 된다.
    PHP 개발 환경 이란 무엇 인가
    현재 웹 응용 이 복잡 하고 PHP 개발 환경 에 많은 것 이 필요 하 며 환경의 단순 성 을 확보 하기 위해 서 는 다양한 제한 이 필요 하 다.
    우 리 는 이번에 Nginx,PHP 5-FPM,MySQL 을 사용 하여 Synmforny 프로젝트 를 실행 합 니 다.
    Pet 와 Cattle
    또 하 나 는 개발 환경 을 다 용기 에 배치 해 야 하 느 냐,단일 용기 에 배치 해 야 하 느 냐 하 는 것 이다.두 가지 방식 은 각각 장점 이 있다.
  •     하나의 용 기 는 나 누 어 주 고 유지 하기 쉽다.독립 적 이기 때문에 모든 것 이 같은 용기 에서 작 동 된다 는 점 은 가상 컴퓨터 와 같다.그러나 이것 은 그 중의 어떤 것(예 를 들 어 PHP 새 버 전)을 업그레이드 하려 면 전체 용 기 를 다시 구축 해 야 한 다 는 것 을 의미한다
  •     다 중 용 기 는 구성 요 소 를 추가 할 때 더 좋 은 모듈 화 를 제공 할 수 있다.모든 용기 에는 스 택 의 일부분 이 포함 되 어 있 기 때문에 웹,PHP,MySQL 등 은 모든 서 비 스 를 단독으로 확장 하거나 서 비 스 를 추가 할 수 있 으 며 모든 것 을 재건 할 필요 가 없습니다
  • 나 는 게 으 른 데다 가 내 노트 에 다른 내용 을 넣 어야 하기 때문에 여기 서 우 리 는 한 용기 의 방법 만 소개 한다.
    초기 화 프로젝트
    먼저 해 야 할 일 은 새로운 Symforny 프로젝트 를 초기 화 하 는 것 입 니 다.추천 하 는 방법 은 coposer 의 create-project 명령 입 니 다.워크스테이션 에 coposer 를 설치 할 수 있 었 는데 너무 쉬 웠 어 요.이번에 우 리 는 Docker 를 통 해 그것 을 사용한다.
    나 는 이전에 Docker 명령 에 관 한 글 을 보 낸 적 이 있다.make docker commands(그래,거짓말 이 야.나 는 원래 그것 을 이 글 에 썼 는데,그 다음 에 그것 을 독립 시 키 는 것 이 좋 을 것 같 아.)
    어쨌든 읽 어 보 세 요.다음 에 coposer 명령 이 없 으 면 자신 만 의 coposer 별명 을 만 들 수 있 습 니 다.
    
    $ alias composer="docker run -i -t -v \$PWD:/srv ubermuda/composer"
    
    
    이제 Symforny 프로젝트 를 초기 화 할 수 있 습 니 다.
    
    $ composer create-project symfony/framwork-standard-edition SomeProject
    
    
    멋있다!다음은 실질 적 인 일 을 하 겠 습 니 다.
    용기.
    표준 Symforny 프로젝트 를 실행 하고 자급자족 하 는 용 기 를 만 드 는 것 은 상당히 쉽 습 니 다.자주 사용 하 는 Nginx,PHP 5-FPM,MySQL-server 만 설치 하면 됩 니 다.그리고 미리 준비 한 Nginx 의 가상 호스트 설정 파일 을 던 지고 프로필 을 복사 하면 됩 니 다.
    이 용기 의 소스 코드 는 GitHub 의 ubemuda/docker-symforny 창고 에서 찾 을 수 있 습 니 다.Dockerfile 은 Docker 가 미 러 를 구축 하 는 데 사용 할 프로필 입 니 다.다음 을 살 펴 보 겠 습 니 다.
    
    FROM debian:wheezy
    
    ENV DEBIAN_FRONTEND noninteractive
    
    RUN apt-get update -y
    RUN apt-get install -y nginx php5-fpm php5-mysqlnd php5-cli mysql-server supervisor
    
    RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
    RUN sed -e 's/;listen\.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
    RUN sed -e 's/;listen\.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
    RUN echo "
    daemon off;" >> /etc/nginx/nginx.conf ADD vhost.conf /etc/nginx/sites-available/default ADD supervisor.conf /etc/supervisor/conf.d/supervisor.conf ADD init.sh /init.sh EXPOSE 80 3306 VOLUME ["/srv"] WORKDIR /srv CMD ["/usr/bin/supervisord"]
    debian:wheezy 라 는 기본 미 러 를 확장 해서 시작 한 다음,일련의 sed 명령 을 통 해 Nginx 와 PHP5-FPM 을 설정 합 니 다.
     RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
    RUN sed -e 's/;listen\.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
    RUN sed -e 's/;listen\.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
    RUN echo "
    daemon off;" >> /etc/nginx/nginx.conf
    여기 서 우 리 는 두 가지 일 을 해 야 한다.우선 슈퍼 visord 가 추적 할 수 있 도록 PHP 5-FPM 과 Nginx 를 설정 합 니 다.
    그리고 지정 한 사용자 가 웹 서버 를 실행 하고 파일 권한 을 처리 할 수 있 도록 PHP 5-FPM 을 설정 합 니 다.
    다음은 설정 파일 을 설치 해 야 합 니 다.먼저 Nginx 의 가상 호스트 설정 파일 vhost.conf 입 니 다.
    
    server {
      listen 80;
    
      server_name _;
    
      access_log /var/log/nginx/access.log;
      error_log /var/log/nginx/error.log;
    
      root /srv/web;
      index app_dev.php;
    
      location / {
        try_files $uri $uri/ /app_dev.php?$query_string;
      }
    
      location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
      }
    }
    
    
    도 메 인 이름 이 필요 없 기 때문에 servername 설정 (약간 perl 의$자리 차지 문자 변수),루트 디 렉 터 리(document root)를/svr/web 로 설정 합 니 다.프로그램 을/srv 에 배치 하고 나머지 는 표준 Mginx+PHP 5-FPM 설정 입 니 다.
    하나의 용기 가 매번 하나의 프로그램 만 실행 할 수 있 기 때문에,우 리 는 슈퍼 visord(또는 다른 프로 세 스 관리자 가 필요 하지만,나 는 슈퍼 visord 가 비교적 마음 에 든다).다행히도 이 프로 세 스 관리 자 는 우리 가 필요 로 하 는 모든 프로 세 스 를 만 들 수 있 습 니 다!다음은 슈퍼 visord 의 작은 설정 입 니 다.
    
    [supervisord]
    nodaemon=true
    
    [program:nginx]
    command=/usr/sbin/nginx
    
    [program:php5-fpm]
    command=/usr/sbin/php5-fpm
    
    [program:mysql]
    command=/usr/bin/mysqld_safe
    
    [program:init]
    command=/init.sh
    autorestart=false
    redirect_stderr=true
    redirect_stdout=/srv/app/logs/init.log
    
    
    여기 서 우리 가 해 야 할 일 은 모든 서 비 스 를 정의 하고 특수 한 program:init 프로 세 스 를 추가 하 는 것 입 니 다.이것 은 실제 서비스 가 아니 라 독창적 인 시작 스 크 립 트 를 실행 하 는 방식 입 니 다.
    이 시작 스 크 립 트 의 문 제 는 보통 일부 서 비 스 를 먼저 시작 해 야 한 다 는 것 이다.예 를 들 어,데이터베이스 테이블 을 초기 화 할 수도 있 지만,전 제 는 MySQL 을 먼저 달 려 야 한 다 는 것 이다.가능 한 해결 방법 은 시작 스 크 립 트 에서 MySQL 을 시작 한 다음 에 테이블 을 초기 화한 다음 에 supervisord 의 프로 세 스 관리 에 영향 을 주지 않도록 MySQL 을 멈 추고 마지막 에 supervisord 를 시작 하 는 것 이다.
    이러한 스 크 립 트 는 아래 와 같 습 니 다.
    
    /etc/init.d/mysql start
    app/console doctrine:schema:update --force
    /etc/init.d/mysql stop
    
    exec /usr/bin/supervisord
    
    
    보기 에는 추 하고 나무 가 있 는 것 같 습 니 다.우 리 는 방식 을 바 꾸 어 슈퍼 바 이 저 로 하여 금 그것 을 운행 하 게 하고 영원히 다시 시작 하지 않 게 합 니 다.
    실제 init.sh 스 크 립 트 는 다음 과 같 습 니 다.
    
    #!/bin/bash
    
    RET=1
    
    while [[ RET -ne 0 ]]; do
      sleep 1;
      mysql -e 'exit' > /dev/null 2>&1; RET=$?
    done
    
    DB_NAME=${DB_NAME:-symfony}
    
    mysqladmin -u root create $DB_NAME
    
    if [ -n "$INIT" ]; then
      /srv/$INIT
    fi
    
    
    스 크 립 트 는 MySQL 이 시 작 될 때 까지 기다 린 다음 환경 변수 DBNAME 에서 DB 를 만 들 고,기본 값 은 symfony 이 며,INIT 환경 변수 에서 실행 할 스 크 립 트 를 찾 아 실행 을 시도 합 니 다.본 논문 의 결말 은 이러한 환경 변 수 를 어떻게 사용 하 는 지 설명 한다.
    미 러 구축 및 실행
    만사 가 다 준비 되 었 는데 동풍 만 불 지 않 는 다.Symforny Docker 미 러 를 구축 하고 docker build 명령 을 사용 해 야 합 니 다.
    
    $ cd docker-symfony
    $ docker build -t symfony .
    
    
    이제 Symforny 프로젝트 를 실행 할 수 있 습 니 다.
    
    $ cd SomeProject
    $ docker run -i -t -P -v $PWD:/srv symfony
    
    
    이 일련의 옵션 이 각각 무엇 인지 살 펴 보 자.
  •     -i 인 터 랙 티 브(inteactive)모드 를 시작 합 니 다.즉,STDIO(표준 입 출력)가 현재 터미널 에 연결 되 었 습 니 다.로 그 를 받 거나 프로 세 스에 신 호 를 보 내 려 면 유용 합 니 다
  •     -t.용기 에 가상 TTY 를 만 듭 니 다.-i 와 좋 은 친구 입 니 다.보통 같이 사용 합 니 다
  •     -P 는 Docker 데 몬 에 게 지정 한 포트 를 발표 하 라 고 알려 줍 니 다.이 예 는 80 포트 입 니 다
  •     -v$PWD:/srv 현재 디 렉 터 리 를 용기 의/srv 디 렉 터 리 에 마 운 트 합 니 다.디 렉 터 리 내용 을 대상 마 운 트 지점 에 사용 할 수 있 도록 디 렉 터 리 를 마 운 트 합 니 다
  • 지금 전에 말씀 드 렸 던 DB 를 기억 하 시 나 요?NAME 와 INIT 환경 변 수 죠?무엇 을 사용 하 세 요?환경 을 사용자 정의 하 는 데 사용 합 니 다.기본적으로 docker run 의-e 옵션 을 통 해 용기 에 환경 변 수 를 설정 할 수 있 습 니 다.스 크 립 트 를 시작 하면 환경 변 수 를 가 져 올 수 있 습 니 다.따라서 DB 이름 이 some 이면project_dev,이렇게 용 기 를 실행 할 수 있 습 니 다:
    
    $ docker run -i -t -P -v $PWD:/srv -e DB_NAME=some_project_dev symfony
    
    
    INIT 환경 변 수 는 시작 할 때 지정 한 스 크 립 트 를 실행 할 수 있 도록 해 줍 니 다.예 를 들 어,bin/setup 스 크 립 트 가 coposer install 명령 을 실행 하고 데이터베이스 schema 를 설정 합 니 다.
    
    #!/bin/bash
    composer install
    app/console doctrine:schema:update --force
    
    
    -e 로 실행 하기:
    
    $ docker run -i -t -P \
      -v $PWD:/srv \
      -e DB_NAME=some_project_dev \
      -e INIT=bin/setup
    
    
    주의 하 세 요.-e 옵션 은 docer run 에서 여러 번 사용 할 수 있 습 니 다.멋 있어 보 입 니 다.또한,스 크 립 트 를 시작 하려 면 실행 가능 한 권한(chmod+x)이 필요 합 니 다.
    현재 우 리 는 curl 을 통 해 용기 에 요청 을 보 내 모든 것 이 예상 한 대로 작 동 하 는 지 확인 합 니 다.우선,Docker 가 용기 에 비 친 80 포트 의 공공 포트 를 가 져 와 docker port 명령 을 사용 해 야 합 니 다.
    
    $ docker port $(docker ps -aql 1) 80
    0.0.0.0:49153
    
    
    docker ps-aql 1 은 마지막 용기 의 id 를 편리 하 게 검색 할 수 있 는 좋 은 명령 입 니 다.우리 의 예 에서 Docker 는 용기 의 80 포트 를 49153 포트 에 비 추 었 습 니 다.우리 컬 해 보 자.
    
    $ curl http://localhost:49153
    
    
    You are not allowed to access this file. Check app_dev.php for more information.
    
    
    우리 가 localhost(번역자 주:용기 의 localhost)에서 dev controller 를 방문 하지 않 았 을 때 Symfony 의 기본 오류 메 시 지 를 받 았 습 니 다.이것 은 더 이상 정상 적 이지 않 습 니 다.용기 내부 에서 curl 요청 을 보 낸 것 이 아니 기 때문에 전단 컨트롤 러 웹/app 을 안전하게 사용 할 수 있 습 니 다.dev.php 에서 이 줄 들 을 제거 합 니 다.
    
    // This check prevents access to debug front controllers that are deployed by accident to production servers.
    // Feel free to remove this, extend it, or make something more sophisticated.
    if (isset($_SERVER['HTTP_CLIENT_IP'])
      || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
      || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server')
    ) {
      header('HTTP/1.0 403 Forbidden');
      exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
    }
    
    
    이 줄 들 은 localhost 이외 의 곳 에서 dev contrller 에 접근 하 는 것 을 막 았 다.
    이제 curl 을 할 때 정상적으로 작업 하거나 브 라 우 저 로 접근 할 수 있 습 니 다.http://localhost:49153/:
    201571105429165.png (1554×988)

    좋은 웹페이지 즐겨찾기