웹사이트 검색

Ubuntu 22.04에서 Docker로 Drupal을 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Docker 및 Docker Compose 설치
  4. 3단계 - Drupal용 Docker Compose 파일 만들기
    1. MySQL 도커 서비스
    2. 드루팔 서비스
    3. Nginx 서비스
    4. Certbot 서비스

    Drupal은 PHP로 작성된 오픈 소스 콘텐츠 관리 시스템(CMS)입니다. 전 세계의 많은 조직에서 이를 사용하여 블로그, 정부 사이트, 기업 웹사이트 등을 만듭니다. 기능을 확장할 수 있는 기능 및 모듈 세트가 함께 제공되어 원하는 웹 사이트를 만들 수 있습니다.

    이 튜토리얼은 Ubuntu 22.04 서버에서 Docker를 사용하여 Drupal을 설치하는 방법을 알려줍니다. Drupal은 PHP 8.2 및 MySQL과 함께 작동합니다. 버전 9부터 PostgreSQL도 지원하지만 몇 가지 버그가 있습니다. 따라서 튜토리얼에서는 MySQL을 계속 사용할 것입니다. Docker Compose를 사용하여 Drupal을 Nginx 및 Certbot 도구와 통합하여 안전한 HTTPS 프로토콜에서 사이트 Drupal 웹 사이트를 서버로 만들 것입니다.

    전제 조건

    • A server running Ubuntu 22.04 with a minimum of 1GB of RAM for smaller communities. To host larger communities, you should get a server with a minimum of 2GB of RAM or more.

    • A non-root user with sudo privileges.

    • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use example.com as the domain name.

    • Make sure everything is updated.

      $ sudo apt update
      
    • Install basic utility packages. Some of them may already be installed.

      $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
      

    1단계 - 방화벽 구성

    첫 번째 단계는 방화벽을 구성하는 것입니다. 우분투는 기본적으로 ufw(복잡하지 않은 방화벽)와 함께 제공됩니다.

    방화벽이 실행 중인지 확인하십시오.

    $ sudo ufw status
    

    다음 출력을 얻어야 합니다.

    Status: inactive
    

    방화벽이 활성화 시 현재 연결을 끊지 않도록 SSH 포트를 허용합니다.

    $ sudo ufw allow OpenSSH
    

    HTTP 및 HTTPS 포트도 허용합니다.

    $ sudo ufw allow http
    $ sudo ufw allow https
    

    방화벽 활성화

    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    

    방화벽의 상태를 다시 확인하십시오.

    $ sudo ufw status
    

    비슷한 출력이 표시되어야 합니다.

    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    80/tcp                     ALLOW       Anywhere
    443                        ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    80/tcp (v6)                ALLOW       Anywhere (v6)
    443 (v6)                   ALLOW       Anywhere (v6)
    

    2단계 - Docker 및 Docker Compose 설치

    Ubuntu 22.04는 이전 버전의 Docker와 함께 제공됩니다. 최신 버전을 설치하려면 먼저 Docker GPG 키를 가져옵니다.

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    

    Docker 리포지토리 파일을 만듭니다.

    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    시스템 저장소 목록을 업데이트하십시오.

    $ sudo apt update
    

    최신 버전의 Docker를 설치합니다.

    $ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    

    실행 중인지 확인합니다.

    $ sudo systemctl status docker
    ? docker.service - Docker Application Container Engine
         Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago
    TriggeredBy: ? docker.socket
           Docs: https://docs.docker.com
       Main PID: 2054 (dockerd)
          Tasks: 52
         Memory: 22.5M
            CPU: 248ms
         CGroup: /system.slice/docker.service
                 ??  2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    

    기본적으로 Docker에는 루트 권한이 필요합니다. sudo 명령을 실행할 때마다 sudo를 사용하지 않으려면 docker 명령에 사용자 이름을 추가하세요. > 그룹.

    $ sudo usermod -aG docker $(whoami)
    

    이 변경을 활성화하거나 다음 명령을 사용하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인해야 합니다.

    $ su - ${USER}
    

    사용자가 Docker 그룹에 추가되었는지 확인합니다.

    $ groups
    navjot wheel docker
    

    3단계 - Drupal용 Docker Compose 파일 생성

    Drupal용 디렉터리를 만듭니다.

    $ mkdir ~/drupal
    

    디렉터리로 전환합니다.

    $ cd ~/drupal
    

    편집을 위해 docker-compose.yml 파일을 만들고 엽니다.

    $ nano docker-compose.yml
    

    다음 코드를 붙여넣습니다.

    services:
      mysql:
        image: mysql:8.0
        container_name: mysql
        restart: unless-stopped
        env_file: .env
        volumes:
          - db-data:/var/lib/mysql
        networks:
          - internal
      
      drupal:
        image: drupal:10-fpm-alpine
        container_name: drupal
        depends_on:
          - mysql
        restart: unless-stopped
        networks:
          - internal
          - external
        volumes:
          - drupal-data:/var/www/html
      
      webserver:
        image: nginx:1.22.1-alpine
        container_name: webserver
        depends_on:
          - drupal
        restart: unless-stopped
        ports:
          - 80:80
        volumes:
          - drupal-data:/var/www/html
          - ./nginx-conf:/etc/nginx/conf.d
          - certbot-etc:/etc/letsencrypt
        networks:
          - external
      
      certbot:
        depends_on:
          - webserver
        image: certbot/certbot
        container_name: certbot
        volumes:
          - certbot-etc:/etc/letsencrypt
          - drupal-data:/var/www/html
        command: certonly --webroot --webroot-path=/var/www/html --email _domain --agree-tos --no-eff-email --staging -d example.com -d www.example.com
    
    networks:
      external:
        driver: bridge
      internal:
        driver: bridge
    
    volumes:
      drupal-data:
      db-data:
      certbot-etc:
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    위 파일에 정의된 각 서비스를 살펴보겠습니다.

    MySQL 도커 서비스

    여기서는 Docker 허브에서 최신 mysql:8.0 이미지를 가져옵니다. 우리는 최신 태그를 사용하는 대신 8.x 버전을 사용하고 있습니다. 이렇게 하면 Drupal과 함께 작동하는 안정적이고 테스트된 MySQL 버전을 사용할 수 있습니다. 로그를 중지, 시작 및 보기 위해 Docker 명령과 함께 사용할 수 있는 컨테이너의 이름을 설정했습니다. 컨테이너는 수동으로 중지하지 않는 한 계속 실행됩니다. MySQL 자격 증명으로 채울 .env 파일을 정의했습니다. 또한 명명된 볼륨 db-data를 컨테이너의 /var/lib/mysql 디렉토리에 마운트했습니다. MySQL 서비스는 내부 네트워크를 사용하여 drupal과 연결합니다.

    드루팔 서비스

    Drupal 10 Alpine 이미지를 사용하고 있습니다. 알파인 도커 이미지는 크기가 더 작습니다. 이 이미지에는 PHP 처리를 처리하기 위한 PHP-FPM도 포함되어 있습니다. 이것은 사이트를 제공하기 위해 Nginx와 함께 작동합니다. depends_on 옵션은 Drupal이 MySQL 서비스에 연결하도록 지시합니다. 또한 Drupal 컨테이너가 항상 MySQL 컨테이너 다음에 시작되도록 합니다. Drupal은 내부 네트워크를 사용하여 MySQL과 연결하고 외부 네트워크를 사용하여 다른 컨테이너에 노출합니다. 또한 Drupal이 컨테이너의 /var/www/html 디렉토리를 가리키도록 명명된 볼륨을 만들었습니다.

    엔진엑스 서비스

    우리는 Nginx에 Alpine 이미지를 사용하고 있습니다. 포트 80을 호스트에 노출합니다. 명명된 볼륨 두 개를 사용합니다. 하나는 Drupals 공용 디렉터리용이고 다른 하나는 Lets Encrypt SSL 인증서 저장용입니다. 세 번째 볼륨은 나중에 정의할 호스트의 Nginx 구성 디렉터리에 대한 바인딩 마운트입니다. Nginx는 또한 Drupal 사이트가 작동하도록 외부 Docker 네트워크에 연결합니다.

    Certbot 서비스

    마지막으로 SSL 인증서를 설치하기 위해 Certbot 이미지를 가져옵니다. 인증서 및 웹 루트 정의를 위해 Nginx 서비스와 볼륨을 공유합니다. 컨테이너가 생성될 때 실행할 명령도 포함했습니다. 여기서 명령은 --staging 플래그를 사용하여 처음으로 테스트 서버를 가져옵니다. 인증서를 확인하려면 nginx가 필요하지만 인증서가 없으면 Nginx가 시작되지 않습니다. 이것이 우리가 스테이징 인증서를 생성하고 이를 사용하여 Nginx를 시작한 다음 실제 인증서를 생성하는 이유입니다.

    4단계 - Nginx 구성 생성

    Nginx 구성을 위한 디렉터리를 만듭니다.

    $ mkdir nginx-conf
    

    Nginx용 파일을 만들고 엽니다.

    $ nano nginx-conf/drupal.conf
    

    다음 코드를 붙여넣습니다.

    server {
        listen 80;
        listen [::]:80;
    
        server_name drupal.example.com;
    
        index index.php index.html index.htm;
    
        root /var/www/html;
    
        location ~ /.well-known/acme-challenge {
            allow all;
            root /var/www/html;
        }
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass drupal:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    
        location ~ /\.ht {
            deny all;
        }
    
        location = /favicon.ico { 
            log_not_found off; access_log off; 
        }
        location = /robots.txt { 
            log_not_found off; access_log off; allow all; 
        }
        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
            expires max;
            log_not_found off;
        }
    }
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    이 파일에서 서버 이름 및 문서 루트에 대한 지시문이 있는 서버 블록과 인증서, PHP 처리 및 정적 자산 요청에 대한 Certbot 클라이언트의 요청을 지시하는 위치 블록을 추가합니다. 현재 Nginx는 포트 80에서만 수신 대기하여 Certbot이 임시 파일을 /var/www/html/.well-known/acme-challenge 디렉터리를 사용하여 DNS의 유효성을 검사합니다. 이를 통해 webroot 플러그인과 함께 Certbot을 사용할 수 있습니다.

    5단계 - SSL 인증서 생성

    SSL 인증서를 생성하기 위해 컨테이너를 시작합니다. 올바른 스테이징 인증서는 Nginx 컨테이너의 /etc/letsencrypt/live 폴더에서 사용할 수 있습니다.

    $ docker compose up -d
    

    서비스의 상태를 확인하십시오.

    $ docker compose ps
    NAME                IMAGE                  COMMAND                  SERVICE             CREATED             STATUS                     PORTS
    certbot             certbot/certbot        "certbot certonly --…"   certbot             6 minutes ago       Exited (1) 5 minutes ago
    drupal              drupal:10-fpm-alpine   "docker-php-entrypoi…"   drupal              6 minutes ago       Up 6 minutes               9000/tcp
    mysql               mysql:8.0              "docker-entrypoint.s…"   mysql               6 minutes ago       Up 6 minutes               3306/tcp, 33060/tcp
    webserver           nginx:1.22.1-alpine    "/docker-entrypoint.…"   webserver           6 minutes ago       Up 6 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp
    

    인증서 생성 후 Certbot 컨테이너가 성공적으로 종료됩니다. Nginx 컨테이너에서 인증서 위치를 확인합니다.

    $ docker compose exec webserver ls -la /etc/letsencrypt/live
    

    다음과 같은 결과가 표시됩니다.

    total 16
    drwx------    3 root     root          4096 Jan 17 09:15 .
    drwxr-xr-x    9 root     root          4096 Jan 17 09:15 ..
    -rw-r--r--    1 root     root           740 Jan 17 09:15 README
    drwxr-xr-x    2 root     root          4096 Jan 17 09:15 drupal.example.com
    

    이것은 모든 것이 성공했음을 확인합니다. 다음 단계는 실제 인증서를 생성하는 것입니다.

    편집을 위해 docker-compose.yml 파일을 엽니다.

    $ nano docker-compose.yml
    

    Certbot 서비스 섹션에서 --staging 플래그를 교체하고 --force-renewal 플래그로 교체합니다. 이는 Certbot에게 도메인에 대한 새 인증서를 요청하도록 지시합니다. 갱신 플래그는 여기에서 인증서를 갱신하는 데 사용되기 때문에 사용됩니다.

      certbot:
        depends_on:
          - webserver
        image: certbot/certbot
        container_name: certbot
        volumes:
          - certbot-etc:/etc/letsencrypt
          - drupal-data:/var/www/html
        command: certonly --webroot --webroot-path=/var/www/html --email  --agree-tos --no-eff-email --staple-ocsp --force-renewal -d drupal.example.com
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    docker compose up 명령을 다시 실행하여 Certbot 컨테이너를 다시 만듭니다. --no-deps 플래그는 webserver 컨테이너가 이미 실행 중이므로 시작을 건너뛰도록 Certbot에 지시합니다.

    $ docker compose up --force-recreate --no-deps certbot
    

    다음과 같은 결과가 표시됩니다.

    [+] Running 1/0
     ? Container certbot  Recreated                                                                                                                                                                             0.1s
    Attaching to certbot
    certbot  | Saving debug log to /var/log/letsencrypt/letsencrypt.log
    certbot  | Account registered.
    certbot  | Renewing an existing certificate for drupal.example.com
    certbot  |
    certbot  | Successfully received certificate.
    certbot  | Certificate is saved at: /etc/letsencrypt/live/drupal.example.com/fullchain.pem
    certbot  | Key is saved at:         /etc/letsencrypt/live/drupal.example.com/privkey.pem
    certbot  | This certificate expires on 2023-04-17.
    certbot  | These files will be updated when the certificate renews.
    certbot  | NEXT STEPS:
    certbot  | - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
    certbot  |
    certbot  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    certbot  | If you like Certbot, please consider supporting our work by:
    certbot  |  * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
    certbot  |  * Donating to EFF:                    https://eff.org/donate-le
    certbot  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    certbot exited with code 0
    

    6단계 - SSL용 Nginx 구성

    이제 인증서가 활성화되었으므로 인증서를 제공하고 HTTP 요청을 HTTPS로 리디렉션하도록 Nginx를 구성해야 합니다.

    Nginx 서버를 중지합니다.

    $ docker stop webserver
    

    SSL 구성을 위한 새 Nginx 파일을 만들고 편집을 위해 엽니다.

    $ nano nginx-conf/drupal-ssl.conf
    

    다음 코드를 붙여넣습니다.

    server {
        listen 80;
        listen [::]:80;
    
        server_name drupal.example.com;
    
        location ~ /.well-known/acme-challenge {
            allow all;
            root /var/www/html;
        }
    
        location / {
            rewrite ^ https://$host$request_uri? permanent;
        }
    }
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name drupal.example.com;
    
        index index.php index.html index.htm;
    
        root /var/www/html;
    
        server_tokens off;
    
        ssl_certificate /etc/letsencrypt/live/drupal.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/drupal.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/drupal.example.com/chain.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
        ssl_ecdh_curve secp384r1;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
    
        # OCSP stapling
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;
    
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header Referrer-Policy "no-referrer-when-downgrade" always;
        add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass drupal:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    
        location ~ /\.ht {
            deny all;
        }
    
        location = /favicon.ico {
            log_not_found off; access_log off;
        }
        location = /robots.txt {
            log_not_found off; access_log off; allow all;
        }
        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
            expires max;
            log_not_found off;
        }
    }
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    HTTP 블록은 Certbots webroot 플러그인의 위치를 지정하고 모든 HTTP 요청을 HTTPS로 리디렉션합니다.

    다음 단계는 Nginx 컨테이너가 포트 443을 수신하는지 확인하는 것입니다. 편집을 위해 docker-compose.yml 파일을 엽니다.

    $ nano docker-compose.yml
    

    파일의 Nginx 섹션에서 아래와 같이 443을 노출하고 SSL을 활성화하도록 변경합니다.

      webserver:
        image: nginx:1.22.1-alpine
        container_name: webserver
        depends_on:
          - drupal
        restart: unless-stopped
        ports:
          - 80:80
          - 443:443
        volumes:
          - drupal-data:/var/www/html
          - ./nginx-conf:/etc/nginx/conf.d
          - certbot-etc:/etc/letsencrypt
          - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem
        networks:
          - external
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    이제 Nginx에 대한 SSL 구성을 활성화하고 추가했으므로 이전 HTTP 구성 파일을 삭제할 수 있습니다.

    $ rm nginx-conf/drupal.conf
    

    Nginx를 다시 시작하기 전에 위에서 이미 구성한 Diffie-Hellman 그룹 인증서를 생성해야 합니다.

    $ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
    

    Nginx 컨테이너를 다시 만듭니다.

    $ docker compose up -d --force-recreate --no-deps webserver
    

    컨테이너의 상태를 확인합니다.

    $ docker compose ps
    NAME                IMAGE                  COMMAND                  SERVICE             CREATED             STATUS                   PORTS
    certbot             certbot/certbot        "certbot certonly --…"   certbot             3 hours ago         Exited (0) 3 hours ago
    drupal              drupal:10-fpm-alpine   "docker-php-entrypoi…"   drupal              3 hours ago         Up 3 hours               9000/tcp
    mysql               mysql:8.0              "docker-entrypoint.s…"   mysql               3 hours ago         Up 3 hours               3306/tcp, 33060/tcp
    webserver           nginx:1.22.1-alpine    "/docker-entrypoint.…"   webserver           15 seconds ago      Up 13 seconds            0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp
    

    7단계 - Drupal 웹 설치 프로그램 시작

    Drupal 웹 설치 프로그램을 시작할 시간입니다. 브라우저에서 URL https://drupal.example.com을 열면 다음 화면이 나타납니다.

    저장하고 계속하기 버튼을 클릭하여 설치 프로필 페이지로 이동합니다.

    우리는 표준 프로필을 고수할 것입니다. 저장하고 계속하기 버튼을 클릭하여 데이터베이스 구성 페이지로 이동합니다.

    환경 파일에서 사용한 데이터베이스 자격 증명을 입력하고 고급 옵션 섹션을 확장한 다음 mysql을 데이터베이스 호스트로 입력합니다. 이는 Drupal이 연결해야 하는 Docker 작성 파일의 MySQL 서비스 이름과 일치합니다.

    계속하려면 저장하고 계속하기 버튼을 클릭하십시오. Drupal은 기본 모듈 및 테마 설치를 시작합니다.

    다음으로 Drupal 구성 페이지로 이동합니다. 사이트 이름, 이메일, 사용자 이름, 비밀번호 및 지역 설정을 입력합니다. 완료되면 저장하고 계속하기 버튼을 클릭합니다.

    마지막으로 Drupal 대시보드로 이동합니다. 웹 사이트를 만들기 위해 Drupal을 사용할 수 있습니다.

    8단계 - Drupal 구성

    이 단계는 선택 사항이지만 Drupal의 성능을 개선하는 데 도움이 됩니다. 첫 번째 단계는 MySQL 트랜잭션 격리 수준을 설정하는 것입니다. MySQL, MariaDB 및 동급 데이터베이스의 기본 트랜잭션 격리 수준은 \REPEATABLE READ\입니다. Drupal에서 이 설정을 사용하면 테이블에 교착 상태가 발생하여 사이트가 매우 느려지거나 전혀 응답하지 않을 수 있습니다. Drupal 사이트에 권장되는 트랜잭션 격리 수준은 READ COMMITTED입니다.

    MySQL 컨테이너 SSH 셸에 로그인합니다.

    $ docker exec -it mysql bash
    

    루트 사용자를 사용하여 MySQL 셸을 엽니다.

    bash-4.4# mysql -u root -p
    Enter password:
    

    다음 명령을 실행하여 전역적으로 트랜잭션 수준을 변경합니다.

    mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
    

    exit를 두 번 입력하여 MySQL 셸과 컨테이너를 종료합니다.

    다음 단계는 HTTP HOST 헤더 공격으로부터 보호하기 위해 도메인을 신뢰할 수 있는 호스트로 입력하는 것입니다. 이를 위해 Drupal 컨테이너 내부의 /var/www/html/sites/default/settings.php 파일을 편집해야 합니다. Drupal 파일에 대해 이름이 지정된 볼륨을 사용하고 있으므로 변경하는 데 권장되는 방법은 파일을 컨테이너에서 호스트로 복사하고 편집한 다음 다시 컨테이너에 복사하는 것입니다. Drupal 설치 내에서 변경해야 하는 모든 파일에 대해 이 작업을 수행할 수 있습니다.

    컨테이너에서 호스트로 설정 파일을 복사합니다.

    $ docker cp drupal:/var/www/html/sites/default/settings.php settings.php
    

    파일이 읽기 전용 모드입니다. 쓰기 권한을 부여하십시오.

    $ chmod+w settings.php
    

    편집할 파일을 엽니다.

    $ nano settings.php
    

    파일에서 다음 섹션을 찾으십시오.

    #$settings['trusted_host_patterns'] = [
    #  '^www\.example\.com$',
    #];
    

    아래와 같이 해시 기호를 제거하고 Drupal 도메인을 추가하여 주석 처리를 해제하십시오.

    $settings['trusted_host_patterns'] = [
      '^drupal\.example\.com$',
    ];
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    쓰기 권한을 다시 제거하십시오.

    $ chmod -w settings.php
    

    컨테이너 내부에 파일을 다시 복사합니다.

    $ docker cp settings.php drupal:/var/www/html/sites/default
    

    9단계 - Drupal 백업

    명령줄을 사용하여 Drupal 데이터베이스를 백업합니다. Drupal 디렉터리로 전환합니다.

    $ cd ~/drupal
    

    백업용 디렉터리를 생성합니다.

    $ mkdir backup-data
    

    다음 명령을 사용하여 Drupal 데이터베이스를 백업하십시오. MySQL 루트 암호를 묻는 메시지가 표시됩니다.

    $ docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
    Enter password: root_password
    

    위의 명령은 ~/drupal/backup-data 디렉토리에 SQL 백업을 생성합니다.

    디렉토리 내용을 확인하십시오.

    $ ls -al backup-data
    total 6716
    drwxrwxr-x 2 navjot navjot    4096 Jan 19 13:59 .
    drwxrwxr-x 4 navjot navjot    4096 Jan 19 13:35 ..
    -rw-rw-r-- 1 navjot navjot 6868325 Jan 19 13:37 data_19-01-2023_13_36_58.sql
    

    디렉터리에 백업된 데이터베이스를 볼 수 있습니다. phpMyAdmin 도구 또는 다음 명령을 사용하여 이 데이터베이스를 복원할 수 있습니다.

    $ docker compose exec mysql sh -c "exec mysql -uroot -p" < backup-data/data_19-01-2023_13_36_58.sql
    

    크론 작업을 생성하여 데이터베이스를 정기적으로 백업할 수 있습니다.

    /etc/cron.daily 디렉터리에 백업 스크립트를 생성하고 편집을 위해 엽니다.

    $ sudo nano /etc/cron.daily/drupalbackup.sh
    

    다음 코드를 붙여넣습니다.

    #!/bin/bash
    cd /home/navjot/drupal/
    /usr/bin/docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    스크립트를 실행 가능하게 만드십시오.

    $ sudo chmod +x /etc/cron.daily/drupalbackup.sh
    

    이제 데이터베이스가 매일 백업됩니다.

    10단계 - Drupal 업그레이드

    Drupal 업그레이드의 첫 번째 단계는 9단계의 명령을 사용하여 Drupal 데이터베이스를 백업하는 것입니다.

    그런 다음 디렉터리로 전환합니다.

    $ cd ~/drupal
    

    컨테이너를 중지합니다.

    $ docker compose down
    

    최신 컨테이너 이미지를 가져옵니다.

    $ docker compose pull drupal:10-fpm-alpine
    

    다음 주 버전으로 업그레이드하려면 그에 따라 이미지 이름을 조정하고 Drupals 릴리스 정보를 검토하여 문제가 있는지 확인해야 합니다.

    원하는 경우 docker-compose.yml에서 필요한 사항을 변경합니다. 나머지 이미지는 Docker 작성 파일에서 해당 정의를 변경하여 업데이트할 수 있습니다.

    Drupal 컨테이너를 다시 시작하십시오. 또한 다른 패키지의 부 버전에 대한 최신 이미지를 가져옵니다.

    $ docker compose up -d
    

    결론

    이것으로 Ubuntu 22.04 서버에서 Docker를 사용하여 Drupal을 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.