당신의 WordPress 웹사이트 배포를 간소화하세요. 우리의 쉽게 따라갈 수 있는 안내서를 통해 Docker Compose, Nginx, Apache, SSL을 사용하여 원활한 설치 과정을 경험하세요.
또한 볼륨을 생성하여 컨테이너가 재시작되더라도 변경 사항이나 업데이트가 보존되도록 할 것입니다.
이 설정은 Google 클라우드에서 Ubuntu 22.04 OS를 실행하는 인스턴스에서 테스트되었습니다. 이 설정을 AWS, Azure, DigitalOcean 또는 어떤 전용 서버나 VPS 서버에서도 구축할 수 있습니다.
사전 준비
위에서 언급한 모든 단계를 완료했는지 확인하세요.
- 도메인을 서버 IP 주소로 포인팅했는지 확인하세요.
- Docker가 설치되어 구성되었는지 확인하세요.
- Docker Compose가 설치되어 구성되었는지 확인하세요.
모든 사전 준비가 완료되면 WordPress 설정 및 구성을 진행할 수 있습니다.
프로젝트 디렉토리 생성
서버에 SSH로 접속하여 wp-project
라는 이름의 새 프로젝트 디렉토리를 시작합니다. 필요에 따라 이름을 임의로 변경할 수 있습니다.
mkdir wp-project
Docker Compose YML 파일 생성
이제 프로젝트 디렉토리 내부로 이동하여 다음과 같은 구성으로 새 docker-compose.yml 파일을 생성하세요.
cd wp-project
새 docker-compose.yml
파일을 생성하세요.
nano docker-compose.yml
파일에 아래 내용을 전체 복사하여 붙여넣으세요.
도커 컴포즈 설정
다음에 언급된 환경 변수를 반드시 교체하십시오.
docker-compose.ymlversion: "3.9"
services:
wordpress:
container_name: wordpress
image: wordpress:php8.2-apache
restart: always
stdin_open: true
tty: true
environment:
WORDPRESS_DB_HOST: mariadb
WORDPRESS_DB_USER: db_user
WORDPRESS_DB_PASSWORD: db_user_pass
WORDPRESS_DB_NAME: db_name
volumes:
- wordpress_data:/var/www/html
mariadb:
container_name: mariadb
image: mariadb
restart: always
environment:
MYSQL_DATABASE: db_name
MYSQL_USER: db_user
MYSQL_PASSWORD: db_user_pass
MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
volumes:
- db_data:/var/lib/mysql
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./certbot/conf:/etc/nginx/ssl
- ./certbot/data:/var/www/html
certbot:
container_name: certbot
image: certbot/certbot:latest
command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email -d domain.com -d www.domain.com
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/logs:/var/log/letsencrypt
- ./certbot/data:/var/www/html
volumes:
db_data:
wordpress_data:
파일을 저장하고 종료하려면 CTRL-X
를 누른 후 Y
와 ENTER
를 누르세요.
도커 컴포즈 설정: 설명
여기 설정 상세가 있습니다:
- 버전: 도커 엔진과 호환되는 컴포즈 파일 버전을 작성하십시오. 호환성을 확인할 수 있습니다 여기.
- 서비스: 여기서 우리는
WordPress
,MariaDB
,nginx
, 그리고certbot
이라는 네 가지 서비스를 갖습니다. - 이미지: 우리는 Docker 허브에서 사용 가능한 최신 WordPress와 PHP 8.2, Apache, Mariadb, Nginx, 그리고 Certbot 이미지를 사용합니다.
- 볼륨:
wordpress_data
: 이 디렉토리를 컨테이너 내부에서 웹 루트로 사용하고자 하는 디렉토리와 동기화하도록 설정했습니다.conf
: 여기에 Nginx 구성 파일을 배치하여 컨테이너 내부의 기본 Nginx conf.d 폴더와 동기화할 것입니다.cedtbot/conf
: 이곳에 SSL 인증서를 받아들이고, 이것을 컨테이너 내부에서 원하는 폴더와 동기화할 것입니다.ports
: 컨테이너가 나열된 포트에서 수신 대기하도록 구성합니다.command
: SSL 인증서를 받아들이는 데 사용되는 명령어입니다.
- 환경: 여기에서는 WordPress 이미지에 사용 가능한 모든 환경 변수를 나열합니다.
WORDPRESS_DB_HOST
: 여기서는 MariaDB 컨테이너의 서비스 이름을 사용합니다.WORDPRESS_DB_USER
: mariadb 서비스에서 구성한 것과 동일합니다.WORDPRESS_DB_PASSWORD
: mariadb 서비스에서 구성한 것과 동일합니다.WORDPRESS_DB_NAME
: mariadb 서비스에서 구성한 것과 동일합니다.
Nginx 구성
docker-compose.yml 구성에 따라 nginx/conf
디렉토리 내에 default.conf
파일을 생성해야 합니다.
docker-compose.yml
파일 옆에 구성 파일을 보관할 디렉토리를 생성합니다.
mkdir -p nginx/conf
default.conf
라는 이름의 파일을 생성합니다.
nano nginx/conf/default.conf
다음 구성을 넣으십시오. 여기서는 Apache를 실행하는 wordpress 컨테이너에 역방향 프록시 구성을 사용합니다.
nginx/conf/default.conf server {
listen [::]:80;
listen 80;
server_name domain.com www.domain.com;
root /var/www/html;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri @apache;
}
location ~ ^/.user.ini {
deny all;
}
location ~* .(svg|svgz)$ {
types {}
default_type image/svg+xml;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location @apache {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://wordpress:80;
}
location ~[^?]*/$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://wordpress:80;
}
location ~ .php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://wordpress:80;
}
}
CTRL-X
를 누른 후 Y
와 ENTER
를 눌러 파일을 저장하고 종료합니다.
이제 도커 컴포즈 구성과 Nginx 구성을 준비했습니다.
도커 컴포즈로 WordPress 배포하기
다음 명령어를 사용하여 컨테이너를 시작하세요. 컨테이너가 시작되면 SSL 인증서를 받게 됩니다.
docker-compose up -d
모든 컨테이너가 시작되면 certbot
과 WordPress
라는 두 개의 추가 디렉토리가 docker-compose.yml
파일 옆에 생성됩니다.
wordpress
디렉토리는 모든 WordPress 웹사이트 소스 코드를 보관합니다.
certbot
디렉토리는 SSL 인증서와 관련된 모든 파일을 보관합니다.
컨테이너를 보려면 다음 명령을 실행하세요.
docker-compose ps
Nginx로 Let’s Encrypt SSL 구성하기
Let’s Encrypt SSL 인증서를 받았으니 HTTPS를 구성하고 HTTPS로 리디렉션을 설정할 수 있습니다.
default.conf
를 수정하여 다음과 같이 변경하세요.
nano nginx/conf/default.conf
nginx/conf/default.confserver {
listen [::]:80;
listen 80;
server_name domain.com www.domain;
return 301 https://www.domain.com$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name domain.com;
ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;
return 301 https://www.domain.com$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name www.domain.com;
ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;
root /var/www/html;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri @apache;
}
location ~ ^/.user.ini {
deny all;
}
location ~* .(svg|svgz)$ {
types {}
default_type image/svg+xml;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location @apache {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://wordpress:80;
}
location ~[^?]*/$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://wordpress:80;
}
location ~ .php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://wordpress:80;
}
}
파일을 저장하고 종료하려면 CTRL-X
를 누른 다음 Y
와 ENTER
를 누르세요.
이제 새 구성을 로드하기 위해 Nginx 서비스를 다시 시작할 수 있습니다.
docker-compose restart nginx
이제 브라우저에서 도메인 이름을 확인할 수 있습니다. HTTPS로 리디렉션되며 WordPress 설치 페이지가 표시되어 설치를 완료할 수 있습니다.
문제 해결
컨테이너에 SSH로 접근하여 에러 로그를 확인하기 위한 몇 가지 팁입니다.
도커 컨테이너에 SSH 접속하기
wordpress
컨테이너에 SSH로 접속하려면 아래 명령어를 사용하세요.
docker-compose exec wordpress /bin/bash
SSH로 nginx
컨테이너에 접속하려면 아래 명령어를 사용하십시오.
docker-compose exec nginx /bin/bash
컨테이너 로그 확인
docker-compose
를 사용하여 컨테이너의 로그를 확인하려면 아래 명령어를 사용하십시오.
docker-compose logs -f
컨테이너 재시작
restart
명령어를 쉽게 사용하여 컨테이너를 재시작할 수 있습니다.
docker-compose restart container_name
container_name
을 사용자의 컨테이너 이름(wordpress, nginx, certbot)으로 교체하십시오.
모든 Docker 컨테이너 중지
아래 명령어를 사용하여 모든 Docker 컨테이너를 중지할 수 있습니다.
docker-compose down
모든 컨테이너 및 볼륨 제거
아래 명령어를 사용하여 docker-compose로 모든 컨테이너와 그 볼륨을 제거할 수 있습니다.
docker compose rm -fv
모든 Docker 컨테이너 제거
다음 명령어를 사용하여 모든 컨테이너를 제거하십시오.
docker rm -f $(docker ps -a -q)
모든 볼륨 삭제
아래 명령어를 사용하여 모든 볼륨을 삭제할 수도 있습니다.
docker volume rm $(docker volume ls -q)
모든 컨테이너 시작
단일 Docker compose 명령어로 모든 컨테이너를 시작할 수 있습니다.
docker-compose up -d
결론
이제 Ubuntu 22.04에서 Docker 및 Docker Compose로 WordPress와 Nginx, Apache, PHP 8.2, MariaDB, Let’s Encrypt를 설치 및 설정하는 방법을 배웠습니다.
시간 내어 주셔서 감사합니다.
Source:
https://dzone.com/articles/wordpress-deployment-docker-nginx-apache-ssl