오랜전부터 운영해오던 블로그가 한번씩 죽을때마다 백업을 신경쓰지 않아서 이미지들을 죄다 날리곤 했었다. 이 문제 때문에 검색을 좀 해봤더니 Docker 볼륨과 Git 을 통해 손쉽게 백업 문제를 해결하고 있었다. 왜 이 생각을 못했지? ㅎㅎㅎ 머리가 굳었어!
일단 옆지기 블로그(janeisyoung.com)를 깃헙 페이지에서 해방 시켜주기로 했다.
서버 구성
AWS EC2 인스턴스 2개를 이용해 하나는 Docker 호스트로 쓰고 있고 다른 하나는 데이터베이스 전용으로 쓰고 있다. 따라서 지금부터 쓰는 글은 데이터베이스가 원격지에 있다는 가정하에 쓰는 글이다.
데이터베이스 설정
원격 서버에 SSH 접근한 후 블로그용 데이터베이스를 생성하고 이 데이터 베이스만 접근 가능한 유저를 만들어준다.
// 루트 권한으로 MySQL 로그인
> mysql -u root -p
// DB 생성
mysql> create database janeisyoung;
// 유저 생성
> create user janeisyoung@'172.31.%' identified by '<PASSWORD>';
// 권한 지정
> grant all privileges on janeisyoung.* to janeisyoung@'172.31.%' identified by '<PASSWORD>' with grant option;
// 권한 확인
> show grants for 'janeisyoung'@'172.31.%';
참고로 데이터베이스로 쓰고 있는 인스턴스는 AWS EC2 간에 172로 시작하는 내부 IP를 통해서만 접근하도록 제한된 상태다.
도커 컴포즈 설정
version: "3.3"
services:
wordpress:
image: wordpress:latest
ports:
- "8889:80"
restart: always
environment:
WORDPRESS_DB_HOST: <DB_HOST_IP>:<DB_PORT>
WORDPRESS_DB_USER: janeisyoung
WORDPRESS_DB_PASSWORD: <PASSWORD>
WORDPRESS_DB_NAME: janeisyoung
volumes:
- ./html:/var/www/html
도커 호스트 서버에 접속해서 docker-compose.yml 파일을 만들고 실행한다.
> mkdir janeisyoung
> cd janeisyoung
> docker-compose up -d
컨테이너가 제대로 만들어졌는지 확인해보자.
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c204cc3f0a8 wordpress:latest "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:8889->80/tcp janeisyoung
Nginx 멀티 호스팅
도커에는 이미 여러 컨테이너 서비스가 올라가 있다. 마찬가지로 이번에 추가한 블로그도 그 중에 하나로 8889번 포트를 통해서 도커 호스트와 통신한다. 그리고 도커 호스트로 들어오는 모든 요청은 Nginx 를 통해서 각각의 컨테이너 서비스로 연결된다.
file: /etc/nginx/conf.d/janeisyoung.com.conf
----
server {
listen 80;
server_name janeisyoung.com;
location / {
proxy_pass http://127.0.0.1:8889;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
}
이제 Nginx 를 재시작한다.
> sudo systemctl restart nginx.service
도커 볼륨을 이용한 데이터 백업
앞에서 설정한 컴포즈를 실행하면 연결 해둔 볼륨(html 폴더)이 생기는데 이 폴더는 컨테이너 안쪽의 워드프레스 루트 폴더와 연동된다. 따라서 업로드한 모든 이미지와 설치한 테마, 플러그인 등등 모든 파일이 이 곳에 저장된다.
이제 도커 컨테이너가 어떤 이유로 죽더라도 내가 쓴글은 안전하게 DB에 저장되고 업로드한 모든 이미지는 볼륨 폴더에 저장되어있으므로 언제든 똑같이 되살릴수있다. 올레~ 그리고 이 볼륨 폴더를 git 연동해서 GitHub에 주기적으로 push 하면 서버를 이전할때도 손쉽게 이전할수있다.
물론 위에서 설정한 컴포즈 설정은 도커 명령어 한줄로도 가능하다.
docker run -d --name wordpress -v $(pwd)/html:/var/www/html -e WORDPRESS_DB_HOST=<DB_HOST>:3306 -e WORDPRESS_DB_USER=<DB_NAME> -e WORDPRESS_DB_PASSWORD='<DB_PASS>' -p 8888:80 wordpress:php7.4