도커 가이드 · 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 --versionDocker-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 - hakasecompose 환경을 위한 새 디렉토리를 생성합니다.
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
이제 우리는 Nginx, PHP-fpm, MariaDB 및 PHPMyAdmin을 실행하는 네 개의 컨테이너가 있습니다.
6단계 - 테스트
호스트에서 docker-proxy가 사용하는 포트를 확인합니다.
netstat -plntu
Nginx 컨테이너에 대한 포트 80, MariaDB 컨테이너에 대한 포트 3306, php-fpm 컨테이너에 대한 포트 9000, PHPMyAdmin 컨테이너에 대한 포트 8080을 볼 수 있습니다.
웹 브라우저에서 포트 80에 접근하면 index.html 파일을 볼 수 있습니다.
PHP-fpm이 실행 중인지 확인하고, 웹 브라우저에서 접근합니다.
http://serverip-address/info.php

MySQL 셸에서 MySQL 컨테이너에 접근합니다.
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: hakase-labs123이제 새 데이터베이스를 생성합니다:
create database hakase_db;
exitMariaDB mysql 셸 컨테이너에 접근할 수 있으며, 우리는 ‘ hakase_db ‘라는 새 데이터베이스를 생성했습니다.

다음으로, 포트 8080에서 PHPMyAdmin에 접근합니다: http://serverip-address:8080/.
PHPMyAdmin 로그인 페이지가 표시되며, 사용자 이름 ‘ root ‘와 비밀번호 ‘ hakase-labs123 ‘를 입력합니다.

PMA_HOST 환경 변수에 정의된 mysql 컨테이너에 자동으로 연결됩니다.
‘ Go ‘를 클릭하면 ‘ mysql ‘ 컨테이너에 연결된 phpmyadmin 대시보드를 볼 수 있습니다.

성공입니다! LEMP 스택이 네 개의 컨테이너로 구성된 docker-compose 설정 하에 실행되고 있습니다.
참고
- https://hub.docker.com/r/bitnami/nginx/
- https://hub.docker.com/r/bitnami/php-fpm/
- https://hub.docker.com/_/mariadb/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://docs.docker.com/compose/
- https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
- https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.