Docker를 이용한 PHP/Nginx환경설정(+Network)

최종적인 파일구성

docker/
├── php/
│   ├ Dockerfile
│   ├ settings/
│   │   └─ php.ini
│   └ src/
│       └─ index.php
└── web/
    ├ Dockerfile
    └ settings/
        └─ default.conf

1.php-fpm의 Dockerfile을 작성

php/Dockerfile

# 1.해당 이미지(php:8.0-fpm-alpine)를 도커허브에서 가져와서 새로운 커스텀 이미지를 만든다
FROM php:8.0-fpm-alpine

# 2.이미지를 생성시에 해당 명령어를 실행한다. php.ini-production파일을 복사해서 php.ini파일을 만든다
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini

# 3.로컬의 settings폴더에 있는 php.ini파일을 도커 컨테이너의 php.ini파일에 덮어쓴다
# 이것은 위의 2번 공정에서 생성한 php.ini파일에 개인 설정을 추가해서 덮어쓰는 방법
COPY settings/php.ini /usr/local/etc/php/conf.d/php.ini

# 4.로컬의 src폴더안에 있는 index.php파일을 nginx/html의 웹루트에 복사한다
COPY src /usr/share/nginx/html

php/settings/php.ini

[PHP]
date.timezone = "Asia/Tokyo"

php/src/index.php

<?php phpinfo(); ?>

2.nginx의 Dockerfile을 작성

web/Dockerfile

# 1.해당 이미지(nginx:1.19-alpine)를 도커허브에서 가져와서 새로운 커스텀 이미지를 만든다
FROM nginx:1.19-alpine

# 2.로컬의 settings폴더에 있는 default.conf파일을 도커 컨테이너의 default.conf파일에 덮어쓴다
COPY settings/default.conf /etc/nginx/conf.d/default.conf

3.TCP통신 설정

web/settings/default.conf

server {
    listen 80;
    root   /usr/share/nginx/html; # php컨테이너의 경로임

    location / {
        index          index.php index.html index.htm;
        fastcgi_pass   php-sample:9000; # 1.php의 컨테이너명을 추가함 localhost:80/ 으로 접근시 php컨테이너의 9000번 포트를 사용함
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

4.이미지 빌드

php/Dockerfile

# 1. PHP 의이미지 작성 
# 캐시를 사용하지 않고 이미지를 생성한다. 이미지명 php/sample에 20210109태그를 지정하며 현재 디렉토리(.)에서 Dockerfile을 찾는다
docker build --no-cache -t php/sample:20210109 .

web/Dockerfile

# 2. nginx의 이미지 생성
# 캐시를 사용하지 않고 이미지를 생성한다. 이미지명 nginx/sample에 20210109태그를 지정하며 현재 디렉토리(.)에서 Dockerfile을 찾는다
docker build --no-cache -t nginx/sample:20210109 .

5.네트워크 작성

# 1. 네트워크명 sample_nw을 작성
# 해당 네트워크는 컨테이너간의 통신을 가능하게 해준다. A컨테이너와 B컨테이너가 같은 네트워크를 사용하면 두 컨테이너는 서로 식별이 가능하게 된다
docker network create --driver bridge sample_nw

# 네트워크 리스트 보기
docker network ls

6컨테이너 작성및 실행

# 1. PHP 컨테이너 생성 및 실행 
# php/sample:20210109이미지를 사용해서 컨테이너명 php-sample을 생성하고 실행할건데 네트워크는 sample_nw를 사용할것이다  
# -v 호스트경로(로컬):컨테이너영역의경로 , 볼륨(volumn)을 사용하며 로컬의 폴더와 컨테이너의 폴더를 동기화시킨다
# $(pwd)는 이 명령어를 실행하는 현재 폴더 위치를 말하며 php/src로 이동한후 진행해야한다 
# project/php/src:/usr/share/nginx/html가 연동된다는 이미지이다 
 
cd {project폴더}/php/src로 이동후 아래 명령어 실행
docker run --net=sample_nw --name php-sample -v $(pwd):/usr/share/nginx/html php/sample:20210109


# 2. nginx 컨테이너 생성 및 실행
docker run -p 80:80 --net=sample_nw --name nginx-sample nginx/sample:20210109

-p 80:80: 호스트pc의 80번 포트와 컨테이너의 80번 포트를 연결합니다.
--net=sample_nw: sample_nw라는 이름의 Docker 네트워크를 사용합니다.
--name nginx-sample: 컨테이너의 이름을 nginx-sample로 설정합니다.
nginx/sample:20210109: nginx/sample 이미지의 20210109 태그를 사용하여 컨테이너를 실행합니다.
이 명령어를 실행하면 Docker 네트워크에 연결된 nginx-sample 컨테이너가 실행되며, 호스트의 80번 포트로 접속하면 Nginx 웹 서버에 접속할 수 있습니다.

7동작화면확인

아래의 URL로 접근후 phpinfo화면이 표시되는지 확인

http://localhost:80

8컨테이너 종료와 재실행

# 1. PHP 컨테이너 종료 및 재실행 
컨테이너가 일단 run으로 생성되고 실행된 이후에는 정지와 시작을 할때는 아래의 명령어를 사용한다
docker start 컨테이너명
docker stop 컨테이너명
docker ps -a 실행중인 컨테이너와 종료된 컨테이너 모두 표시

# 2. 컨테이너 내부 접근
docker exec -it php-sample /bin/sh


참조

https://www.ritolab.com/posts/220

Apr 30, 2023 Views 331