도커 가이드 · 5 min read · Sep 24, 2025

우분투에서 Docker-Compose로 LEMP 스택 도커화하기

Docker-Compose는 다중 컨테이너 도커 애플리케이션을 정의하고 관리하기 위한 명령줄 도구입니다. Compose는 파이썬 스크립트로, pip 명령을 사용하여 쉽게 설치할 수 있습니다(pip는 파이썬 패키지 저장소에서 파이썬 소프트웨어를 설치하는 명령입니다). Compose를 사용하면 단일 명령으로 여러 도커 컨테이너를 실행할 수 있습니다. 이는 개발, 테스트 및 스테이징 환경에 적합한 서비스로서 컨테이너를 생성할 수 있게 해줍니다.

이 튜토리얼에서는 docker-compose를 사용하여 LEMP 스택 환경(LEMP = Linux - Nginx - MySQL - PHP)을 단계별로 만드는 방법을 안내합니다. 우리는 모든 구성 요소를 서로 다른 도커 컨테이너에서 실행하며, Nginx 컨테이너, PHP 컨테이너, PHPMyAdmin 컨테이너 및 MySQL/MariaDB 컨테이너를 설정합니다.

사전 요구 사항

  • 우분투 서버 16.04 -64비트
  • 루트 권한

1단계 - 도커 설치하기

이 단계에서는 도커를 설치합니다. 도커는 우분투 저장소에서 사용할 수 있으며, 저장소를 업데이트한 후 설치하면 됩니다.

우분투 저장소 업데이트 및 업그레이드:

sudo apt-get update  
sudo apt-get upgrade

우분투 저장소에서 최신 도커 설치하기.

sudo apt-get install -y docker.io

도커를 시작하고 부팅 시 자동으로 시작되도록 설정합니다:

systemctl start docker  
systemctl enable docker

도커 서비스가 실행 중입니다.

다음으로, 아래 명령어를 사용하여 도커를 테스트해볼 수 있습니다:

docker run hello-world

도커에서의 헬로 월드.

안녕하세요 도커

2단계 - Docker-Compose 설치하기

첫 번째 단계에서 이미 도커를 설치했습니다. 이제 docker-compose를 설치하겠습니다.

compose 설치를 위해 python-pip가 필요하므로, apt를 사용하여 python과 python-pip를 설치합니다:

sudo apt-get install -y python python-pip

설치가 완료되면 pip 명령으로 docker-compose를 설치합니다.

pip install docker-compose

이제 docker-compose 버전을 확인합니다:

docker-compose --version

Docker-compose가 설치되었습니다.

3단계 - 도커 환경 생성 및 구성하기

이 단계에서는 docker-compose 환경을 구축합니다. 비루트 사용자를 사용할 것이므로, 지금 그 사용자를 생성해야 합니다.

hakase ‘라는 이름의 새 사용자를 추가합니다(원하는 사용자 이름을 선택하세요):

useradd -m -s /bin/bash hakase  
passwd hakase

다음으로, 새 사용자를 ‘ docker ‘ 그룹에 추가하고 도커를 재시작합니다.

usermod -a -G docker hakase  
sudo systemctl restart docker

이제 사용자 ‘ hakase ‘는 sudo 없이 도커를 사용할 수 있습니다.

다음으로, 루트 사용자에서 ‘hakase’ 사용자로 su로 로그인합니다.

su - hakase

compose 환경을 위한 새 디렉토리를 생성합니다.

mkdir lemp-compose/  
cd lemp-compose/

이것이 우리의 docker-compose 환경입니다. 도커 컨테이너에 있어야 할 모든 파일은 이 디렉토리에 있어야 합니다. docker-compose를 사용할 때는 ‘ docker-compose.yml ‘이라는 이름의 .yml 파일이 필요합니다.

‘lemp-compose’ 디렉토리에서 몇 개의 새 디렉토리와 docker-compose.yml 파일을 생성합니다:

touch docker-compose.yml  
mkdir -p {logs,nginx,public,db-data}
  • logs: Nginx 로그 파일을 위한 디렉토리.
  • nginx: 가상 호스트 등의 Nginx 구성을 포함합니다.
  • public: 웹 파일, index.html 및 PHP 정보 파일을 위한 디렉토리.
  • db-data: MariaDB 데이터 디렉토리 볼륨.

logs ‘ 디렉토리에 error.log 및 access.log 로그 파일을 생성합니다.

touch logs/{error,access}.log

nginx ‘ 디렉토리에 새 nginx 가상 호스트 구성 파일을 생성합니다:

vim nginx/app.conf

아래 구성을 붙여넣습니다:

upstream php {  
        server phpfpm:9000;  
}  
   
server {  
   
        server_name 193.70.36.50;  
   
        error_log "/opt/bitnami/nginx/logs/myapp-error.log";  
        access_log  "/opt/bitnami/nginx/logs/myapp-access.log";  
   
        root /myapps;  
        index index.php index.html;  
   
        location / {  
   
                try_files $uri $uri/ /index.php?$args;  
        }  
   
        location ~ \.php$ {  
   
                include fastcgi.conf;  
                fastcgi_intercept_errors on;  
                fastcgi_pass php;  
        }  
   
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {  
                expires max;  
                log_not_found off;  
        }  
}

파일을 저장하고 vim을 종료합니다.

public ‘ 디렉토리에 새 index.html 파일과 PHP 정보 파일을 생성합니다.

echo '

LEMP Docker-Compose

hakase-labs' > public/index.html echo '' > public/info.php

이제 아래와 같이 환경 디렉토리를 볼 수 있습니다:

tree

도커 컴포즈 프로젝트 환경

4단계 - docker-compose.yml 파일 구성

이전 단계에서 우리는 컨테이너에 필요한 디렉토리와 파일을 생성했습니다. 이 단계에서는 ‘ docker-compose.yml ‘ 파일을 편집하고자 합니다. docker-compose.yml 파일에서는 LEMP 스택을 위한 서비스, 각 컨테이너의 기본 이미지 및 도커 볼륨을 정의합니다.

hakase ‘ 사용자로 로그인하고 vim으로 docker-compose.yml 파일을 편집합니다:

su - hakase  
cd lemp-compose/  
vim docker-compose.yml

- Nginx 서비스 정의

아래 nginx 구성을 붙여넣습니다:

nginx:  
    image: 'bitnami/nginx'  
    ports:  
        - '80:80'  
    links:  
        - phpfpm  
    volumes:  
        - ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log  
        - ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log  
        - ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf  
        - ./public:/myapps

그 구성에서 우리는 이미 정의했습니다:

  • nginx: 서비스 이름
  • image: ‘ bitnami/nginx ‘ 도커 이미지를 사용하고 있습니다
  • ports: 컨테이너 포트 80을 호스트 포트 80에 노출합니다
  • links: ‘ nginx ‘ 서비스 컨테이너를 ‘ phpfpm ‘ 컨테이너에 연결합니다
  • volumes: 로컬 디렉토리를 컨테이너에 마운트합니다. 로그 파일 디렉토리를 마운트하고, Nginx 가상 호스트 구성을 마운트하며, 웹 루트 디렉토리를 마운트합니다.

- PHP-fpm 서비스 정의

Nginx 블록 아래에 아래 구성을 붙여넣습니다:

phpfpm:  
    image: 'bitnami/php-fpm'  
    ports:  
        - '9000:9000'  
    volumes:  
        - ./public:/myapps

여기서 우리는:

  • phpfpm: 서비스 이름을 정의합니다.
  • image: ‘ bitnami/php-fpm ‘ 이미지로 php-fpm 서비스의 기본 이미지를 정의합니다.
  • ports: TCP 포트 9000으로 PHP-fpm을 실행하고, 호스트에 포트 9000을 노출합니다.
  • volumes: 웹 루트 디렉토리 ‘ public ‘을 컨테이너의 ‘ myapps ‘에 마운트합니다.

- MySQL 서비스 정의

세 번째 블록에서는 MariaDB 서비스 컨테이너를 위한 아래 구성을 붙여넣습니다:

mysql:  
    image: 'mariadb'  
    ports:  
        - '3306:3306'  
    volumes:  
        - ./db-data:/var/lib/mysql  
    environment:  
        - MYSQL_ROOT_PASSWORD=hakase-labs123

여기서 우리는:

  • mysql: 서비스 이름으로 사용합니다.
  • image: 컨테이너는 ‘ mariadb ‘ 도커 이미지를 기반으로 합니다.
  • ports: 서비스 컨테이너는 MySQL 연결을 위해 포트 3306을 사용하고, 이를 호스트의 포트 3306에 노출합니다.
  • volumes: db-data 디렉토리 mysql
  • environment: mysql 루트 비밀번호를 도커 이미지에 설정하기 위해 환경 변수 ‘ MYSQL_ROOT_PASSWORD ‘를 설정합니다. 이는 컨테이너를 빌드할 때 실행됩니다.

- PHPMyAdmin 서비스 구성

마지막 블록에서는 아래 구성을 붙여넣습니다:

phpmyadmin:  
    image: 'phpmyadmin/phpmyadmin'  
    restart: always  
    ports:  
       - '8080:80'  
    links:  
        - mysql:mysql  
    environment:  
        MYSQL_USERNAME: root  
        MYSQL_ROOT_PASSWORD: hakase-labs123  
        PMA_HOST: mysql

우리는 ‘phpmyadmin’ 도커 이미지를 사용하고, 컨테이너 포트 80을 호스트의 8080에 매핑하며, 컨테이너를 mariadb 컨테이너에 연결하고, 항상 재시작하도록 설정하며, 도커 이미지의 몇 가지 환경 변수를 설정합니다. 여기에는 ‘ PMA_HOST ‘를 설정하는 것이 포함됩니다.

파일을 저장하고 vim을 종료합니다.

전체 예제를 github에서 확인할 수 있습니다.

5단계 - Docker-Compose 실행하기

이제 docker-compose를 실행할 준비가 되었습니다. 주의: docker-compose를 실행하려면 docker-compose 프로젝트 디렉토리에 있어야 하며, 구성 파일이 있는 yml 파일이 있어야 합니다.

LEMP 스택을 시작하기 위해 아래 명령어를 실행합니다:

docker-compose up -d

-d: 데몬 또는 백그라운드로 실행

새로운 컨테이너가 생성되었다는 결과를 볼 수 있으며, 아래 명령어로 확인합니다:

docker-compose ps

실행 중인 docker-compose

이제 우리는 Nginx, PHP-fpm, MariaDB 및 PHPMyAdmin을 실행하는 네 개의 컨테이너가 있습니다.

6단계 - 테스트

호스트에서 docker-proxy가 사용하는 포트를 확인합니다.

netstat -plntu

모든 도커 포트가 호스트에 매핑됨

Nginx 컨테이너에 대한 포트 80, MariaDB 컨테이너에 대한 포트 3306, php-fpm 컨테이너에 대한 포트 9000, PHPMyAdmin 컨테이너에 대한 포트 8080을 볼 수 있습니다.

웹 브라우저에서 포트 80에 접근하면 index.html 파일을 볼 수 있습니다.

http://serverip-address/

PHP-fpm이 실행 중인지 확인하고, 웹 브라우저에서 접근합니다.

http://serverip-address/info.php

php-fpm 도커 컨테이너가 작동 중입니다

MySQL 셸에서 MySQL 컨테이너에 접근합니다.

docker-compose exec mysql bash  
mysql -u root -p  
TYPE MYSQL PASSWORD: hakase-labs123

이제 새 데이터베이스를 생성합니다:

create database hakase_db;  
exit

MariaDB mysql 셸 컨테이너에 접근할 수 있으며, 우리는 ‘ hakase_db ‘라는 새 데이터베이스를 생성했습니다.

mysql 셸 도커 컨테이너에 접근

다음으로, 포트 8080에서 PHPMyAdmin에 접근합니다: http://serverip-address:8080/.

PHPMyAdmin 로그인 페이지가 표시되며, 사용자 이름 ‘ root ‘와 비밀번호 ‘ hakase-labs123 ‘를 입력합니다.

phpmyadmin 도커 컨테이너

PMA_HOST 환경 변수에 정의된 mysql 컨테이너에 자동으로 연결됩니다.

Go ‘를 클릭하면 ‘ mysql ‘ 컨테이너에 연결된 phpmyadmin 대시보드를 볼 수 있습니다.

phpmyadmin과 mysql 도커 컨테이너가 작동 중입니다

성공입니다! LEMP 스택이 네 개의 컨테이너로 구성된 docker-compose 설정 하에 실행되고 있습니다.

참고

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.