Docker를 사용하여 PHP 실행하기
Docker를 사용하여 PHP 패키지 설치 없이 PHP 스크립트를 실행하는 방법에 대해 설명합니다.
테스트 환경
- WSL2 Ubuntu
- Docker Desktop
자세한 내용은 windows 10 에 WSL2, Ubuntu, Docker 설치 by mozily 를 참고하세요.
단순한 PHP 스크립트 실행하기
Docker를 사용하여 PHP 설치없이 스크립트를 실행해보겠습니다.
실행할 스트립트 test.php
는 다음과 같습니다:
<?php
$t = time();
$date = date('Y-m-d H:i:s', $t);
echo "mon this week: " . date("Y-m-d", strtotime('monday this week', strtotime($date))), PHP_EOL;
echo "sun this week: " . date("Y-m-d", strtotime('sunday this week', strtotime($date))), PHP_EOL;
echo "last week mon: " . date("Y-m-d", strtotime('last week monday', strtotime($date))), PHP_EOL;
echo "-1 week mon: " . date("Y-m-d", strtotime('-1 week monday', strtotime($date))), PHP_EOL;
스크립트가 있는 디렉토리에서 다음 명령을 실행합니다:
$ docker container run --rm -v $(pwd):/app/ php:7.4-cli php /app/test.php
mon this week: 2020-10-19
sun this week: 2020-10-25
last week mon: 2020-10-12
-1 week mon: 2020-10-19
다음은 이 명령에 대한 설명입니다:
- Docker 컨테이너는
php:7.4-cli
이미지를 사용합니다. - Docker 컨테이너가 사용할 수 있도록 호스트의
$(pwd)/test.php
를
컨테이너의/app/test.php
로 마운팅합니다. - 컨테이너를
php /app/test.php
명령으로 실행합니다.
PHP Changelog 를 보면,
5.6.23, 7.0.8 버전에서 주(week)는 항상 월요일부터 시작하는 것으로 변경되었다고 나와있습니다.
(Weeks always start on monday. Formerly, sunday would also be considered to start a week.)
확장 패키지가 필요한 스크립트를 실행하기
대부분의 스크립트는 확장 패키지가 필요합니다.
Docker의 기본 이미지에는 패키지가 설치되지 않았기 때문에, 패키지를 설치하기 위해서
Dockerfile 을 사용하겠습니다.
테스트를 위해서 스크립트를 다음과 같이 수정했습니다:
<?php
$t = time();
$date = date('Y-m-d H:i:s', $t);
echo "mon this week: " . date("Y-m-d", strtotime('monday this week', strtotime($date))), PHP_EOL;
echo "sun this week: " . date("Y-m-d", strtotime('sunday this week', strtotime($date))), PHP_EOL;
echo "last week mon: " . date("Y-m-d", strtotime('last week monday', strtotime($date))), PHP_EOL;
echo "-1 week mon: " . date("Y-m-d", strtotime('-1 week monday', strtotime($date))), PHP_EOL;
echo "change first day of week" . PHP_EOL;
$cal = IntlCalendar::createInstance();
$cal->set(2020, 10, 25);
$cal->setFirstDayOfWeek(IntlCalendar::DOW_SUNDAY);
echo "mon this week: " . date("Y-m-d", strtotime('monday this week', strtotime($date))), PHP_EOL;
echo "sun this week: " . date("Y-m-d", strtotime('sunday this week', strtotime($date))), PHP_EOL;
IntlCalendar
는 intl
패키지를 사용하기 때문에 Docker 이미지에 intl
을 설치해야 합니다.
Docker 이미지에 패키지 설치를 설치하려면 Dockerfile 에 직접 명령을 추가해도 되지만,
쉽게 추가해주는 mlocati/docker-php-extension-installer 스크립트가 있습니다.
다음은 intl, xdebug 패키지를 설치한 Dockerfile 입니다.
FROM php:7.4-cli
ADD https://raw.githubusercontent.com/mlocati/docker-php-extension-installer/master/install-php-extensions /usr/local/bin/
RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
install-php-extensions intl xdebug
이미지를 빌드한 후 실행한 결과입니다:
$ docker build --tag {Tag}:{Version} .
$ docker run --rm -v $(pwd):/app/ {Tag}:{Version} php /app/test.php
mon this week: 2020-10-19
sun this week: 2020-10-25
last week mon: 2020-10-12
-1 week mon: 2020-10-19
change first day of week
mon this week: 2020-10-19
sun this week: 2020-10-25
XDebug 를 사용하여 디버깅하기
앞에서 xdebug
패키지를 설치했기 때문에, 다음 설정으로 .env
파일을 추가하면
스크립트를 디버깅할 수 있습니다:
# php
PHP_IDE_CONFIG=serverName={Server Name}
XDEBUG_CONFIG=remote_enable=on remote_host=host.docker.internal remote_port={Remote Port}
참고자료
- windows 10 에 WSL2, Ubuntu, Docker 설치 by mozily
Windows10 에 WSL2, Ubuntu, Docker를 설치하는 방법을 소개하는 mozily님 블로그입니다. - mlocati/docker-php-extension-installer
댓글남기기