최종적인 파일구성
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 402