웹사이트 검색

Docker Compose로 WordPress를 설치하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 16.04(Xenial Xerus)

이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Docker 및 Docker Compose 설치
  4. 3단계 - WordPress용 Docker Compose 파일 만들기
  5. 4단계 - Nginx용 Docker Compose 업데이트
  6. 5단계 - SSL용 Docker Compose 업데이트
  7. 6단계 - WordPress 시작 및 설치
  8. 7단계 - PhpMyAdmin 액세스
  9. 8단계 - WP-CLI에 액세스
  10. 9단계 - WordPress 백업
  11. 10단계 - WordPress 업그레이드
  12. 결론

WordPress는 세계에서 가장 인기 있는 블로깅 플랫폼입니다. Shell 명령, 스크립트를 사용한 수동 설치 또는 널리 사용되는 웹 호스트에서 제공하는 웹 설치 프로그램을 사용하여 WordPress를 설치하는 방법은 많습니다. WordPress를 실행하려면 LAMP(Linux, Apache, MySQL 및 PHP) 또는 LEMP(Linux, Nginx, MySQL 및 PHP) 스택을 설치해야 합니다.

이 튜토리얼은 Docker/Docker Compose를 사용하여 WordPress를 설치하는 방법을 알려줍니다. Docker를 사용하면 기본 스택을 설치하는 프로세스가 훨씬 쉬워집니다. 동일한 구성을 사용하여 여러 서버에 WordPress를 빠르게 설치할 수 있습니다. 또한 SSL을 통해 사이트를 제공하기 위해 Nginx 프록시 서버와 함께 데이터베이스 관리를 위한 phpMyAdmin 도구를 설치합니다.

전제 조건

  • A Linux server with a non-root user having sudo privileges. We are using a server running Ubuntu 22.04 for our tutorial.

  • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use example.com as the domain name for the WordPress site and phpmyadmin.example.com for the phpMyAdmin website.

  • Make sure everything is updated.

    $ sudo apt update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

1단계 - 방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. 우분투는 기본적으로 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 Mon 2023-01-09 13:19:16 UTC; 9s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 1863 (dockerd)
      Tasks: 7
     Memory: 20.5M
        CPU: 278ms
     CGroup: /system.slice/docker.service
             ??1863 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

기본적으로 Docker에는 루트 권한이 필요합니다. sudo 명령을 실행할 때마다 sudo를 사용하지 않으려면 docker 명령에 사용자 이름을 추가하세요. > 그룹.

$ sudo usermod -aG docker $(whoami)

이 변경 사항을 활성화하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인하거나 다음 명령을 사용해야 합니다.

$ su - ${USER}

사용자가 Docker 그룹에 추가되었는지 확인합니다.

$ groups
navjot wheel docker

3단계 - WordPress용 Docker Compose 파일 만들기

WordPress 구성을 위한 디렉터리를 만듭니다.

$ mkdir wordpress

디렉터리로 전환합니다.

$ cd wordpress

편집을 위해 Docker 작성 파일을 만들고 엽니다.

$ nano docker-compose.yml

다음 코드를 붙여넣습니다.

version: '3.9'

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 사이트에 대한 Lets encrypt SSL 도메인을 정의했습니다.

더 많은 환경 변수를 추가하고 사용자 지정 wp-config.php 데이터를 Docker 파일에 추가할 수 있습니다. WordPress DockerHub 페이지에서 추가 환경 변수에 대해 알아볼 수 있습니다.

다음 이미지는 동일한 MySQL 이미지에 의존하고 루트 암호를 사용하여 연결하는 phpMyAdmin용입니다. 50MB의 업로드 제한이 있습니다. 요구 사항 및 데이터베이스 크기에 따라 변경할 수 있습니다. WordPress 사이트와 마찬가지로 Nginx 가상 호스트 도메인을 정의하고 phpMyAdmin 사이트의 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 구성을 추가하기 위해 위에서 사용한 가상 호스트용 디렉터리를 생성했습니다. 여기에서 WordPressphpMyAdmin 사이트에 대한 파일 업로드 크기를 구성했습니다. 사이트의 도메인 이름은 이전 단계에서 정의한 환경 변수에서 선택됩니다.

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: 

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

여기서는 Nginx 프록시와 함께 작동하는 Acme 컴패니언 Docker 이미지를 가져옵니다. Nginx 컨테이너에서 볼륨을 가져옵니다. Lets encrypt SSL과 관련된 모든 구성을 저장하는 acme.sh 도구의 볼륨도 정의합니다. 마지막으로 SSL 인증서를 Lets 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를 사용할 수 있습니다.

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 version

Linux의 별칭은 일시적입니다. 별칭을 영구적으로 만들려면 ~/.bashrc 파일을 편집해야 합니다. 편집을 위해 엽니다.

$ nano ~/.bashrc

파일 끝에 다음 줄을 붙여넣습니다.

# Custom aliases
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"_"%H_%M_%S`.sql >/dev/null
Enter password: password

위의 명령은 ~/wordpress/wp-data 디렉토리에 SQL 백업을 생성합니다.

디렉토리 내용을 확인하십시오.

$ ls -al wp-data
total 908
drwxr-xr-x 2 root   root     4096 Jan 11 10:15 ./
drwxrwxr-x 6 navjot navjot   4096 Jan 11 10:05 ../
-rw-r--r-- 1 root   root   919814 Jan 11 10:14 data_11-01-2023_10_14_40.sql

디렉터리에 백업된 데이터베이스를 볼 수 있습니다. phpMyAdmin 도구 또는 다음 명령을 사용하여 이 데이터베이스를 복원할 수 있습니다.

$ docker compose exec db sh -c "exec mysql -uroot -p" < wp-data/data_11-01-2023_10_14_40.sql

크론 작업을 생성하여 정기적으로 데이터베이스를 백업할 수 있습니다.

/etc/cron.daily 디렉터리에 백업 스크립트를 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/cron.daily/wpbackup.sh

다음 코드를 붙여넣습니다.

#!/bin/bash
docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

스크립트를 실행 가능하게 만드십시오.

$ sudo chmod +x /etc/cron.daily/wpbackup.sh

이제 데이터베이스가 매일 백업됩니다.

10단계 - WordPress 업그레이드

WordPress를 업그레이드하는 가장 쉬운 방법은 내장 업데이트 프로그램을 사용하는 것입니다. Docker를 사용하여 업그레이드할 수도 있습니다. 첫 번째 단계는 9단계의 명령을 사용하여 WordPress 데이터베이스를 백업하는 것입니다.

그런 다음 디렉터리로 전환합니다.

$ cd ~/wordpress

컨테이너를 중지합니다.

$ docker compose down --remove-orphans

최신 컨테이너 이미지를 가져옵니다.

$ docker compose pull

원하는 경우 docker-compose.yml을 변경합니다.

WordPress 컨테이너를 다시 시작합니다.

$ docker compose up -d

결론

이것으로 Docker Compose, phpMyAdmin 및 WP-CLI를 사용하여 WordPress를 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.