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 /opt

WordPress 구성용 디렉토리를 생성합니다.

$ 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.yml

volumes: 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.yml

volumes: 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                                                        wordpressdb

URL https://example.com를 열어 WordPress 설치 프로그램을 시작합니다.

WordPress 설치 프로그램 언어 선택

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

WordPress 설치 프로그램 사이트 세부정보

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

WordPress 설치 성공

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

WordPress 로그인 페이지

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

WordPress 대시보드

이제 WordPress를 사용할 수 있습니다.

7단계 - PhpMyAdmin에 접근

URL https://phpmyadmin.example.com을 통해 phpMyAdmin에 접근할 수 있습니다.

phpMyAdmin 로그인 페이지

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

phpMyAdmin 대시보드

이제 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 version

Linux의 별칭은 임시입니다. 별칭을 영구적으로 만들려면 ~/.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
Share: X/Twitter LinkedIn

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

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