WordPress 설치 · 9 min read · Sep 10, 2025
Docker Compose로 WordPress 설치하는 방법

WordPress CMS (콘텐츠 관리 시스템)는 사용자가 웹사이트와 블로그를 위해 디지털 콘텐츠를 생성, 관리 및 게시할 수 있게 해주는 널리 사용되는 오픈 소스 플랫폼입니다. 2003년에 처음 출시된 WordPress는 현재 전 세계에서 가장 인기 있는 CMS로 성장하여 인터넷의 40% 이상의 웹사이트를 운영하고 있습니다. WordPress는 코딩 경험이 거의 없는 개인도 전문 품질의 웹사이트를 구축하고 유지할 수 있도록 하는 사용자 친화적인 인터페이스를 제공합니다. WordPress는 매우 사용자 정의가 가능하며, 수천 개의 테마와 플러그인이 제공되어 간단한 블로그부터 복잡한 전자상거래 사이트에 이르기까지 다양한 요구를 충족합니다. 강력한 커뮤니티 지원, 정기적인 업데이트 및 광범위한 문서화는 초보자와 경험이 풍부한 개발자 모두에게 신뢰할 수 있고 다재다능한 선택이 되게 합니다.
Docker는 경량의 휴대 가능한 컨테이너 내에서 애플리케이션의 배포, 확장 및 관리를 자동화하도록 설계된 오픈 소스 플랫폼입니다. 2013년에 도입된 Docker는 애플리케이션이 배포되는 위치에 관계없이 일관된 환경에서 실행될 수 있도록 하여 소프트웨어 개발에 혁신을 가져왔습니다. 컨테이너는 애플리케이션과 모든 종속성, 라이브러리 및 구성 파일을 묶어 다양한 환경에서 일관된 성능을 보장합니다. 이러한 컨테이너화는 개발 워크플로를 단순화하고 협업을 향상시키며 개발자가 애플리케이션을 원활하게 생성, 공유 및 실행할 수 있도록 하여 효율성을 높입니다. Docker의 생태계에는 Docker Swarm 및 Kubernetes와 같은 컨테이너 오케스트레이션 도구와 서비스가 포함되어 있어 대규모 컨테이너 배포 관리를 용이하게 하여 현대 DevOps 관행의 초석 기술이 됩니다.
이 튜토리얼에서는 Docker/Docker Compose를 사용하여 WordPress를 설치하는 방법을 배웁니다. Docker를 사용하면 선호하는 스택을 설치하는 과정이 훨씬 쉬워집니다. 동일한 구성을 사용하여 여러 서버에 WordPress를 빠르게 설치할 수 있습니다. 또한 SSL을 통해 사이트를 제공하기 위해 데이터베이스 관리를 위한 phpMyAdmin 도구와 Nginx 프록시 서버를 설치합니다.
전제 조건
- sudo 권한이 있는 비루트 사용자가 있는 Linux 서버. 본 튜토리얼에서는 Ubuntu 24.04를 실행하는 서버를 사용합니다.
- 서버를 가리키는 완전한 도메인 이름(FQDN). 본 튜토리얼에서는 WordPress 사이트의 도메인 이름으로
example.com을, phpMyAdmin 웹사이트의 도메인 이름으로phpmyadmin.example.com을 사용합니다. - 모든 것이 업데이트되었는지 확인합니다.
$ sudo apt update - 기본 유틸리티 패키지를 설치합니다. 일부는 이미 설치되어 있을 수 있습니다.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
1단계 - 방화벽 구성
첫 번째 단계는 방화벽을 구성하는 것입니다. Ubuntu는 기본적으로 ufw(간단한 방화벽)를 제공합니다.
방화벽이 실행 중인지 확인합니다.
$ sudo ufw status
다음과 같은 출력이 표시되어야 합니다.
Status: inactive
SSH 포트를 허용하여 방화벽을 활성화할 때 현재 연결이 끊어지지 않도록 합니다.
$ sudo ufw allow OpenSSH
HTTP 및 HTTPS 포트도 허용합니다.
$ sudo ufw allow http
$ sudo ufw allow https
방화벽을 활성화합니다.
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
방화벽 상태를 다시 확인합니다.
$ sudo ufw status
유사한 출력이 표시되어야 합니다.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
2단계 - Docker 및 Docker Compose 설치
Ubuntu 22.04에는 이전 버전의 Docker가 포함되어 있습니다. 최신 버전을 설치하려면 먼저 Docker GPG 키를 가져옵니다.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Docker 저장소 파일을 생성합니다.
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
시스템 저장소 목록을 업데이트합니다.
$ sudo apt update
최신 버전의 Docker를 설치합니다.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
실행 중인지 확인합니다.
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-07-19 17:11:19 UTC; 3s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 1163 (dockerd)
Tasks: 7
Memory: 21.9M
CPU: 221ms
CGroup: /system.slice/docker.service
??2803 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
기본적으로 Docker는 루트 권한이 필요합니다. docker 명령을 실행할 때마다 sudo를 사용하지 않으려면 사용자 이름을 docker 그룹에 추가합니다.
$ sudo usermod -aG docker $(whoami)
이 변경 사항을 활성화하려면 서버에서 로그아웃한 후 동일한 사용자로 다시 로그인하거나 다음 명령을 사용해야 합니다.
$ su - ${USER}
사용자가 Docker 그룹에 추가되었는지 확인합니다.
$ groups
navjot wheel docker
3단계 - WordPress용 Docker Compose 파일 생성
저는 전체 Docker WordPress 설치를 /opt에 할 것입니다. 필요에 따라 /var 또는 /home과 같은 다른 위치를 선택할 수 있습니다.
cd /optWordPress 구성용 디렉토리를 생성합니다.
$ mkdir wordpress디렉토리로 이동합니다.
$ cd wordpress편집을 위해 Docker compose 파일을 생성하고 엽니다.
$ nano docker-compose.yml다음 코드를 붙여넣습니다.
services:
wp:
image: wordpress:latest
container_name: wordpress-app
restart: unless-stopped
expose:
- 8080
volumes:
- ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
- ./wp-app:/var/www/html
#- ./plugin-name/trunk/:/var/www/html/wp-content/plugins/plugin-name # Plugin development
#- ./theme-name/trunk/:/var/www/html/wp-content/themes/theme-name # Theme development
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: "${DB_NAME}"
WORDPRESS_DB_USER: "${DB_USER_NAME}"
WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
VIRTUAL_HOST: example.com
LETSENCRYPT_HOST: example.com
depends_on:
- db
links:
- db
wpcli:
image: wordpress:cli
container_name: wpcli_app
volumes:
- ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
- ./wp-app:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: "${DB_NAME}"
WORDPRESS_DB_USER: "${DB_USER_NAME}"
WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
depends_on:
- db
- wp
pma:
image: phpmyadmin/phpmyadmin
container_name: pma
restart: unless-stopped
environment:
# https://docs.phpmyadmin.net/en/latest/setup.html#docker-environment-variables
PMA_HOST: db
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
UPLOAD_LIMIT: 50M
VIRTUAL_HOST: phpmyadmin.example.com
LETSENCRYPT_HOST: phpmyadmin.example.com
expose:
- 8081
links:
- db:db
db:
image: mysql:latest
container_name: wordpressdb
restart: unless-stopped
command: [
'--default_authentication_plugin=mysql_native_password',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
volumes:
- ./wp-data:/docker-entrypoint-initdb.d
- db_data:/var/lib/mysql
environment:
MYSQL_DATABASE: "${DB_NAME}"
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
MYSQL_USER: "${DB_USER_NAME}"
MYSQL_PASSWORD: "${DB_USER_PASSWORD}"
volumes:
db_data:
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
우리는 두 개의 WordPress 이미지를 가져옵니다. 하나는 웹사이트용이고 다른 하나는 WP-CLI 도구용입니다. 두 이미지는 MySQL 8.0 도커 이미지에 의존합니다. 여기에서 데이터베이스 자격 증명에 대한 환경 변수를 설정합니다. 우리는 두 개의 볼륨을 두 컨테이너에 대해 생성했으며, 하나는 WordPress 사이트의 공개 파일을 가리키고 다른 하나는 사용자 정의 PHP.ini 위치를 가리킵니다. 또한 Nginx 가상 호스트 도메인 및 WordPress 사이트의 Let’s encrypt SSL 도메인에 대한 환경 변수를 정의했습니다.
더 많은 환경 변수를 추가하고 Docker 파일에 사용자 정의 wp-config.php 데이터를 추가할 수 있습니다. 추가 환경 변수에 대한 정보는 WordPress DockerHub 페이지에서 확인할 수 있습니다.
다음 이미지는 phpMyAdmin용으로, 동일한 MySQL 이미지에 의존하며 루트 비밀번호를 사용하여 연결합니다. 업로드 제한은 50MB입니다. 필요와 데이터베이스 크기에 따라 변경할 수 있습니다. WordPress 사이트와 마찬가지로 Nginx 가상 호스트 도메인 및 phpMyAdmin 사이트의 Let’s encrypt SSL 도메인 이름을 정의했습니다.
마지막 이미지는 MySQL 데이터베이스용입니다. 기본 인증 방법 및 문자 집합을 설정하기 위해 몇 가지 명령을 전달했습니다. 데이터 저장을 위한 몇 개의 볼륨을 생성하고 데이터베이스 자격 증명에 대한 환경 변수를 설정했습니다.
다음 단계는 compose 파일에서 사용된 변수에 대한 환경 파일을 만드는 것입니다. 편집을 위해 환경 파일을 생성하고 엽니다.
$ sudo nano .env
다음 코드를 붙여넣습니다.
DB_NAME=wordpress
DB_USER_NAME=username
DB_USER_PASSWORD=userpassword
DB_ROOT_PASSWORD=password
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다. 변수를 원하는 사용자 이름과 비밀번호로 바꿉니다.
사용자 정의 php.ini 파일을 사용하여 PHP 구성을 사용자 정의할 수 있습니다.
PHP 구성용 폴더를 생성합니다.
$ mkdir config편집을 위해 php.conf.ini 파일을 생성하고 엽니다.
$ nano config/php.conf.ini다음 코드를 붙여넣습니다. 필요에 따라 값을 조정합니다. PhpMyadmin 컨테이너의 업로드 제한은 이 파일에서 사용하는 값과는 독립적입니다.
file_uploads = On
memory_limit = 500M
upload_max_filesize = 30M
post_max_size = 30M
max_execution_time = 600
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
4단계 - Nginx용 Docker Compose 업데이트
Nginx 구성용 디렉토리를 생성합니다.
$ mkdir nginx해당 디렉토리 내에 가상 호스트용 디렉토리를 생성합니다.
$ mkdir nginx/vhost편집을 위해 nginx/vhost/wordpress.example.com을 생성하고 엽니다.
$ nano nginx/vhost/wordpress.example.com다음 코드를 붙여넣습니다.
server_tokens off;
client_max_body_size 30m;
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
nginx/vhost/phpmyadmin.example.com 파일에 대해서도 동일한 작업을 수행합니다.
$ nano nginx/vhost/phpmyadmin.example.com다음 코드를 붙여넣습니다.
server_tokens off;
client_max_body_size 50m;
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
Docker compose 파일을 다시 엽니다.
$ nano docker-compose.ymlvolumes: db_data: 줄 앞에 다음 코드를 붙여넣습니다.
nginx:
container_name: nginx
image: nginxproxy/nginx-proxy
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx/html:/usr/share/nginx/html
- ./nginx/certs:/etc/nginx/certs
- ./nginx/vhost:/etc/nginx/vhost.d
logging:
options:
max-size: "10m"
max-file: "3"
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
위 코드에서는 Nginx 프록시 Docker 이미지를 가져오고 포트 80과 443을 호스트 컨테이너에 노출하여 외부와 연결하는 데 사용합니다. Nginx HTML 페이지, 모든 SSL 인증서가 저장될 디렉토리 및 위에서 추가 Nginx 구성을 위해 사용된 가상 호스트 디렉토리에 대한 볼륨도 생성했습니다. WordPress 및 phpMyAdmin 사이트의 파일 업로드 크기를 구성했습니다. 사이트 도메인 이름은 이전 단계에서 정의한 환경 변수에서 가져옵니다.
5단계 - SSL을 위한 Docker Compose 업데이트
편집을 위해 Docker compose 파일을 엽니다.
$ nano docker-compose.ymlvolumes: db_data: 줄 앞에 다음 코드를 붙여넣습니다.
acme-companion:
container_name: acme-companion
image: nginxproxy/acme-companion
restart: unless-stopped
volumes_from:
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./nginx/acme:/etc/acme.sh
environment:
DEFAULT_EMAIL: [email protected]
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
여기서는 Nginx 프록시와 함께 작동하는 Acme companion Docker 이미지를 가져옵니다. Nginx 컨테이너에서 볼륨을 가져옵니다. 또한 Let’s Encrypt SSL에 대한 모든 구성을 저장하는 acme.sh 도구에 대한 볼륨을 정의합니다. 마지막으로 SSL 인증서를 Let’s Encrypt에 등록하기 위해 환경 변수를 정의합니다.
6단계 - WordPress 시작 및 설치
이제 모든 구성 파일이 완료되었으므로 컨테이너를 시작하고 실행할 시간입니다.
$ docker compose up -d몇 분 기다린 후 컨테이너 상태를 확인합니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1e8a9b5169d nginxproxy/acme-companion "/bin/bash /app/entr…" 14 seconds ago Up 7 seconds acme-companion
8a37c78ff790 wordpress:latest "docker-entrypoint.s…" 14 seconds ago Up 7 seconds 80/tcp, 8080/tcp wordpress-app
4f9c777c97c2 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 14 seconds ago Up 7 seconds 80/tcp, 8081/tcp pma
1b1dede46b07 nginxproxy/nginx-proxy "/app/docker-entrypo…" 14 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx
b9cf64a2f4a3 mysql:latest "docker-entrypoint.s…" 14 seconds ago Up 11 seconds 3306/tcp, 33060/tcp wordpressdbURL https://example.com를 열어 WordPress 설치 프로그램을 시작합니다.

언어를 선택하고 계속 버튼을 클릭하여 다음 페이지로 진행합니다.

사이트 세부정보를 입력하고 사용자 이름, 비밀번호 및 이메일 주소를 선택한 후 WordPress 설치 버튼을 클릭하여 설치를 시작합니다.

설치 성공 페이지로 이동합니다. 로그인 버튼을 클릭하여 로그인 페이지로 이동합니다.

로그인 세부정보를 입력하고 로그인 버튼을 클릭하여 WordPress 대시보드로 이동합니다.

이제 WordPress를 사용할 수 있습니다.
7단계 - PhpMyAdmin에 접근
URL https://phpmyadmin.example.com을 통해 phpMyAdmin에 접근할 수 있습니다.

사용자 이름으로 root를 입력하고 루트 비밀번호를 입력한 후 로그인을 클릭하여 대시보드로 이동합니다.

이제 phpMyAdmin을 사용할 수 있습니다.
8단계 - WP-CLI에 접근
다음 명령을 사용하여 WP-CLI에 접근할 수 있습니다.
$ docker compose run --rm wpcli cli version다음과 같은 출력이 표시됩니다.
[+] Running 2/0
? Container wordpressdb Running 0.0s
? Container wordpress-app Running 0.0s
WP-CLI 2.7.1매번 이렇게 긴 명령을 입력하지 않도록 Linux의 별칭 기능을 사용할 수 있습니다.
$ alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"이제 컨테이너 내에서 어디서든 다음 명령을 입력할 수 있습니다.
$ wp cli versionLinux의 별칭은 임시입니다. 별칭을 영구적으로 만들려면 ~/.bashrc 파일을 편집해야 합니다. 편집을 위해 엽니다.
$ nano ~/.bashrc파일 끝에 다음 줄을 붙여넣습니다.
# 사용자 정의 별칭
alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력합니다.
구성을 다시 로드하려면 파일의 소스를 가져옵니다.
$ source ~/.bashrc이제 WP-CLI를 사용할 수 있습니다.
9단계 - WordPress 백업
WordPress를 백업하는 방법은 여러 가지가 있습니다. 가장 쉬운 방법은 플러그인을 사용하는 것입니다. 이를 위한 여러 플러그인이 있습니다. phpMyAdmin을 사용하여 백업을 생성할 수도 있습니다.
명령줄을 사용하여 WordPress 데이터베이스를 백업할 수도 있습니다. WordPress 디렉토리로 이동합니다.
$ cd ~/wordpress다음 명령을 사용하여 WordPress 데이터베이스를 백업합니다. MySQL 루트 비밀번호를 입력하라는 메시지가 표시됩니다.
$ docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | sudo tee wp-data/data_`date +%d-%m-%Y새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.