도커(Docker) 컨테이너를 사용하여 NGINX, PHP, MySQL 및 phpMyAdmin으로 워드프레스(WordPress) 컨테이너화하기

도커(Docker) 컨테이너를 사용하여 NGINX, PHP, MySQL 및 phpMyAdmin으로 워드프레스(WordPress) 컨테이너화하기
docker nginx
Table of Contents

    도커 컨테이너를 사용하여 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으로 워드프레스를 컨테이너화하는 모든 단계를 설명했습니다.