- Docker Basic Usage SERIES 1/3
- Docker Apache+PHP ✓ SERIES 2/3
- Docker Hub SERIES 3/3
유지보수중인 서비스가 로컬 개발환경(MacOS)에 설치된 Apache, PHP버전에서 동작하지 않는 이슈가 발생하였습니다.
부연하자면,
MacOS High Sierra 에서 Mojave 업그레이드 했더니 MacOS에 내장된 Apache도 업그레이드 되면서 backup 후 초기화 해버렸습니다.
이때 PHP 버전도 7.2로 업그레이드 되었지요.
이럴때마다 기존 설정을 복원해야하는 번거로움이 있더군요.
PHP 는 homebrew로 버전별 설치 가능한데, 7.2버전은 mcrypt 모듈을 사용할 수 없고, 5버전에는 mcrypt 모듈 추가가 안되었습니다. (제가 방법을 몰라서 그런걸 수도 있어요.)
This feature was DEPRECATED in PHP 7.1.0, and REMOVED in PHP 7.2.0.
https://www.php.net/manual/en/intro.mcrypt.php
Goal
docker 컨테이너에 apache+php 환경 구성 후 로컬환경에 있는 소스파일을 볼륨연결 설정하여 개발 환경을 구축해보겠습니다.
(DB는 로컬 개발환경에 기설치된 MySQL을 사용할 예정입니다.)
Version
컨테이너에 구축할 버전을 정리해 보았습니다.
OS 이미지(Ubuntu)를 기반삼아 WebServer(Apache)와 PHP를 설치하였습니다.
본인 개발환경이 Ubuntu 나 CentOS 이면 바로 Apache 와 PHP 만 올려도 되겠지요.
사실 위 개발환경이면 docker로 구축할 필요도 없겠네요. ㅎㅎ
항목 | version |
---|---|
Operating System | Ubuntu 18.04.1 LTS |
Web Server | Apache 2.4.29 |
+ Apache extension module | rewrite |
Language | PHP 5.6.40 |
+ PHP extension module | mcrypt, mysql |
Framework | CodeIgniter 2.2 |
Run
OS(Ubuntu)를 검색합니다.
OFFICIAL 항목이 OK인 이미지가 있군요. 아무래도 공식 이미지가 안정적이겠지요.
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 9265 [OK]
최신버전으로 다운 받아요.
$ docker pull ubuntu:latest
~
Status: Downloaded newer image for ubuntu:latest
로컬 환경 도커 이미지 리스트로 다운받은 OS를 확인합니다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 47b19964fb50 3 weeks ago 88.1MB
컨테이너로 띄워 볼까요?
참고로 -i -t 옵션 사용시 run 후 컨테이너 진입한답니다.
$ docker run -i -t --name ubuntu-container ubuntu
컨테이너에 접속되었네요.
두근두근~ 너의 이름을 알려다오~
root@259f01bb0482:$ cat /etc/issue
Ubuntu 18.04.1 LTS \n \l
Apache
운영환경 Apache 버전은 2.2인데 apt-get 으로 설치할 수 있는 버전이 2.4이더군요.
동작은 동일하니 설정을 동일하게 맞춰 주시면 되지요.
Apache 2.4
apt, compile, binary 파일 복사 방법중에 본인에게 가장 편한 방법으로 설치하시면 되겠습니다. 저는 아재인지라 apt-get를 이용해서 설치했어요.
root@b9f05a4fe868:$ apt-get update -y
root@b9f05a4fe868:$ apt-cache search apache2
apache2 - Apache HTTP Server
~
root@b9f05a4fe868:$ apt-get install apache2
설치된 Apache 버전정보나 실행파일 위치등을 확인~
root@b9f05a4fe868:$ apachectl -V
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2018-10-10T18:59:25
~
root@b9f05a4fe868:$ which apache2
/usr/sbin/apache2
구동중인 Apache 의 로그도 살펴보았어요.
구동방법등 기초적인 사항은 구글신께~
$ tail -f /var/log/apache2/access.log
Apache Module
CodeIgnier Framework이 rewrite rule 를 사용해서 rewrite 를 활성했어요.
root@99c8baee6af4:$ a2enmod rewrite
Enabling module rewrite.
Apache 설정에 rewrite 모듈라인이 주석처리 되어 있으면 해제해주세요.
$ cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
rewrite 모듈이 활성이 안된경우 Apache 구동중 나는 에러예요.
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration
드뎌 rewrite 모듈이 잘 적용되었네요.
$ apachectl -D DUMP_MODULES | grep rewrite
rewrite_module (shared)
PHP
php5
php를 설치해 보겠습니다. apt-get 기본 저장소에는 php7 버전만 있어서 old 버전 설치를 위해 저장소를 추가했어요.
$ apt-get install software-properties-common # add-apt-repository 사용을 위해 설치
$ add-apt-repository ppa:ondrej/php # old version php 저장소
$ apt-cache search php5 # php5 검색
$ apt-get update
php 설치 해보겠습니다.
$ apt-get install php5.6
~
After this operation, 19.7 MB of additional disk space will be used.
~
Creating config file /etc/php/5.6/apache2/php.ini with new version
~
apache2_invoke: Enable module php5.6
Setting up php5.6 (5.6.40-5+ubuntu18.04.1+deb.sury.org+1) ...
잘 설치되었는지 확인해볼께요.
$ php -v
PHP 5.6.40-5+ubuntu18.04.1+deb.sury.org+1 (cli)
브라우저로 서비스를 접근해도 빈화면만 나오네요. 에러를 확인해야 겠군요.
display_errors = On
설정을 추가하거나 주석처리된경우 주석 해지해주세요.
$ vi /etc/php/5.6/apache2/php.ini
$ vi /etc/php/5.6/cli/php.ini
display_errors = On
PHP Module
암복화에 mcrypt 함수를 사용하고 있어 mcrypt
모듈을 추가해야겠군요.
해당 모듈이 있는지 검색해볼까요?
$ apt-cache search php5.6
~
php5.6-mcrypt - libmcrypt module for PHP
설치합니다.
$ apt-get install php5.6-mcrypt
After this operation, 303 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
~
Creating config file /etc/php/5.6/mods-available/mcrypt.ini with new version
DB 는 mysql를 사용하고 있어 mysql
모듈도 설치~
$ apt-get install php5.6-mysql
~
After this operation, 540 kB of additional disk space will be used.
Creating config file /etc/php/5.6/mods-available/mysql.ini with new version
Processing triggers for libapache2-mod-php5.6 (5.6.40-5+ubuntu18.04.1+deb.sury.org+1) ...
모듈이 잘 붙었는지 확인해보아요.
$ php -m | grep mcrypt
mcrypt
$ php -m | grep mysql
mysql
mysqli
mysqlnd
pdo_mysql
php 를 실행해서 확인해볼까요?
$ php -r "mcrypt_create_iv();"
참고로, mcrypt는 PHP 7.1 버전부터 Deprecated 되었어요.
Warning This feature was DEPRECATED in PHP 7.1.0, and REMOVED in PHP 7.2.0.
출처 : https://www.php.net/manual/en/intro.mcrypt.php
Apache + PHP
Configuration
이제 Apache에 php 설정을 추가 하겠습니다.
Apache 설정에 php 모듈라인에 주석#
이 있으면 해제해주세요.
$ cat /etc/apache2/mods-available/php5.6.load
LoadModule php5_module /usr/lib/apache2/modules/libphp5.6.so
Apache 내 php 설정에 아래 설정이 없으면 추가해주세요.
$ cat /etc/apache2/mods-available/php5.6.conf
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Vhost
sites-available
디렉토리 하위에 001-codeigniter.conf
가상 호스트 설정 파일을 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<VirtualHost *:80>
ServerName dev.willow.pe.kr
ServerAdmin email@gmail.com
DocumentRoot /var/www/codeigniter/
ErrorLog ${APACHE_LOG_DIR}/codeigniter-error_log
CustomLog ${APACHE_LOG_DIR}/codeigniter-access_log common
<Directory "/var/www/codeigniter">
AllowOverride All
Require all granted
</Directory>
RewriteEngine on
RewriteCond $1 !^(/index.html|/index\.php|/phpinfo\.php|/images|/css|/js|/utils|/htmls)
RewriteRule ^(.*)$ /index.php/$1 [L]
</VirtualHost>
sites-available
에 있는 설정파일을 sites-enable
에 심볼릭 링크를 걸어주세요.
$ ls -al /etc/apache2/sites-available/
001-codeigniter.conf
$ ln -s ../sites-available/001-codeigniter.conf /etc/apache2/sites-enabled/ # 심볼릭링크 설정
$ ls -al /etc/apache2/sites-enabled/
001-codeigniter.conf -> ../sites-available/001-codeigniter.conf
Service start
아파치를 구동해볼까요?
$ service apache2 start
아파치 로그를 보아요.
$ tail -f /var/log/apache2/codeigniter-error_log
$ tail -f /var/log/apache2/codeigniter-access_log
브라우저로 확인해볼까요?
Apache Documnet Root 로 설정된 위치에 phpinfo.php 파일을 생성합니다.
$ cat /var/www/html/phpinfo.php
<?php phpinfo() ?>
확인하셨나요?
Docker Image
이제 필요한 환경구성은 다 되었군요.
컨테이너를 이미지로 구워보겠습니다.
$ docker commit ubuntu-container didalgus/ubuntu18_apache24_php56:0.2
CodeIgniter
이제 프레임워크를 올려볼께요.
https://codeigniter.com/download
운영중인 서비스에 적용된 버전에 맞추어 CodeIgniter 2.x
을 로컬 개발환경에 다운로드 합니다.
Volume mount
로컬개발환경 ~/Documents/CodeIgniter-2.2.6 에 압축을 풀었습니다.
위에서 구워논 이미지를 컨테이너로 띄울때 로컬개발환경 볼륨정보를 추가하였습니다.
$ docker run -i -t -p 80:80 -v ~/Documents/CodeIgniter-2.2.6:/var/www/codeigniter --name my_container didalgus/ubuntu18_apache24_php56:0.2
컨테이너에서 /var/www/ 경로를 확인하니 마운트 된걸 확인 할 수 있군요.
$ ll /var/www/
drwxr-xr-x 10 root root 320 Mar 21 21:59 codeigniter # docker volume mount (local)
drwxr-xr-x 1 root root 4096 Mar 21 00:10 html # apache default root
브라우저에서 확인해보아요.
Database connect
Docker 컨테이너의 private IP 는 뭘까요?
1
echo $_SERVER['SERVER_ADDR']; exit;
답은 172.17.0.2 입니다.
MySQL Database 에 docker container private ip 를 허용한 db계정을 생성해 주세요.
172.17.0.1 을 허용한 db 계정을 생성해놓고 빈화면을 보며 삽질 했답니다.
원인은 CodeIgniter 2.x
소스 내 mysql함수앞에 @ 처리(에러무시)를 해두어서 에러 표시가 안되고 있었습니다.
1
@mysqli_connect()
여러분은 브라우저의 빈화면을 보는 시간이 적기를.. (흑흑 ㅠㅠ)