wordpress 구성의 필요성을 느껴 docker-compose로 구성해보고 방법을 정리해본다. 보통은 호스팅 업체(카페24, 클라우드웨이즈 등)를 사용해 wordpress를 구성하는데 여러개를 동시에 운영하는 것을 고려하고 있다보니 비용이 많이 발생할 것 같아 서버 하나를 마련해 여러 wordpress를 구성하려 한다. 여러 wordpress가 하나의 db에 database를 개별적으로 사용하는 방식으로 구성하고, https를 위해 wordpress 하나마다 swag를 사용하여 구성하였다.
구조

- 서버 하나로 구성 (현재는 AWS 사용)
- 향후 리소스 문제 발생 시 DB를 별도의 서버에 분리 예정
- Ubuntu 22.04 LTS 기준
- SSL 인증서 적용(https) 및 자동갱신을 위해 swag 사용
- swag - wordpress 를 하나의 docker-compose 파일로 구성
- 통신 흐름은 swag → wordpress → mariadb
- wordpress에 사용할 domain은 미리 구입 필요
- 본 글에서는 blog1 기준으로 설명
설치 과정
1. docker 및 docker-compose 설치
# docker 설치
curl -fsSL https://get.docker.com/ | sh
# sudo 없이 docker 사용하기 위한 설정
sudo usermod -aG docker ${USER}
# apt repository 업데이트
sudo apt update
# docker-compose 설치
sudo apt install docker-compose
# docker-compose 설치 확인
docker-compose -v
2. mariadb 설치 및 database 생성
2-1. 작업 디렉토리 생성
mkdir ~/mariadb && cd ~/mariadb
vi docker-compose.yml
2-2. docker-compose 파일 작성
version: '3.1'
services:
mariadb:
container_name: mariadb
image: mariadb
restart: always
volumes:
- ./data:/var/lib/mysql
- ./config:/etc/mysql/conf.d
environment:
MARIADB_ROOT_PASSWORD: password # 원하는 패스워드
TZ: Asia/Seoul
networks:
- wordpress
networks:
wordpress:
external: true
- services : mariadb container 생성 관련 정보들 (container 이름, 경로, 루트 비밀번호 등)
- networks : 뒤에서 생성할 swag, wordpress container들과 생성하기 위한 외부 네트워크 정의 (wordpress)
2-3. mariadb 실행 및 접근
# mariadb 실행
docker-compose up -d
# docker exec -it [container_name] mariadb --user root -p[설정한 password]
docker exec -it mariadb mariadb --user root -ppassword
2-4. database 생성
# create database [database 이름]
create database wordpress_blog1
blog1이 사용할 database 생성
3. swag 및 wordpress 설치
3-1. 작업 디렉토리 생성
mkdir -p ~/wordpress/blog1 && cd ~/wordpress/blog1
vi docker-compose.yml
3-2. docker-compose.yml 작성
version: '3.1'
services:
swag-blog1:
image: linuxserver/swag
container_name: swag-blog1
depends_on:
- wordpress-blog1
restart: unless-stopped
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- EMAIL=email # email 입력
- URL=domain # domain 입력
- EXTRA_DOMAINS=domain # domain 입력
- VALIDATION=http
- TZ=Asia/Seoul
volumes:
- ./config:/config
ports:
- 443:443
- 80:80
networks:
- wordpress
wordpress-blog1:
container_name: wordpress-blog1
image: wordpress
restart: always
ports:
- 8080:80
volumes:
- ./config/www/wordpress:/var/www/html
networks:
- wordpress
networks:
wordpress:
external: true
3-3. swag 및 wordpress 실행 및 정지
docker-compose up -d
docker-compose stop
- docker-compose up -d 명령을 실행하면 docker 이미지를 다운받아 container를 만들어 실행
- 실행 과정에서 필요한 파일들을 같이 다운받아서 적절한 디렉토리에 위치시킴
- 설정파일들 수정을 위해 docker-compose stop
3-4. swag 내 nginx 설정 수정
vi config/nginx/site-confs/default.conf
default.conf 내 아래 내용 수정
...
# main server block
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name blog1_domain; # blog1 domain으로 변경
include /config/nginx/ssl.conf;
root /config/www/wordpress; # wordpress /var/www/html 마운트 위치로 변경
index index.html index.htm index.php;
...
location / {
...
try_files $uri $uri/ /index.html /index.php$is_args$args; # =404 삭제
}
...
}
- root /config/www/wordpress
- swag, wordpress의 docker-compose.yml 내 wordpress volumes 위치를 넣으면 된다
위 내용에 따르면 - ./config/www/wordpress:/var/www/html 이므로 /config/www/wordpress
- swag, wordpress의 docker-compose.yml 내 wordpress volumes 위치를 넣으면 된다
3-5. wordpress 내 db 연결 설정
vi config/www/wordpress/wp-config.php
아래 내용 찾아서 수정
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', '[database 이름]') ); // wordpress_blog1
/** Database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'root') );
/** Database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', '[DB 비밀번호]') ); // password
...
/** Database hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', '[DB 컨테이너 정보]') ); // mariadb:3306
- WORDPRESS_DB_NAME : docker exec 통해 mariadb 내에 생성해준 database 이름
- WORDPRESS_DB_USER : 변경하지 않았다면 root
- WORDPRESS_DB_PASSWORD : mariadb docker-compose 파일 내 MARIADB_ROOT_PASSWORD 값
- WORDPRESS_DB_HOST : mariadb 컨테이너 이름과 포트(기본 3306) 정보
3-6. swag 및 wordpress 실행
docker-compose up -d
wordpress 접속
브라우저를 통해 구입한 도메인으로 접속해보면 wordpress 설치 화면이 뜰 것이다. 내용 설정 후 사용하면 된다. 다음에는 wordpress 추천 플러그인에 대한 내용을 남겨보려 한다.
wordpress 구성의 필요성을 느껴 docker-compose로 구성해보고 방법을 정리해본다. 보통은 호스팅 업체(카페24, 클라우드웨이즈 등)를 사용해 wordpress를 구성하는데 여러개를 동시에 운영하는 것을 고려하고 있다보니 비용이 많이 발생할 것 같아 서버 하나를 마련해 여러 wordpress를 구성하려 한다. 여러 wordpress가 하나의 db에 database를 개별적으로 사용하는 방식으로 구성하고, https를 위해 wordpress 하나마다 swag를 사용하여 구성하였다.
구조

- 서버 하나로 구성 (현재는 AWS 사용)
- 향후 리소스 문제 발생 시 DB를 별도의 서버에 분리 예정
- Ubuntu 22.04 LTS 기준
- SSL 인증서 적용(https) 및 자동갱신을 위해 swag 사용
- swag - wordpress 를 하나의 docker-compose 파일로 구성
- 통신 흐름은 swag → wordpress → mariadb
- wordpress에 사용할 domain은 미리 구입 필요
- 본 글에서는 blog1 기준으로 설명
설치 과정
1. docker 및 docker-compose 설치
# docker 설치
curl -fsSL https://get.docker.com/ | sh
# sudo 없이 docker 사용하기 위한 설정
sudo usermod -aG docker ${USER}
# apt repository 업데이트
sudo apt update
# docker-compose 설치
sudo apt install docker-compose
# docker-compose 설치 확인
docker-compose -v
2. mariadb 설치 및 database 생성
2-1. 작업 디렉토리 생성
mkdir ~/mariadb && cd ~/mariadb
vi docker-compose.yml
2-2. docker-compose 파일 작성
version: '3.1'
services:
mariadb:
container_name: mariadb
image: mariadb
restart: always
volumes:
- ./data:/var/lib/mysql
- ./config:/etc/mysql/conf.d
environment:
MARIADB_ROOT_PASSWORD: password # 원하는 패스워드
TZ: Asia/Seoul
networks:
- wordpress
networks:
wordpress:
external: true
- services : mariadb container 생성 관련 정보들 (container 이름, 경로, 루트 비밀번호 등)
- networks : 뒤에서 생성할 swag, wordpress container들과 생성하기 위한 외부 네트워크 정의 (wordpress)
2-3. mariadb 실행 및 접근
# mariadb 실행
docker-compose up -d
# docker exec -it [container_name] mariadb --user root -p[설정한 password]
docker exec -it mariadb mariadb --user root -ppassword
2-4. database 생성
# create database [database 이름]
create database wordpress_blog1
blog1이 사용할 database 생성
3. swag 및 wordpress 설치
3-1. 작업 디렉토리 생성
mkdir -p ~/wordpress/blog1 && cd ~/wordpress/blog1
vi docker-compose.yml
3-2. docker-compose.yml 작성
version: '3.1'
services:
swag-blog1:
image: linuxserver/swag
container_name: swag-blog1
depends_on:
- wordpress-blog1
restart: unless-stopped
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- EMAIL=email # email 입력
- URL=domain # domain 입력
- EXTRA_DOMAINS=domain # domain 입력
- VALIDATION=http
- TZ=Asia/Seoul
volumes:
- ./config:/config
ports:
- 443:443
- 80:80
networks:
- wordpress
wordpress-blog1:
container_name: wordpress-blog1
image: wordpress
restart: always
ports:
- 8080:80
volumes:
- ./config/www/wordpress:/var/www/html
networks:
- wordpress
networks:
wordpress:
external: true
3-3. swag 및 wordpress 실행 및 정지
docker-compose up -d
docker-compose stop
- docker-compose up -d 명령을 실행하면 docker 이미지를 다운받아 container를 만들어 실행
- 실행 과정에서 필요한 파일들을 같이 다운받아서 적절한 디렉토리에 위치시킴
- 설정파일들 수정을 위해 docker-compose stop
3-4. swag 내 nginx 설정 수정
vi config/nginx/site-confs/default.conf
default.conf 내 아래 내용 수정
...
# main server block
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name blog1_domain; # blog1 domain으로 변경
include /config/nginx/ssl.conf;
root /config/www/wordpress; # wordpress /var/www/html 마운트 위치로 변경
index index.html index.htm index.php;
...
location / {
...
try_files $uri $uri/ /index.html /index.php$is_args$args; # =404 삭제
}
...
}
- root /config/www/wordpress
- swag, wordpress의 docker-compose.yml 내 wordpress volumes 위치를 넣으면 된다
위 내용에 따르면 - ./config/www/wordpress:/var/www/html 이므로 /config/www/wordpress
- swag, wordpress의 docker-compose.yml 내 wordpress volumes 위치를 넣으면 된다
3-5. wordpress 내 db 연결 설정
vi config/www/wordpress/wp-config.php
아래 내용 찾아서 수정
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', '[database 이름]') ); // wordpress_blog1
/** Database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'root') );
/** Database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', '[DB 비밀번호]') ); // password
...
/** Database hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', '[DB 컨테이너 정보]') ); // mariadb:3306
- WORDPRESS_DB_NAME : docker exec 통해 mariadb 내에 생성해준 database 이름
- WORDPRESS_DB_USER : 변경하지 않았다면 root
- WORDPRESS_DB_PASSWORD : mariadb docker-compose 파일 내 MARIADB_ROOT_PASSWORD 값
- WORDPRESS_DB_HOST : mariadb 컨테이너 이름과 포트(기본 3306) 정보
3-6. swag 및 wordpress 실행
docker-compose up -d
wordpress 접속
브라우저를 통해 구입한 도메인으로 접속해보면 wordpress 설치 화면이 뜰 것이다. 내용 설정 후 사용하면 된다. 다음에는 wordpress 추천 플러그인에 대한 내용을 남겨보려 한다.