Docker를 이용해 호스트와 다른 버전의 PHP 개발환경 만들기

최근 php 5.1로 작업된 프로젝트를 마이그레이션 할 일이 생겼습니다. 최종 목표는 php 7.1 이상의 환경에서 돌리는 겁니다. 많은 문제가 예상되지만 그 중에서 가장 큰 문제는 mysql_* 시리즈 함수들입니다.

mysql_* 시리즈 함수는 php 5.5에서 deprecated 되고, 7.0 에서 사라졌습니다.(참고) 따라서 warning을 무시하고 작업한다고 가정할 때 세팅할 수 있는 가장 높은 php 버전은 5.5입니다. 하지만 지금 진행하는 라라벨이나 여타 프로젝트들, 특히 valet을 생각하면 php 버전을 낮추는 건 어려운 일입니다.

이럴 때 유용한 것은 VM 기반으로 개발 환경을 구축하는 베이그런트 Vagrant 나 도커 Docker 같은 툴입니다. 최근 도커에 대한 열풍이 거세므로 도커로 세팅을 한번 해보기로 했습니다. 도커에 대해서는 잘 소개된 글들이 많으므로 여기서는 생략하도록 하겠습니다.

도커 컨테이너를 세팅할 수 있는 이미지는 대부분 리눅스 기반입니다. 아마도 대부분 우분투나 센토스 기반의 이미지를 사용하실 것 같습니다. 새 우분투 이미지를 이용해 컨테이너에 하나씩 아파치, PHP, MySQL을 세팅을 할 수도 있겠지만, 기왕이면 편하게 만들어진 이미지를 사용해보려고 검색을 해보았습니다. lamp(linux+apache+mysql+php)라는 키워드로 검색해보니 linode/lamp 이미지가 php 5.5로 구성되어 있어 적절해 보입니다. OS는 ubuntu입니다. pull 명령으로 바로 내려받아봅니다.

/var/www/example.com/public_html 위치가 아파치의 Document Root 입니다. 이 위치에 작업 파일을 할당해두면 될 것 같습니다. 테스트 환경을 구축하는 것이므로 호스트 환경의 DB GUI 툴에서 도커 컨테이너 내의 MySQL에도 접속이 가능해야 합니다. 도커 컨테이너는 기본 포트를 이용해 80 포트로 웹을, 3306으로 MySQL을 서비스 하고 있습니다. 호스트 환경에서는 웹 포트로 4040을, MySQL 포트로 33060을 사용해볼 생각입니다. 다음과 같이 컨테이너를 생성/실행합니다.

-p 옵션으로 포트를 매핑합니다. 이제 호스트에서 4040 포트로 접속하면 도커 컨테이너의 80번 포트를 확인할 수 있고,
33060으로는 컨테이너의 3306포트를 확인할 수 있습니다.
-v 옵션으로는 호스트의 디렉토리와 컨테이너의 디렉토리를 연결할 수 있습니다. 현재 프로젝트 디렉토리가 컨테이너의 Document Root가 되도록 설정했습니다.

하지만 프로젝트를 구동해보니 mysql extension이 없습니다. (LAMP 이미지인데 왜..?) curl extension도 포함되어 있지 않습니다. 거의 기본적인 익스텐션만 설치된 상태로 보입니다. 다행히 우분투 기반이므로 apt-get 으로 설치/활성화 할 수 있습니다. VM에 직접 접속해서 명령을 내려줄 수도 있지만 도커는 외부에서 명령을 전달할 수 있는 exec 라는 명령을 제공합니다.

이제 익스텐션이 설치되고 잘 동작하지만, 호스트의 GUI 툴에서 접근이 되지 않습니다. my.cnf 에서 127.0.0.1 주소에 대해서만 접속이 가능하게 bind-address 처리가 되어 있는 탓입니다.
이 부분도 가급적이면 도커 외부에서 명령어를 전달해서 수정할 수 있도록 다음과 같이 처리해봅니다.

지금까지의 과정을 하나의 스크립트로 정리하면 다음과 같습니다.

이제 이 내용을 이용하면 어느 환경에서든 PHP 5.5 기반으로 동작하는 동일한 개발 환경을 구축할 수 있습니다.

——

도커는 꼭 하위 버전을 대상으로 하는 작업이 아니더라도 다음과 같은 상황에 적용할 수 있을 것 같습니다.

  • 현재 사용하는 버전보다 높은 버전의 환경을 구축해야 한다.
  • 서버 개발 환경과 최대한 동일하게 개발 환경을 맞추고 싶다.
  • 현재 맥이나 윈도를 쓰는데 리눅스 환경을 구축/체험 해보고 싶다.
  • 등등…

Docker를 이용해 호스트와 다른 버전의 PHP 개발환경 만들기”에 대한 1개의 생각

  1. 핑백: [튜토리얼] 도커 Docker 로 논리적으로 구분된 PHP 작업 공간 만들기 | The Darkside of The GrotesQ

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다