[NOTE]
이 서비스는 x86-64arm64 아키텍처의 설치 방법에 차이가 있습니다.


PHP는 널리 쓰이는 서버 사이드 스크립트 언어입니다. 요즘은 많이 개선되었다지만, PHP가 한창 쓰이던 5.x 버전에서는 이해하기 쉬운 C 스타일의 절차 지향적 구조와 비교하면 부족하기 그지없었던 클래스 등의 기능으로, 소규모나 개인 웹 사이트 개발용으로 주로 쓰였어요.

지금은 웹 개발 패러다임의 변화와 클라우드 서버 호스팅의 활성화로 점유율이 많이 낮아졌지만, 그래도 제일 손쉽게 접할 수 있는 웹 개발 언어인 PHP의 개발 및 호스팅 환경을 만들어보도록 하겠습니다.

우선, 버전 고민부터 해 봅시다.


어떤 버전으로 설치할까

PHP는 5 버전과 7 버전에 기능 차이가 심한 편입니다. 보안 문제로 인해 없어진 기능도 있고요. MySQL도 5.6 버전 전후로 기능이 많이 달라졌고, 오라클에 인수당한 뒤로는 MariaDB라는 MySQL 호환 DBMSDataBase Management System도 많이 쓰이고 있어요. 그래서 버전 확인이 중요합니다. 애써 개발해 둔 소스가 이상하게 동작할 수도 있으니까요.

저는 도커 환경에서는 개발만 하고, 완성된 웹 사이트는 카페24나 가비아 같은 웹 호스팅 업체를 이용하는 상황을 가정했어요. 그러면 그곳의 버전을 맞춰가야 하겠죠. 그래서 웹 호스팅 사양을 둘러봤습니다.

카페24 PHP 사양

카페24는 위와 같은 PHP 호스팅 사양을 지원합니다.

가비아 PHP 사양

가비아는 이렇게 되고요.

다양한 설치 버전 안내를 위해 카페24 용은 가장 최신 버전으로, 가비아 용은 조금 오래된 버전으로 설정해 보겠습니다.

  • 카페24: PHP 7.3 - MariaDB 10.0
  • 가비아: PHP 5.3 - MySQL 5.5

가비아 용의 경우, 더 오래된 버전을 사용하고 싶었지만, 해당 버전의 도커 이미지가 없네요.

phpMyAdmin

phpMyAdmin 로고
phpMyAdmin 공식 홈페이지

phpMyAdmin은 웹 기반의 MySQL 관리 도구입니다. 이곳에서 DB에 대해 모든 처리를 할 수 있어요. SQL 명령도 입력할 수 있습니다.

MySQL Workbench와 같은 툴을 쓸 수도 있고, 터미널에서 mysql 명령을 사용하여 접속할 수도 있지만 도커 이미지를 통해 웹으로 접속할 수 있는 환경을 구성해 보도록 하겠습니다. 실제 웹 호스팅 업체에서도 DB 관리용으로 phpMyAdmin을 제공해 주는 경우가 많아요.

Code Server

Visual Studio Code는 마이크로소프트가 만든 오픈 소스 텍스트 에디터입니다. MS와 같은 대기업이 지원하고 기능도 꽤 좋아서 개발용 코드 에디터 시장에서 점유율을 급격하게 늘려나가고 있어요. 이걸 서버가 아닌 PC에 직접 설치해도 매우 좋습니다.

그런데 저는 이 프로그램도 서버에 설치하여 웹으로 사용할 겁니다! Code Server라고 해서 VS Code를 웹으로 사용하는 서비스가 있거든요. 따라서 언제 어디서든 일을 할 수 있어요!

코드 서버는 다른 서비스에 붙여서도 유용하게 쓸 수 있어요. 저는 이 서비스를 Jekyll에 붙여 웹 환경에서 글을 쓰고 있어요. 바로 지금!

사전 작업

총 네 개의 서비스를 설치해야 하지만, 만들 폴더는 두 개뿐이네요.

PHP 사이트 폴더 생성

PHP 사이트의 소스를 저장할 폴더를 만들어야 합니다. 그리고 이 폴더는 코드 서버의 project 폴더이기도 해요.

$ mkdir -p /docker/php-dev/www/html

도커 컨테이너 생성

아래의 docker-compose 파일 내용을 포테이너의 Add Stack > Web editor 아래의 공간에 복사하여 붙여넣습니다.

이번에는 설치 버전을 두 종류로 나눴죠. 그래서 코드 두 벌을 준비했어요.

카페24: PHP 7.3 - MariaDB 10.0

version: "3"
services:
  app:
    image: php:7.3-apache
    depends_on:
      - db
    ports:
      - 8016:80
    volumes:
      - /docker/php-dev/www/html:/var/www/html
    restart: unless-stopped

  db:
    image: mariadb:10.0
    environment:
      - MYSQL_ROOT_PASSWORD=examplepass
      - MYSQL_DATABASE=exampledb
      - MYSQL_USER=exampleuser
      - MYSQL_PASSWORD=examplepass
    volumes:
      - /docker/php-dev/mysql:/var/lib/mysql
    ports:
      - 3316:3306 # optional
    restart: unless-stopped

  db-admin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    ports:
      - 8116:80
    links:
      - db:db
    restart: unless-stopped

  editor:
    image: codercom/code-server
    ports:
      - 8216:8080
    volumes:
      - /docker/php-dev/www/html:/home/coder/project
    environment:
      - PASSWORD=codepass
    restart: unless-stopped

db 서비스의 environment는 물론 사용하려는 DB 정보에 맞게 고쳐줘야겠죠? 호스팅을 염두에 두는 경우, 호스팅 업체에서 제공해 주는 DB명과 사용자명, 비밀번호를 사용하면 나중에 편해요. 단, 보안에 주의해야 합니다!

editor 서비스의 PASSWORD는 코드 서버를 접속할 때 사용할 비밀번호입니다. 이 옵션을 삭제하면 임의의 긴 비밀번호를 생성하는데, 컨테이너 로그에서 확인할 수는 있지만 외우기가 힘드니 도커 컴포즈 옵션에서 지정해주는 것이 좋습니다.

db 서비스의 ports 설정은 선택적입니다. phpMyAdmin이 아니라 다른 MySQL 관리 툴을 사용할 경우 나스_IP:3316으로 접속할 수 있게 하기 위해서예요. DB 관리를 phpMyAdmin으로만 사용한다면 이 설정은 삭제해도 됩니다.

가비아: PHP 5.3 - MySQL 5.5

version: "3"
services:
  app:
    image: php:5.3-apache
    depends_on:
      - db
    ports:
      - 8016:80
    volumes:
      - /docker/php-dev/www/html:/var/www/html
    restart: unless-stopped

  db:
    image: mysql:5.5
    environment:
      - MYSQL_ROOT_PASSWORD=examplepass
      - MYSQL_DATABASE=exampledb
      - MYSQL_USER=exampleuser
      - MYSQL_PASSWORD=examplepass
    volumes:
      - /docker/php-dev/mysql:/var/lib/mysql
    ports:
      - 3316:3306 # optional
    restart: unless-stopped

  db-admin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    ports:
      - 8116:80
    links:
      - db:db
    restart: unless-stopped

  editor:
    image: codercom/code-server
    ports:
      - 8216:8080
    volumes:
      - /docker/php-dev/www/html:/home/coder/project
    environment:
      - PASSWORD=codepass
    restart: unless-stopped

MySQL과 MariaDB 도커를 비교하며 설치한 적이 없어서 지금껏 몰랐는데요, 두 서비스의 설치 옵션이 같네요. 따라서 이미지 정보 외에 차이는 없습니다.

이 외에도 다른 버전을 설치할 수도 있는데요. PHP와 DB 양쪽 다 모든 버전이 있는 것은 아니니, 도커허브의 Tags 정보를 확인하여 설치하시기 바랍니다.

arm64 아키텍처용 설치

arm64 아키텍처에서도 사용할 수는 있는데요. 몇 가지 제한이 있어요. DBMariaDB만 사용할 수밖에 없습니다. phpMyAdmin은 공식 이미지가 아닌 개인이 arm 용으로 포팅한 버전을 사용해야 해요. 다행히 PHP는 공식에서 arm64도 지원하므로 그대로 사용하면 됩니다.

version: "3"
services:
  app:
    image: php:7.3-apache
    depends_on:
      - db
    ports:
      - 8016:80
    volumes:
      - /docker/php-dev/www/html:/var/www/html
    restart: unless-stopped

  db:
    image: mariadb:10.0
    environment:
      - MYSQL_ROOT_PASSWORD=examplepass
      - MYSQL_DATABASE=exampledb
      - MYSQL_USER=exampleuser
      - MYSQL_PASSWORD=examplepass
    volumes:
      - /docker/php-dev/mysql:/var/lib/mysql
    ports:
      - 3316:3306 # optional
    restart: unless-stopped

  db-admin:
    image: jackgruber/phpmyadmin
    depends_on:
      - db
    ports:
      - 8116:80
    links:
      - db:db
    restart: unless-stopped

  editor:
    image: codercom/code-server
    ports:
      - 8216:8080
    volumes:
      - /docker/php-dev/www/html:/home/coder/project
    environment:
      - PASSWORD=codepass
    restart: unless-stopped

서비스 동작 확인

코드 서버부터 접속해 보죠. http://나스_IP:8216에 접속해 봅시다.

Code Server 로그인

비밀번호를 묻는 화면부터 나오네요. 도커 컴포즈에 입력한 비밀번호를 입력하면 웹 브라우저에 VS Code 화면이 나타납니다.

index.php 작성

코드 서버의 project 폴더가 PHP 서버의 루트 폴더 (/var/www/html) 입니다. 여기에 index.php 파일을 만들어 아래 코드를 작성해 봅시다.

<?php
  phpinfo();

이 코드는 설치된 PHP의 버전을 확인하는 코드에요. 아무튼 http://나스_IP:8016에 접속해 보면,

PHP 접속 확인

가비아 용으로 PHP 5.3을 설치해봤는데, 잘 되네요!

DB도 접속해 봅시다. http://나스_IP:8116으로 접속할 수 있어요.

phpMyAdmin 로그인

마찬가지로 도커 컴포즈에 입력한 DB 사용자명과 비밀번호를 입력하여 접속할 수 있습니다. 이후의 화면은 다소 복잡해 보일 수 있지만, MySQL에 대한 지식이 있다면 쉽게 설정할 수 있을 거예요.


그리고 남은 이야기

이렇게 만든 사이트를 실제로 사용하려면, Nginx Proxy Manager를 통해 역방향 프록시 설정을 하면 됩니다. 나스의 사양이 충분하다면 웹 호스팅을 직접 해도 괜찮을 거예요.

댓글남기기