Linux

[PHP] Dockerfile, Docker-compose.yml 만들기

cucu0417 2025. 8. 4. 00:36

PHP 코드를 도커로 패키징해 공유 할 때 사용한 코드이다

 

Dockerfile

// 베이스 이미지 PHP 8.0 버전 아파치 이미지 사용
FROM php:8.2-apache

// 필요한 PHP 확장 설치
RUN docker-php-ext-install mysqli pdo pdo_mysql

// 현재 디렉토리에 있는 파일을 컨테이너의 /var/www/html 경로로 복사
COPY . /var/www/html

// 80번 포트를 연다
EXPOSE 80

FROM [설치할 이미지 파일]

: 기반이 될 이미지(ex.OS)를 지정한다

RUN [설치한 이미지 파일 위에서 작동시킬 명령어]

: FROM 기반 이미지 위에 실행될 명령어

COPY [파일 이름] [복사할 컨테이너 내 경로]

: 도커 컨테이너의 경로로 파일을 복사한다

EXPOSE [호스트와 연결할 포트]

: 연결할 포트 번호를 명시한다

++

docker-php-ext-install

: 도커 컨테이너 내에서 PHP 확장 모듈을 설치하는데 사용되는 도구이다

docker-php-ext-install pdo

:PHP 확장 모듈인 PDO를 설치한다

Docker 환경에서 PHP 애플리케이션을 구축할 때, 데이터베이스 연결 기능을 사용하려면 PDO를 설치해야 한다

docker-php-ext-install pdo pdo_mysql

: PHP 애플리케이션이 MySQL 데이터베이스에 연결할 수 있도록 한다

 

 

 

 

 

Docker-compose.yml

services: 
  websever:
    build: . 
    ports:
      - "8080:80" 
    volumes:
      - .:/var/www/html 
    depends_on:
      - db  
      
  db:
    image: mysql:8.0 
    environment:   
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_DATABASE: 'vulnerable_db'
    restart: always  

  phpmyadmin:
    image: phpmyadmin/phpmyadmin 
    ports:  
      - "5000:80"
    environment:
      PMA_HOST: db  
      MYSQL_ROOT_PASSWORD: 'root'
    depends_on:
      - db

해석

services:  //생성될 컨테이너들을 묶어 놓은 단위
  websever:
    build: .  // 현재 디렉토리(.)에 있는 Dockerfile를 실행한다
    ports:
      - "8080:80"  // localhost는 8080포트, docker는 80포트를 사용한다
    volumes:
      - .:/var/www/html  // 현재 디렉토리(.)에 있는 파일을 컨테이너의 /var/www/html 경로에 실시간으로 연결해준다
    depends_on:
      - db  // db 컨테이너 먼저 실행한 뒤 실행한다

  db:
    image: mysql:8.0  // mysql 8.0 버전을 사용한다
    environment:   // 환경 변수를 정의한다
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_DATABASE: 'vulnerable_db'
    restart: always  // 컨테이너가 종료돼도 서비스가 끊기지 않게 한다

  phpmyadmin:
    image: phpmyadmin/phpmyadmin  // 도커 허브에 있는 공식 phpmyadmin 이미지를 사용한다
    ports:  // localhost는 5000번, docker는 80번 포트를 사용한다
      - "5000:80"
    environment:
      PMA_HOST: db  // phpmyamdin이 db 컨테이너에 있는 데이터베이스 서버에 접속한다는 의미이다
      MYSQL_ROOT_PASSWORD: 'root'
    depends_on:
      - db

 

webservices 컨테이너

build

: 도커 이미지를 빌드하는 방법을 지정한다

ports

: 호스트와 도커 컨테이너 간에 포트를 매핑한다(연결한다)

volums

: 파일를  공유한다 (바인드 마운트)

depends on

: 명시된 컨테이너가 먼저 실행되고 실행된다

++

바인드 마운트

: 호스트 시스템의 파일 또는 디렉토리가 컨테이너에 마운트되면, 파일 또는 디렉토리는 호스트의 전체 경로(절대 경로)로 지정되어야 한다

마운트

: 운영 체제에서 파일 시스템을 특정 디렉토리에 연결하는 과정을 의미한다

docker에서는 호스트 시스템의 디렉토리나 파일을 컨테이너 내의 특정 경로에 연결하는 것을 의미한다

컨테이너는 호스트 시스템의 파일이나 디렉토리를 자신의 파일 시스템의 일부처럼 사용할 수 있다

/var/www/html

: 웹 서버의 기본 문서 루트 경로, 웹 서버에 접속했을 때 사용자에게 보여지는 웹 페이지 파일들이 위치하는 곳

  → 여기에 파일이 있어야 브라우저를 통해 접근할 수 있다

 

 

 

db 컨테이너

image

: 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정한다, 만일 이미지가 도커에 존재하지 않으면 도커 허브에서 자동으로 내려받는다

environment

: 환경 변수를 정의하는 부분이다

restart

: 컨테이너가 종료되었을때 재시작 정책을 정의한다

 

 

 

phpmyadmin 컨테이너

PMA_HOST

: phpmyadmin 컨테이너가 MYSQL 또는 MariaDB 서버에 연결할 때 사용하는 호스트 이름을 지정한다

++

depends_on : db

(db 컨테이너의 데이터베이스를 이용하여 phpmyadmin을 실행하기 때문이다)