Docker Alpine Linux에 WordPress 설치하기#1

기술블로그 운영을 위해 여러가지 블로그 서비스를 찾아 보았고 각각의 장단점을 고려했을때 자유도가 높은 WordPress를 선택하였다.
WordPress는 유료 호스팅 업체가 많이 있지만 직접만드는걸 좋아하시는 분들을 위한 포스팅 이다.

1. 환경 설명

컨테이너가 띄워질 HostOS인 Ubuntu Linux를 구축하는 방법은 여러가지 방식이 있다. 과거에는 전문 Virtual Machine 솔루션(VMware, Hiper-v, Citrix, Nutanix 등)을 이용하였으나 최근에는 개인도 쉽게 만들수 있는 Windows 10 Pro WSL2, Docker Desktop 등을 활용할 수 있다.  물론 유료 클라우드 서비스를 활용해도 된다.

다만,  24시간 365일 구동되어야 하고, 외부에서의 inbound 트래픽이 전달되어야야 하는 웹서비스의 특성을 고려해야 한다.

해당 포스트는 Synology NAS의 Virtual Machine Manager 기능을 활용하여 HostOS를 구성하였으며 분리된 DBMS는 [Docker Alpine Linux에 WordPress Mariadb 설치하기#2]를 참고한다.

나아가 고도화 구성에 대해 계속 포스팅을 진행할 예정인데, 고도화 구성은 아래와 같은 항목이다.

  • 앞단에 HaProxy 설치 및 SSL 인증서 적용
  • 이미지 파일용 CDN 분리
  • File Server (로컬 저장소) 분리
  • AutoScale 적용
  • Mini Kubernetes 적용
  • 로그 모니터링

2. HostOS Ubuntu 20.04 설치

Synology NAS의 Virtual Machine Manager 기능을 설치한 뒤
가상 컴퓨터 > 생성 > Linux > 이름은 docker_host, CPU 1,  Memory 2, Disk는 100GB로 설정 > 부팅용 ISO파일은 미리 다운로드한 Ubuntu-20.04 버전을 사용한다.

wordpress1

Virtual Machine Manager의 상단에 연결 메뉴를 누르면 브라우저를 통해 자동으로 Shell 접속을 하고 설치 과정을 볼 수 있다.
호스트네임, 계정정보 정도만 입력하고 open SSH나 Featured는 설치하지 말고 넘어가면 된다.(필요한 기능은 최신버전으로 직접 설치할 예정)

wordpress2

설치가 마무리되면서 재부팅이 필요할때 마운트된 설치파일(ISO)을 제거하고 진행한다.

wordpress3
				
					apt-get update && upgrade
apt update && upgrade

apt install net-tools #네트워크 확인 도구
apt install ssh
				
			

원격연결을 위한 SSH 포트는 6282로 변경하고 외부에서의 접속을 위해 NAS 상단의 L3장비(IP Time 공유기)에서 포트포워딩 설정을 한다.
Ubuntu의 사설IP는 192.168.0.254로 Static 설정하였다.

wordpress4

이제 IPTime에서 제공해주는 ddns주소로 SSH 연결을 하면 된다.(포트 6282)

3. Ubuntu에 Docker 설치

docs.docker.com의 공식 문서 확인하여 설치
https://docs.docker.com/engine/install/ubuntu/

				
					sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
				
			

4. HostOS인 Ubuntu에 Docker 컨테이너용 Storage Directory 생성

컨테이너가 실행중일때 컨테이너 내부에 적재 또는 수정되는 데이터는 휘발성 데이터이다.
컨테이너가 시작될때 정해진 image와 DockerFile을 통한 설정값들만 불러와서 다시 초기와 같은 설정으로 구동되기 때문이다. 
컨테이너는 설정된 일만 처리하는 워크 노드처럼 사용하고 데이터 적재가 필요한 스토리지 역할은 별도로 구성해야 한다.

				
					mkdir -p /docker/wordpress/config # Dockerfile, lighhtpd.conf, index.php
mkdir -p /docker/wordpress/data # wordpress home directory
				
			

5. WordPress Dockerfile 설정(Dockerfile)

				
					#/docker/wordpress/config/Dockerfile
#Alpine Linux OS를 기반으로 한다.
FROM alpine:3.15
RUN apk update

#Wordpress설치에 필요한 패키지
RUN apk add lighttpd php7-common php7-session php7-iconv php7-json php7-gd php7-curl php7-xml php7-mysqli php7-imap php7-cgi fcgi php7-pdo php7-pdo_mysql php7-soap php7-xmlrpc php7-posix php7-mcrypt php7-gettext php7-ldap php7-ctype php7-dom php7-simplexml php7-zip

#php.ini file upload size
RUN sed -ri 's/upload_max_filesize = 2M/upload_max_filesize = 4M/g' /etc/php7/php.ini

#php에서 사용하는 Memory 사용량 증설
RUN sed -ri 's/memory_limit = 128M/memory_limit = 256M/g' /etc/php7/php.ini

#lighttpd.conf 
#COPY lighttpd.conf /etc/lighttpd/lighttpd.conf

#index.php
#COPY index.php /var/www/localhost/htdocs/index.php

#PID
RUN mkdir /run/lighttpd
RUN chown -R lighttpd /run/lighttpd

#Foreground
CMD ["lighttpd", "-f", "/etc/lighttpd/lighttpd.conf", "-D"]
				
			
				
					#Docker build (Dockerfile) /docker/wordpress/config
docker build -t infraadmin.tech:1.0 /docker/wordpress/config/

#wordpress_app 컨테이너를 백그라운드 데몬으로 http 포트를 연동하여 실행한다. HostOS인 Ubuntu의 /docker/wordpress/data 폴더를 컨테이너의 wordpress 폴더에 마운트한다. 이미지는 infraadmin.tech:1.0을 사용한다.
docker run -d --name wordpress_app -p 80:80 -v /docker/wordpress/data:/var/www/localhost/htdocs/wordpress infraadmin.tech:1.0
				
			

컨테이너(Alpine Linux)에 접속해서 WordPress를 다운받는다. 최초 1회만 필요한 작업이므로 Dockerfile을 이용하지 않는다.

wordpress6
				
					docker ps
docker exec -it {CONTAINER ID} /bin/sh
cd /var/www/localhost/htdocs
wget http://wordpress.org/latest.tar.gz
tar -xzvf latest.tar.gz
rm latest.tar.gz
#default lighttpd.conf는 관리를 위해 HostOS로 복사해온다.
cp /etc/lighttpd/lighttpd.conf /var/www/localhost/htdocs/wordpress
exit
				
			

6. lighttpd 설정

				
					mv /docker/wordpress/data/lighttpd.conf /docker/wordpress/config/
vi /docker/wordpress/config/lighttpd.conf

				
			
				
					#include "mod_fastcgi.conf" 주석제거
server.modules = (

   include "mod_fastcgi.conf"
				
			
				
					vi /docker/wordpress/config/Dockerfile

				
			
				
					#COPY lighttpd.conf 주석제거
#lighttpd.conf 
COPY lighttpd.conf /etc/lighttpd/lighttpd.conf"
				
			

실행중인 컨테이너를 중지하고 다시 빌드한다.

wordpress7
wordpress8

7. WordPress 컨테이너 실행

wordpress9

http 연결을 위해 상단의 IPTime에서 포트포워딩을 추가한다.
(iptime 관리페이지 또한 http를 사용하는데, 포트포워딩 설정은 WAN구간(공인IP)에만 적용된다) 

8. WordPress 실행 확인

인터넷 회선의 공인IP는 유동적이라 매번 바뀔수 있으니 IPtime 공유기에서 무료로 제공중인 ddns 주소로 들어가면 아래와 같이 wordpress 초기 설정화면을 확인할 수 있다.

http://XXXXXX.iptime.org/wordpress

wordpress11

References