Docker 기반 PHP 개발 환경 에 대한 상세 한 튜 토리 얼 구축
면책 성명
boot2docker 의 작업 방식 으로 인해 본 고 에서 말 한 방법 은 환경 에서 정상적으로 작 동 하지 못 할 수 있 습 니 다.만약 리 눅 스 가 아 닌 환경 에서 폴 더 를 Docker 용기 에 공유 해 야 한다 면 더 많은 세부 사항 을 주의해 야 한다.후속 으로 나 는 글 을 써 서 실제 발생 한 문 제 를 전문 적 으로 소개 할 것 이다.
어떻게 해야만 좋 은 개발 환경 이 라 고 할 수 있 습 니까?
우선,우 리 는 무엇이 좋 은 개발 환경 인지 알 아야 한다.나 에 게 좋 은 개발 환경 은 다음 과 같은 몇 가지 특징 을 가 져 야 한다.
PHP 개발 환경 이란 무엇 인가
현재 웹 응용 이 복잡 하고 PHP 개발 환경 에 많은 것 이 필요 하 며 환경의 단순 성 을 확보 하기 위해 서 는 다양한 제한 이 필요 하 다.
우 리 는 이번에 Nginx,PHP 5-FPM,MySQL 을 사용 하여 Synmforny 프로젝트 를 실행 합 니 다.
Pet 와 Cattle
또 하 나 는 개발 환경 을 다 용기 에 배치 해 야 하 느 냐,단일 용기 에 배치 해 야 하 느 냐 하 는 것 이다.두 가지 방식 은 각각 장점 이 있다.
초기 화 프로젝트
먼저 해 야 할 일 은 새로운 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
이 일련의 옵션 이 각각 무엇 인지 살 펴 보 자.
$ 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/:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
첫 번째 Docker for Mac참고 , 나는 옆에 있는 Mac에 Docker를 설치하고 컨테이너를 세워 보고 싶다. Docker Hub를 처음 사용할 때는 계정을 만들어야 합니다. Docker.dmg을 실행하면 Docker가 설치됩니다. Dock...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.