DEV/Docker-Debian

4. Docker PHP 환경 설정하기 (php.ini)

서버엔지니어 2023. 3. 2.
728x90

1) PHP 환경 설정 방법

php 컨테이너 내의 설정 파일 (php.ini) 를 호스트 서버로 복사하고 호스트 서버의 php.ini 파일을 사용하도록 해야 합니다.
컨테이너가 구동중인 상태에서 아래와 같이 파일을 복사 합니다.

php 컨테이너의 /usr/local/etc/php/php.ini-development 파일을 /home/93it/php/conf/ 디렉토리 아래에 php.ini 이름으로 복사.
mkdir -p /home/93it/php/conf
docker cp php:/usr/local/etc/php/php.ini-development /home/93it/php/conf/php.ini

 

기본적으로 소스내 PHP 태그없이도 코드 인식이 가능하도록하고 한국 표준시를 출력하도록 설정합니다.

 

vi /home/93it/php/conf/php.ini
===============================================================================

short_open_tag = On
date.timezone = "Asia/Seoul"
===============================================================================

 

호스트 서버에서 php.ini 파일을 사용할 수 있도록 docker-compose.yml 파일을 수정합니다.
===============================================================================

 

vi docker-compose.yml
===============================================================================

    php:
        image: php:8.2.0-fpm
        container_name: php
        restart: unless-stopped
        ports:
            - "9000:9000"
        volumes:
            - /home/93it/httpd/html:/var/www/html
            - /home/93it/php/conf/php.ini:/usr/local/etc/php/php.ini
        command:
            - /bin/sh
            - -c
            - |
              echo "security.limit_extensions = .html .htm .php" >> /usr/local/etc/php-fpm.d/www.conf
              php-fpm
===============================================================================

 

변경된 yml을 적용하기위해서 컨테이너를 종료 삭제 재적용합니다.

docker compose stop php
docker rm -v php
docker compose up -d php

 

2) mysql 연동 및 테스트

php 컨테이너에서 docker-php-ext-install 명령을 이용해 필요한 라이브러리를 설치해줍니다. (mysqli.so 파일 생성)

 

docker exec -it php /bin/bash
===============================================================================

 

root@cb2ed69f9009:/var/www/html# docker-php-ext-install mysqli
===============================================================================

(cd .libs && rm -f mysqli.la && ln -s ../mysqli.la mysqli.la)
/bin/bash /usr/src/php/ext/mysqli/libtool --mode=install cp ./mysqli.la /usr/src/php/ext/mysqli/modules
cp ./.libs/mysqli.so /usr/src/php/ext/mysqli/modules/mysqli.so
cp ./.libs/mysqli.lai /usr/src/php/ext/mysqli/modules/mysqli.la
PATH="$PATH:/sbin" ldconfig -n /usr/src/php/ext/mysqli/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/src/php/ext/mysqli/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

+ strip --strip-all modules/mysqli.so
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20220829/
Installing header files:          /usr/local/include/php/
find . -name \*.gcno -o -name \*.gcda | xargs rm -f
find . -name \*.lo -o -name \*.o -o -name \*.dep | xargs rm -f
find . -name \*.la -o -name \*.a | xargs rm -f
find . -name \*.so | xargs rm -f
find . -name .libs -a -type d|xargs rm -rf
rm -f libphp.la      modules/* libs/*
rm -f ext/opcache/jit/zend_jit_x86.c
rm -f ext/opcache/jit/zend_jit_arm64.c
rm -f ext/opcache/minilua

===============================================================================

root@cb2ed69f9009:/var/www/html# exit


호스트 서버에서 설정 파일을 열고 아래 행을 주석 해제 합니다.
vi /home/93it/php/conf/php.ini
===============================================================================

extension=mysqli

===============================================================================

 

변경 사항을 적용합니다.
docker compose restart php

 

웹 소스를 수정하여 MySQL 연동이 잘 되는지 테스트 해봅니다.
아래 소스 코드를 이용하여 작성한 뒤 웹브라우저에서 접근하면 확인이 가능합니다.

 

vi /home/93it/httpd/html/index.html
===============================================================================

MySQL Connect TEST<br>
<?
$conn = mysqli_connect("mysql", "93it", "설정된 비밀번호", "93itdb"); # 여기에서 mysql 은 컨테이너 이름

if ($conn) {
    echo "MySQL 연결 성공";
} else {
    echo "MySQL 연결 실패";
}

$result = mysqli_query($conn, "SELECT VERSION() AS VERSION");
$data = mysqli_fetch_assoc($result);
echo "<br>Version : " . $data['VERSION'];
?>

 

또는

 

<?

echo "MySql 연결 테스트<br>";
$db = mysqli_connect("mysql", "93it", "qwer", "93itdb");

if($db) {echo "MySQL 컨테이너 연결 성공<br>";}

else {echo "MySQL 컨테이너 연결 실패<br>";}

$result = mysqli_query($db, 'SELECT VERSION() as VERSION');
$data = mysqli_fetch_assoc($result);
echo "MySQL 버전은 ".$data['VERSION'];

?>
===============================================================================

 

현재 설치된 PHP 모듈


root@Ubuntu-Docker:~# docker exec -it php /bin/bash
root@cb2ed69f9009:/var/www/html# php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
random
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

 

docker exec php php -m 명령어로 해도 됩니다.

 

3) 기타 라이브러리 활성화

주로 사용하는 curl, gd, mbstring, openssl 라이브러리를 활성해 보겠습니다.
(사실 gd 만 추가 설치, 나머지는 재설치 과정)
mysqli 설치하는 방법과 같이 컨테이너에 접근하여 라이브러리를 설치하면 되지만,
그냥 설치 명령을 내리면 컨테이너에 필요한 패키지가 없다며 에러가 출력되므로
사전에 필요한 패키지를 설치하고 라이브러리 설치를 진행합니다.

# docker exec -it php /bin/bash

제일 먼저 리포지토리를 정리해야 패키지 설치가 잘 되므로 업데이트를 해줍니다.
root@cb2ed69f9009:/var/www/html# apt-get update -y
root@cb2ed69f9009:/var/www/html# apt-get upgrade -y

(curl 라이브러리 설치)
root@cb2ed69f9009:/var/www/html# apt-get install -y libcurl4-openssl-dev
root@cb2ed69f9009:/var/www/html# docker-php-ext-install curl
 
(gd 라이브러리 설치)
root@cb2ed69f9009:/var/www/html# apt-get install -y zlib1g-dev libpng-dev
root@cb2ed69f9009:/var/www/html# docker-php-ext-install gd

gd 는 기본 허용 모듈에서 빠져 있기 때문에 사용을 위해 아래와 같이 추가 구성해줍니다.
root@cb2ed69f9009:/var/www/html# docker-php-ext-configure --with-gd

(mbstring 라이브러리 설치)
root@cb2ed69f9009:/var/www/html# apt-get install -y libonig-dev
root@cb2ed69f9009:/var/www/html# docker-php-ext-install mbstring

(openssl 라이브러리 설치)

 

컨테이너 안의 /usr/src 경로에 압축 xz파일이 있으나 해당 압축파일은 기본 내장 모듈이 없기 때문에 압축을 푸시면 안됩니다.
root@cb2ed69f9009:/usr/src# docker-php-ext-install openssl

-> 해당 명령어를 미리 입력해야지 /usr/src/ 경로에 php 폴더가 생깁니다.

root@cb2ed69f9009:/var/www/html# cd /usr/src/php/ext/openssl
root@cb2ed69f9009:/usr/src/php/ext/openssl# cp config0.m4 config.m4
root@cb2ed69f9009:/usr/src/php/ext/openssl# phpize
root@cb2ed69f9009:/usr/src/php/ext/openssl# apt-get install -y libssl-dev
root@cb2ed69f9009:/usr/src/php/ext/openssl# docker-php-ext-install openssl
root@cb2ed69f9009:/usr/src/php/ext/openssl# exit


라이브러리 설치 완료 후 php 컨테이너를 재시작 하면 phpinfo 화면에서 설치한 모듈이 보여지게 됩니다.
docker compose restart php
docker exec php php -i | grep -i gd

도커 컨테이너 php 모듈 확인
docker exec php php -m

 

# docker exec php php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
random
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

댓글