다시 만나서 반갑습니다. 오랜만입니다.
도커 그리고 워드프레스로 돌아온 길포스입니다. 오늘은 도커와 워드프레스에 대해서 알아보도록 하겠습니다.
2023년, 12월 08일 자바스크립트 관련 포스팅 이후 1년 동안 방치했다가 글 쓰네요.
자주 자주 써야지 했는데, 생각보다 블로그 운영이 쉽지가 않네요. 오늘은 도커를 활용해서 워드프레스를 구동하는 방법 설명 드리려고 합니다.
1년 동안 다들 어떻게 지내셨는지요?
저는 회사 + 개인적으로 이런 저런, 아이템을 개발하느라 시간을 많이 썼네요. 시간을 되돌려보면,
제가 이 사이트를 구축하고 만들 때, 열심히 매일 쓰려고 했는데 약속을 못 지킨 것은 스스로도 아쉽네요.
그래도 이제부터라도 다시 또 쓰려고 합니다.
1년 동안, 총 4개의 프로젝트를 진행하였네요. 22년도에 회사를 옮기면서 좀 편해질까? 했는데, 더 바쁘네요. 그래도 한가한 것보다 나은 것 같아요.
주로 AI 관련한 업무를 진행하였는데, 현 회사(스타트업)으로 이직 후 웹, 인프라, 백앤드까지 진행하였습니다.
다양한 기술들을 익히고 공부하고, 또 실전에서 적용하니 보람찬 1년이었습니다.
22년에는 Python으로 주로 텐서플로우와 파이토치로 모델 커스터마이징을 주로 진행하였습니다.
23년, 24년에는 회사에서 주로 Python, Django, DRF, Fastapi로 API 서버를 주로 만들고, React로 백-프론트랑 통신을 하는 것을 주로 하였네요.
데이터 송수신 모듈, API 모듈 등을 개발하다 보니, 점점 더 보안과, 속도에 집착하는 제 모습도 볼 수 있었습니다.
아, 그리고 사이드 프로젝트로 C++를 공부하고 있고, CS 자체에 대한 개념을 먼저 “정보처리기사”를 취득하였습니다.
(정처기 자격증 자체가 쓸모 없는 것이 아닙니다. 자격증 공부하면서 CS 개괄적인 요소는 찍먹 수준으로는 가능합니다.)
더 깊게 공부하려고 자료구조나 알고리즘은 원서, 유튜브와 구글링으로 정리하고 공부하였네요.
25년도 목표는 CS를 계속 공부하면서 C Family 언어, Java + spring 및 클라우드를 위주로 공부하려고 합니다.
메인 프로젝트 보다 사이드가 더 재밌네요. 아, 수학도 공부할 예정입니다. 할 것은 많은데 시간은 한정적이니 더 알차게 살아야겠습니다.
제가, 1년 간, 프로젝트를 진행하면서 항상 고민이 있었는데, 언어와 프레임워크 선택이었습니다.
주로 WAS쪽 작업을 할 때 Python Django(저는 Django 에서 API 서버인 DRF만 사용)와 Java Spring, Fastapi 등 고민을 많이 하고 많은 글을 찾아보니, 결론은 중요한 프로젝트의 성격에 맞춰서 진행해야 합니다. 이러한 고민을 해결하는데 큰 도움이 된 명언이 있어서 소개합니다.
자바 창시자, James Gosling의 명언입니다. 제가 한 때 많이 힘들었을 때 도움이 된 말입니다.
The core of software engineering is solving problems – not writing code.
The heart of a software developer is curiosity and the need to create
자, 이제 본론으로 들어가서 오늘의 주제는 도커와 워드프레스입니다. 먼저 도커에 대해서 알아보겠습니다.
도커(Docker)는 애플리케이션을 컨테이너라는 독립된 실행 환경에서 실행하고 관리할 수 있게 해주는 오픈 소스 플랫폼입니다.
도커의 컨테이너는 운영 체제 수준에서 가상화되는 환경으로, 애플리케이션과 그 애플리케이션이 실행되기 위한 모든 종속성(라이브러리, 설정 파일 등)을 함께 패키징하여 실행할 수 있게 해줍니다.
제가 재직하는 회사에서도 도커로 온프레미스를 구축해서 클라우드처럼 사용하고 있어요.
도커 – 컨테이너의 개념이 생각보다 이해하기 어려운데, 다른 사람에게 저는 설명할 때 컴퓨위에 또다른 컴퓨터가 올라가있다고 설명합니다. 자세한 것은 위키백과를 참고하세요!
워드프레스(WordPress)는 웹사이트와 블로그를 쉽게 만들고 관리할 수 있게 해주는 오픈 소스 콘텐츠 관리 시스템(CMS)입니다. 웹사이트를 구축하려는 사람들이 복잡한 코딩 없이 직관적인 방법으로 웹사이트를 디자인하고 운영할 수 있게 해주는 툴입니다.
자, 그러면 도커 및 워드프레스 관련 설정 파일을 알려드리겠습니다.
먼저, 저의 서버 환경은 Ubuntu 24.04 LTS 입니다. 윈도우로 해도 원리는 같으니 상관없습니다.
포트는 80과 443을 열어두세요. 80 to 443으로 redirect 할 예정이고, 443 SSL 인증서까지 설치할 예정입니다.
먼저 결론부터 말씀드리자면, NAS에서 호스팅 할 때 보다, 성능 좋은 SSD가 장착된 호스팅 전용 서버를 구축해서 쓰니 훨씬 빠르고 좋습니다(당연한 말입니다).
먼저, 도커 컴포즈를 진행하기 위해서 yml 파일을 하나 만들겁니다.
services:
wordpress:
image: wordpress:latest
ports:
- "3000:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 1111 # 변경 필요
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
volumes:
- wordpress_data:/var/www/html
networks:
- wordpress_network
db:
image: mysql:latest
environment:
MYSQL_DATABASE: wordpress
MYSQL_ROOT_PASSWORD: 1111 # 변경 필
volumes:
- db_data:/var/lib/mysql
networks:
- wordpress_network
# docker가 관리하는 별도의 공간에 데이터를 저장, 로컬 디렉토리와 연결하고 싶으면 "bind mount" 사용
volumes:
wordpress_data:
db_data:
networks:
wordpress_network:
driver: bridge
도커 코드에 대한 설명은 다음과 같습니다.
먼저, 워드프레스를 3000:80으로 매핑해줍니다. 이렇게 하는 이유는 제가 지금 설계한 아키텍처 때문입니다.
user -> your-domain 접속 -> nginx(80 to 443) -> wordpress(apache server 실행 중) – db와 통신
저는 nginx 웹 서버를 앞 단에 위치 시켜서 SSL 인증서와 리버스 프록시 하고 있습니다.
물론 yml 파일에 nginx 넣어서 서비스마다 관리해도 됩니다. 하지만… 저는 귀찮은 관계로 이미 세팅해둔 호스트 머신에 있는 nginx를 사용합니다.
유저가 도메인으로 접속하면 웹 서버(nginx)가 이를 인식합니다. 80으로 들어오면 443으로 돌리고 ssl 적용된 상태로 wordpress와 통신합니다(너무 Deep 한 설명은 지양하겠습니다.)
이렇게 도커 컨테이너를 올리면 되는데 올리는 방법은 yml 파일이 있는 폴더에서 docker compose up 이렇게 하면 됩니다. 그러면 컨테이너 및 네트워크가 생성될 겁니다.
이후, SSL 인증서를 설치해야 합니다.
먼저 도메인을 구매하시고 A 레코드를 호스팅 할 곳의 IP로 세팅해주세요. 다른 세팅 값은 건들지 않았습니다.
예를 들어, 나는 집에서 내 컴퓨터로 호스팅 하겠다! 이러면, 나의 컴퓨터가 받아오는 IP 값(공인 아이피, 구글에서 what is my ip 검색, ipv4 값)이 111.111.111.111
도메인 구매한 곳에서 DNS 레코드 설정하는 부분에서 A 레코드를 111.111.111.111로 설정합니다.
그다음, nginx의 세팅 값을 바꿔줘야 합니다. 바꾸기 전에, 도메인에 IP가 잘 연결 되었는지 확인 해보세요. 확인하기
구매한 도메인을 검색하고 ip가 잘 나와야 합니다. 예를 들어서, test.com 구매했다면, test.com, 111.111.111.111 이렇게 나와야 합니다.
레코드 변경 등에 대한 적용 시간이 걸릴 수 있습니다. 보통 1-2시간 내로 다 됩니다.
SSL 인증서를 위해서 다음과 같이 진행합니다.
sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
Nginx 세팅은 다음과 같습니다.
# test.com
# HTTP to HTTPS redirection
server {
listen 80;
server_name test.com www.test.com;
# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri;
}
# Main HTTPS server block
server {
listen 443 ssl;
server_name test.com www.test.com;
ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
# Handle large file uploads
client_max_body_size 0;
location / {
proxy_pass http://localhost:3000; # Forward to the wordpress service
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
}
}
이렇게 세팅하신 후 sudo service nginx restart
진행하시면 됩니다.
진행하시고, 도메인으로 접속하시면 워드프레스 관련 설정 화면(로그인, 회원가입 등)이 나옵니다.
이렇게 끝이 났습니다!
주의!!
- https 리다이렉션 줄 때, proxy_pass랑 혼용해서 쓰지 마세요. 저는 실수로 location / 블록에서 proxy_pass랑 리다이렉트 동시에 넣어뒀습니다. 그래서 무한루프에 빠져서 err_too_many_redirects 발생했습니다.
- 원래는 wp-config.php를 수정 해야 하는데, 아래 세팅을 추가해서 해결할 수 있었습니다.
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443; - 방화벽 체크(80, 443은 웹 표준 포트)
저는 Ubuntu로 서버를 구축하다 보니 윈도우 쪽은 잘 모르겠네요. 설명이 어렵습니다. 하지만, 통신 하는 방식은 동일하니, 윈도우 사용자 분들은 찾아보시면서 하는데 어렵지 않을 겁니다.
하하… 짧게 쓰려고 했는데 실패했네요. 어쨌든! 잘 따라오시면 구축하는데 무리는 없을 겁니다. 컨테이너가 안 올라간다? 서버가 안 열린다? 대부분의 문제는 네트워크에서 발생합니다. 네트워크를 잘 체크해보세요.
데이터를 어디서 던지고, 어떻게 던지는지.. 받는 곳은 포트를 열었는지, 내부 통신인지 누가 외부(유저)랑 통신할건지.. 이런 부분 체크만 하시면 코드 작성하는 것은 큰 어려움 없으니, 워드프레스 구축하는데 성공하실겁니다!
다들 집에서 남는, 노트북, 컴퓨터로 성능 좋은 호스팅 머신을 만들기를 바라며!!!! 여기서 마치겠습니다. 다음에 또 뵙겠습니다!!