
도커 컨테이너를 사용하여 NGINX 웹 서버, MySQL, PHP 및 phpMyAdmin을 사용하여 워드프레스 애플리케이션을 컨테이너화하는 데 필요한 모든 단계를 제공합니다.
Docker를 사용하여 애플리케이션을 컨테이너화하여 기본 운영 체제와 독립적으로 애플리케이션별 버전으로 필요한 패키지를 별도로 설치합니다.. 도커 컨테이너를 사용하여 애플리케이션을 이식 가능하게 만들어 도커가 있는 다른 시스템으로 간단히 이동할 수 있습니다. 이 문서에서는 NGINX 웹 서버를 웹 서버로, MySQL을 데이터베이스 서버로 사용하여 워드프레스 애플리케이션을 컨테이너화하는 모든 단계를 제공합니다. 이 문서에서는 워드프레스의 도커 이미지를 사용하는 대신 소스를 다운로드하여 설치하는 단계를 제시합니다.
PHP 및 NGINX 웹 서버 설치
프로젝트별 파일을 저장할 디렉터리를 만듭니다. 모든 프로젝트 파일을 저장하기 위해 hello_wp 디렉터리를 생성합니다.
(base) kevin_kidong_lim@streamlit-mpi:~$ mkdir hello_wp
(base) kevin_kidong_lim@streamlit-mpi:~$ cd hello_wp/
프로젝트 디렉터리의 루트 안에 docker-compose.yml 파일을 생성합니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ vi docker-compose.yml
# docker-compose.yml
version: "3.8"
services:
nginx_wp:
container_name: nginx_wp
build: ./docker/nginx
command: nginx -g "daemon off;"
links:
- php_wp
ports:
- "8088:80"
volumes:
- ./logs/nginx:/var/log/nginx
- ./src:/var/www/html
php_wp:
container_name: php
build: ./docker/php
ports:
- "9000:9000"
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
이제 프로젝트 루트 디렉터리 내에 docker, logs, src 디렉터리를 생성합니다. 또한 docker 디렉터리 내에 두 개의 디렉토리, 즉 php와 nginx를 만듭니다. 또한 로그 디렉터리 내에 nginx 디렉터리를 생성합니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ mkdir docker logs src
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ mkdir -p docker/php docker/nginx
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ mkdir -p logs/nginx
아래와 같이 php 와 nginx 디렉토리 내에 Docker파일을 생성합니다.
#docker/php/Dockerfile
FROM php:8.3-fpm
# docker/nginx/Dockerfile
FROM nginx:1.23
아래와 같이 src 디렉토리에 index.php 파일을 생성합니다.
# src/index.php
<?php
echo phpinfo();
?>
또한 PHP 요청을 PHP-FPM 포트 9000으로 전달하도록 서버 블록 또는 가상 호스트를 구성하기 위해 nginx default.conf 파일을 생성합니다.
#docker/nginx/default.conf
server {
listen 80;
index index.php index.htm index.html;
root /var/www/html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
위 에서 생성한 default.conf 파일을 nginx 컨테이너에 추가합니다.
# docker/nginx/Dockerfile
FROM nginx:1.23
ADD default.conf /etc/nginx/conf.d/default.conf
지금까지의 작업한 디렉토리 구조는 아래와 같아야 합니다.
(base) kevin_kidong_lim@streamlit-mpi:~$ ls -alR hello_wp/
hello_wp/:
drwxrwxr-x 4 kevin_kidong_lim kevin_kidong_lim 4096 Jun 13 19:02 docker
-rw-rw-r-- 1 kevin_kidong_lim kevin_kidong_lim 428 Jun 13 19:02 docker-compose.yml
drwxrwxr-x 3 kevin_kidong_lim kevin_kidong_lim 4096 Jun 13 19:02 logs
drwxrwxr-x 2 kevin_kidong_lim kevin_kidong_lim 4096 Jun 14 19:56 src
hello_wp/docker:
drwxrwxr-x 2 kevin_kidong_lim kevin_kidong_lim 4096 Jun 14 19:59 nginx
drwxrwxr-x 2 kevin_kidong_lim kevin_kidong_lim 4096 Jun 14 19:54 php
hello_wp/docker/nginx:
-rw-rw-r-- 1 kevin_kidong_lim kevin_kidong_lim 90 Jun 14 19:59 Dockerfile
-rw-rw-r-- 1 kevin_kidong_lim kevin_kidong_lim 476 Jun 14 19:58 default.conf
hello_wp/docker/php:
-rw-rw-r-- 1 kevin_kidong_lim kevin_kidong_lim 41 Jun 14 19:54 Dockerfile
hello_wp/logs:
drwxrwxr-x 2 kevin_kidong_lim kevin_kidong_lim 4096 Jun 13 19:02 nginx
hello_wp/logs/nginx:
hello_wp/src:
-rw-rw-r-- 1 kevin_kidong_lim kevin_kidong_lim 24 Jun 14 19:56 index.php
이제 docker-compose build 명령을 실행하여 PHP 및 NGINX 웹 서버용 이미지를 빌드합니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ sudo docker compose build
WARN[0000] /home/kevin_kidong_lim/hello_wp/docker-compose.yml: version
is obsolete
[+] Building 10.7s (4/5) docker:default
=> [php internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 78B 0.0s
=> [php internal] load metadata for docker.io/library/php:8.3-fpm 0.7s
=> [php auth] library/php:pull token for registry-1.docker.io 0.0s
=> [php internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [php 1/1] FROM docker.io/library/php:8.3-fpm@sha256:20a65a3f3919a048a6dedba1200d37706659ac5b23630142cb44e4548cc73250 9.9s
빌드가 완료되면 아래에 표시된 명령을 사용하여 애플리케이션을 실행할 수 있습니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker compose up -d
WARN[0000] /home/kevin_kidong_lim/hello_wp/docker-compose.yml: version
is obsolete
[+] Running 3/3
✔ Network hello_wp_default Created 0.1s
✔ Container php_wp Started 0.5s
✔ Container nginx_wp Started 0.9s
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b97d3b478fd hello_wp-nginx_wp "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp nginx_wp
a9141e339b54 hello_wp-php_wp "docker-php-entrypoi…" 4 seconds ago Up 2 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php_wp
http://localhost:8088/index.php 를 조회해서 정상적으로 phpinfo 내용을 확인할수 있습니다.
MySQL 및 phpMyAdmin 설치
MySQL과 phpMyAdmin을 설치합니다. 이제 아래와 같이 docker-compose.yml을 업데이트합니다.
#docker-compose.yml
version: "3.8"
services:
nginx_wp:
container_name: nginx_wp
build: ./docker/nginx
command: nginx -g "daemon off;"
links:
- php_wp
ports:
- "8088:80"
volumes:
- ./logs/nginx:/var/log/nginx
- ./src:/var/www/html
php_wp:
container_name: php_wp
build: ./docker/php
ports:
- "9000:9000"
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
mysql:
image: mysql:8.0.32
container_name: mysql
env_file:
- ./env/mysql.env
ports:
- "3306:3306"
volumes:
- ./database/mysql:/var/lib/mysql
command: '--default-authentication-plugin=mysql_native_password'
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: pma
links:
- mysql
environment:
PMA_HOST: mysql
PMA_PORT: 3306
PMA_ARBITRARY: 1
restart: always
ports:
- 8085:80
프로젝트의 루트디렉토리에 env 디렉터리를 만들고 아래와 같은 구성으로 mysql.env 파일을 생성하고 mysql 접속정보를 입력합니다. 아래와 같이 확인할수 있습니다.
#env/mysql.env
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=hellowp
MYSQL_USER=hellowp
MYSQL_PASSWORD=hellowppassword
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ ls
docker docker-compose.yml logs src
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ mkdir env
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ vi mysql.env
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ mv mysql.env env/
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ cat env/mysql.env
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=hellowp
MYSQL_USER=hellowp
MYSQL_PASSWORD=hellowppassword
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$
docker-compose build 명령을 실행하여 애플리케이션을 다시 빌드합니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker compose build
WARN[0000] /home/kevin_kidong_lim/hello_wp/docker-compose.yml: version
is obsolete
[+] Building 0.9s (14/14) FINISHED docker:default
=> [php_wp internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 78B 0.0s
=> [php_wp internal] load metadata for docker.io/library/php:8.3-fpm 0.3s
=> [php_wp auth] library/php:pull token for registry-1.docker.io 0.0s
=> [php_wp internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [php_wp 1/1] FROM docker.io/library/php:8.3-fpm@sha256:20a65a3f3919a048a6dedba1200d37706659ac5b23630142cb44e4548cc73250 0.0s
=> [php_wp] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:15e70a50235c1d8239ff7f6069c90543a6b69bd6ed8cdf11dd19b000e7bc5b2b 0.0s
=> => naming to docker.io/library/hello_wp-php_wp 0.0s
=> [nginx_wp internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 127B 0.0s
=> [nginx_wp internal] load metadata for docker.io/library/nginx:1.23 0.2s
=> [nginx_wp auth] library/nginx:pull token for registry-1.docker.io 0.0s
=> [nginx_wp internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [nginx_wp internal] load build context 0.0s
=> => transferring context: 34B 0.0s
=> [nginx_wp 1/2] FROM docker.io/library/nginx:1.23@sha256:f5747a42e3adcb3168049d63278d7251d91185bb5111d2563d58729a5c9179b0 0.0s
=> CACHED [nginx_wp 2/2] ADD default.conf /etc/nginx/conf.d/default.conf 0.0s
=> [nginx_wp] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:5791cf92e8c0a737a9f1cc4186648ed9e33f7c090fb01d7e8d9a2a08ab60c117 0.0s
=> => naming to docker.io/library/hello_wp-nginx_wp
애플리케이션을 시작하기 위해 docker-compose up -d 명령을 실행해야 합니다. 이 명령은 MySQL 및 phpMyAdmin 이미지를 가져와서 처음 실행하는 데 시간이 걸립니다. 이후 실행은 더 빨라질 것입니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker compose up -d
WARN[0000] /home/kevin_kidong_lim/hello_wp/docker-compose.yml: `version` is obsolete
[+] Running 31/31
✔ phpmyadmin Pulled 23.2s
✔ faef57eae888 Pull complete 5.3s
✔ 989a1d6c052e Pull complete 5.4s
✔ 0705c9c2f22d Pull complete 14.7s
✔ 621478e043ce Pull complete 14.7s
✔ 98246dcca987 Pull complete 16.6s
✔ bfed8c155cb6 Pull complete 16.8s
✔ 7a7c2e908867 Pull complete 16.8s
✔ d176994b625c Pull complete 17.4s
✔ 2d8ace6a2716 Pull complete 17.7s
✔ c70df516383c Pull complete 18.8s
✔ 15e1b44fe4c7 Pull complete 18.9s
✔ 65e50d44e95a Pull complete 18.9s
✔ 77f68910bc0a Pull complete 18.9s
✔ 605dd3a6e332 Pull complete 19.3s
✔ 99ce27188f07 Pull complete 19.3s
✔ 74d64e32c5d5 Pull complete 22.7s
✔ ef5fc9928b9f Pull complete 22.7s
✔ 163f3256e112 Pull complete 22.8s
✔ mysql Pulled 24.2s
✔ 328ba678bf27 Pull complete 7.1s
✔ f3f5ff008d73 Pull complete 7.1s
✔ dd7054d6d0c7 Pull complete 7.2s
✔ 70b5d4e8750e Pull complete 7.7s
✔ cdc4a7b43bdd Pull complete 7.8s
✔ 3e9c0b61a8f3 Pull complete 7.8s
✔ 806a08b6c085 Pull complete 11.7s
✔ 021b2cebd832 Pull complete 11.7s
✔ ad31ba45b26b Pull complete 23.5s
✔ 0d4c2bd59d1c Pull complete 23.6s
✔ 148dcef42e3b Pull complete 23.6s
[+] Running 4/4
✔ Container php_wp Running 0.0s
✔ Container nginx_wp Running 0.0s
✔ Container mysql Started 0.7s
✔ Container pma Started
http://localhost:8085 로 접속하면 아래와 같은 phpmyadmin 로그인 페이지가 나타납니다.

이제 사용자 아이디를 root로 설정하고 mysql.env 파일에 설정한 루트 비밀번호를 사용하여 phpMyAdmin에 로그인합니다. 서버는 항목은 비워둡니다.

도커파일을 업데이트하여 워드프레스 소스 파일에서 MySQL에 액세스할 수 있는 PHP 확장 프로그램을 설치합니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ vi docker/php/Dockerfile
#docker/php/Dockerfile
FROM php:8.3-fpm
RUN apt-get update
RUN docker-php-ext-install pdo pdo_mysql mysqli
또한 빌드 및 업 명령을 실행하여 애플리케이션을 다시 빌드하고 실행합니다.
-- 실행중인 컨테이너를 모두 종료한다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker compose down
-- 컨테이너를 새로 빌드 한다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker compose build
-- 컨테이너를 실행합니다.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker compose up -d
-- 컨테이너 프로세스를 확인.
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85ff61a3b106 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 36 seconds ago Up 34 seconds 0.0.0.0:8085->80/tcp, :::8085->80/tcp pma
ecb5a0e3fc25 hello_wp-nginx_wp "/docker-entrypoint.…" 36 seconds ago Up 34 seconds 0.0.0.0:8088->80/tcp, :::8088->80/tcp nginx_wp
014cbb04fcb4 mysql:8.0.32 "docker-entrypoint.s…" 36 seconds ago Up 35 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
7d1006adcd7b hello_wp-php_wp "docker-php-entrypoi…" 36 seconds ago Up 34 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php_wp
아래와 같이 PHP를 사용하여 MySQL 연결을 테스트할 수 있습니다. src 폴터에 mysql.php 아래 내용으로 만들어 주세요.
# src/mysql.php
<?php
$hostname = "mysql";
$dbname = "hellowp";
$username = "hellowp";
$password = "hellowppassword";
try {
$conn = new PDO( "mysql:host=$hostname;dbname=$dbname", $username, $password );
// Configure PDO error mode
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
echo "Connected successfully";
}
catch( PDOException $e ) {
echo "Failed to connect: " . $e->getMessage();
}
$conn = null;
?>
브라우저에서 http://localhost:8088/mysql.php 로 확인 가능합니다.

워드프레스 설치
워드프레스를 다운로드하고 설치를 진행합니다. curl 을 이용하여 최신버전을 다운로드한후 압축해제를 합니다. 해제된 디렉토리는 wordpress 폴더로 생성됩니다.
curl -O https://wordpress.org/latest.zip
sudo apt install unzip
unzip latest.zip
--압축해제한 디렉토리 wordpress 로 이동한후, 디렉토리안의 모든 파일을 src 폴더로 이동합니다.
cd wordpress
mv * ../src
(base) kevin_kidong_lim@streamlit-mpi:~/hello_wp/src$ ls
index.php phpinfo.php wp-admin wp-config-sample.php wp-includes wp-login.php wp-signup.php
license.txt readme.html wp-blog-header.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
mysql.php wp-activate.php wp-comments-post.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
--wp-config-sample.php를 복사하여 같은 디렉터리에 붙여넣고 이름을 wp-config.php로 바꿉니다.
base) kevin_kidong_lim@streamlit-mpi:~/hello_wp/src$ cp wp-config-sample.php wp-config.php
-- wp-config.php 파일 내용중 아래 내용을 찾아서 접속정보를 업데이트해줍니다.
<?php
....
....
define( 'DB_NAME', 'helloworld' );
/** Database username */
define( 'DB_USER', 'hellowp' );
/** Database password */
define( 'DB_PASSWORD', 'hellowppassword' );
/** Database hostname */
define( 'DB_HOST', 'mysql' );
....
....
호스트 이름으로 localhost대신 mysql의 도커 컨테이너 이름을 사용했는데, 이는 NGINX와 MySQL이 서로 다른 컨테이너를 사용하기 때문입니다. 여기까지가 MySQL 데이터베이스 서버에 액세스하도록 워드프레스를 구성하는 방법입니다. 서버에 다시 접속을 하면 http://localhost/ 아래와 같은 화면이 나타납니다.
모든 정보를 입력한후 Install 버튼 을 클릭합니다.

성공 메세지 페이지가 나타납니다. Log in 을 클릭하여 로그인 페이지로 이동합니다.

로그인페이지에서 이름/패스워드를 입력합니다.

성공!!!!
워드프레스가 성공적으로 설치되었습니다.

Summary
도커 컨테이너를 사용하여 NGINX 웹 서버, MySQL, PHP, phpMyAdmin으로 워드프레스를 컨테이너화하는 모든 단계를 설명했습니다.