2. Docker httpd 환경 설정하기 (PHP 연동, Virtualhost 및 SSL 적용)

반응형

2. Docker httpd 환경 설정하기 (PHP 연동, Virtualhost 및 SSL 적용)

 

1) httpd 기본 환경 설정 방법

httpd 컨테이너 내의 설정 파일 (conf) 를 호스트 서버로 복사하고 호스트 서버의 conf 디렉토리를 사용하도록 해야 합니다.

컨테이너가 구동중인 상태에서 아래와 같이 파일을 복사 합니다.

 

httpd 컨테이너의 /usr/local/apache2/conf 디렉토리를 /home/sysdocu/httpd/ 디렉토리 아래로 복사.

# docker cp httpd:/usr/local/apache2/conf/ /home/sysdocu/httpd/

 

호스트 서버에서 httpd 에 대한 conf 설정과 logs 확인이 가능하도록 docker-compose.yml 파일을 수정합니다.

그리고 아래 SSL 인증서 사용을 위해 호스트 서버와 컨테이너의 포트 (443) 도 연결 설정을 해줍니다.

# vi docker-compose.yml

...
    httpd:
        image: httpd:2.4.54
        container_name: httpd
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /home/sysdocu/httpd/html/:/usr/local/apache2/htdocs/
            - /home/sysdocu/httpd/conf/:/usr/local/apache2/conf/
            - /home/sysdocu/httpd/logs/:/usr/local/apache2/logs/
...

 

변경된 컨테이너를 적용합니다.

# docker compose stop httpd
# docker rm -v httpd
# docker compose up -d httpd

 

 

2) PHP 연동

 

PHP 연동에 필요한 httpd 모듈을 활성화 합니다.

# vi /home/sysdocu/httpd/conf/httpd.conf

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so    # 주석 해제
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so    # 주석 해제
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so    # 주석 해제
...
# 아래 확장자는 php 컨테이너로 포워딩 처리
ProxyPassMatch ^/(.*\.html(/.*)?)$ fcgi://php:9000/var/www/html/$1    # 추가
ProxyPassMatch ^/(.*\.htm(/.*)?)$ fcgi://php:9000/var/www/html/$1    # 추가
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    # 추가

 

설정 적용을 위해 httpd 컨테이너를 재시작 합니다.

# docker compose restart httpd

 

3) virtualhost 설정

 

아래 파일에서 virtualhost 부분을 사용할 수 있도록 주석 제거하고 virtualhost 설정 파일을 수정합니다.

# vi /home/sysdocu/httpd/conf/httpd.conf

<Directory />
    AllowOverride none
    Require all granted    # 수정
</Directory>

Include conf/extra/httpd-vhosts.conf    # 주석 해제

 

# vi /home/sysdocu/httpd/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "/home/sysdocu/httpd/html"
    ServerName sysdocu.tistory.com
    ErrorLog "logs/sysdocu.tistory.com-error_log"
    CustomLog "logs/sysdocu.tistory.com-access_log" common
</VirtualHost>

 

컨테이너 재시작 후 웹브라우저에서 잘 출력되는지 다시 확인해봅니다.

# docker compose restart httpd

 

('403 Forbidden' 에러가 출력될 경우)

/home/sysdocu 와 같이 홈 소스 디렉토리가 있는지 확인하고 접근 권한 (퍼미션 755) 을 확인해 봅니다.

 

4) SSL 발급 및 설정

 

준비된 SSL 인증서가 없으므로 Let's encrypt 에서 발급받아 사용해 봅니다.

https://sysdocu.tistory.com/1546

 

인증서 파일을 발급 받았으면 컨테이너에서 인증서 파일 인식이 가능하도록 복사해 줍니다.

# mkdir /home/sysdocu/httpd/conf/ssl
# cp -arp /etc/letsencrypt/archive/sysdocu.tistory.com /home/sysdocu/httpd/conf/ssl/

 

httpd 설정 파일을 아래와 같이 수정합니다.

# vi /home/sysdocu/httpd/conf/httpd.conf

LoadModule ssl_module modules/mod_ssl.so    # 주석 해제
Include conf/extra/httpd-ssl.conf    # 주석 해제

 

# vi /home/sysdocu/httpd/conf/extra/httpd-ssl.conf

#SSLSessionCache        "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"    # 주석 처리
#SSLSessionCacheTimeout  300    # 주석 처리

<VirtualHost *:443>
DocumentRoot /home/sysdocu/httpd/html
ServerName sysdocu.tistory.com:443
...
SSLEngine on
SSLCertificateFile conf/ssl/sysdocu.tistory.com/cert1.pem
SSLCertificateKeyFile conf/ssl/sysdocu.tistory.com/privkey1.pem
SSLCertificateChainFile conf/ssl/sysdocu.tistory.com/fullchain1.pem
</VirtualHost>

 

설정 적용을 위해 컨테이너를 재시작하면 웹브라우저에서 https 로 접근하여 인증서 확인이 가능합니다.

# docker compose restart httpd

 

반응형

댓글()

1. Ubuntu 22.04 에서 Docker 사용하기 (APM 기본 설치)

반응형

 

[ Docker 설치 ]

1. 패키지 목록 최신화 및 업그레이드
# apt -y update

# apt -y upgrade
# apt -y install apt-transport-https ca-certificates curl gnupg lsb-release

2. Docker 공식 GPG 설치
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg |gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3. Docker 공식 저장소 추가
# echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" |tee /etc/apt/sources.list.d/docker.list > /dev/null

4. Docker 설치 및 확인

# apt -y update
# apt -y install docker-ce docker-ce-cli containerd.io
# docker --version

5. Compose 설치 및 확인

도커 컨테이너 구동 명령시 옵션으로 환경 값을 줄 수 있는데, 이경우 명령 라인이 길어지는 불편함이 있습니다.

docker-compose 는 이런 불편함을 없애고, 미리 준비한 환경을 파일(.yml) 을 사용하며 여러 컨테이너를 한 번에 관리할 수 있습니다.

 

1) Plugin 형태로 사용할 경우 (매뉴얼 진행 형태)
# apt -y install docker-compose-plugin
# docker compose version

 

2) Standalone 형태로 사용할 경우
# curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version

 


[ Docker 삭제 ]

1. Docker 관련 패키지를 제거
# apt purge docker-ce docker-ce-cli containerd.io

2. 호스트의 이미지, 컨테이너, 볼륨 또는 사용자 지정 구성파일 제거 (모든 이미지, 컨테이너 및 볼륨 수동 삭제)
# rm -rf /var/lib/docker
# rm -rf /var/lib/containerd

 


[ APM 설치 ]

1. 설치 및 확인
특정 버전을 명시하지 않으면 최신 버전의 이미지가 다운로드 됩니다.
사용 예) docker pull {이미지}:{버전}
# docker pull httpd:2.4.54
# docker pull php:8.2.0-fpm
# docker pull mysql:8.0.31

 

다운로드 된 이미지 리스트를 출력합니다.

# docker images

 

(기타 명령 - 설치)

# docker search mysql    // 다운로드 가능한 이미지 출력

# docker pull mysql         // mysql:8.0.31 와 같이 특정 버전을 지정하지 않으면 최신 버전이 설치됩니다.

                                           (mysql 또는 mysql:latest)

                                           아래 URL 에서 제공하는 버전을 확인 할 수 있습니다.

                                           https://hub.docker.com/_/mysql

                                           https://hub.docker.com/_/php

                                           https://hub.docker.com/_/httpd

 

(기타 명령 - 삭제)

이미지 삭제는 컨테이너 우선 삭제 후 가능합니다.

# docker ps                                 // 컨테이너 리스트 출력

# docker rm cea0f7b8d47f          // 출력된 컨테이너 ID 로 컨테이너 삭제

# docker images                          // 이미지 리스트 출력

# docker rmi httpd                        // 이미지 삭제

* 참고

이미지 삭제시 아래와 같은 메세지가 출력되는 경우는 REPOSITORY 가 같고 버전의 차이가 없는 경우입니다.

(예 : httpd:2.4.54 와 httpd:latest 가 같은 버전일 경우)
Error response from daemon: conflict: unable to delete 157dcdf23d6c (must be forced) - image is referenced in multiple repositories

아래와 같이 -f 옵션으로 강제 삭제를 하게 되면 두개의 이미지가 동시 삭제 됩니다.

# docker rmi -f 157dcdf23d6c


2. 가동

APM 환경 파일을 컨테이너와 연결하여 생성합니다.
# vi docker-compose.yml

version: '3.9'

services:
    httpd:
        image: httpd:2.4.54
        container_name: httpd
        restart: unless-stopped # 서버 부팅시 컨테이너 가동
        ports:
            - "80:80"
        volumes:
            - /home/sysdocu/httpd/html/:/usr/local/apache2/htdocs/ # 웹 소스 파일 경로

    mysql:
        image: mysql:8.0.31
        container_name: mysql
        restart: unless-stopped
        tty: true
        ports:
            - "3306:3306"
        environment:
            MYSQL_HOST: localhost
            MYSQL_ROOT_PASSWORD: 12345678 # 초기 mysql root 비밀번호
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
            TZ: Asia/Seoul

    php:
        image: php:8.2.0-fpm
        container_name: php
        restart: unless-stopped
        ports:
            - "9000:9000"
        volumes:
            - /home/sysdocu/httpd/html/:/var/www/html/  # php 소스 코드를 사용하기 위해 필수 설정
        command:
            - /bin/sh
            - -c
            - |
              echo "security.limit_extensions = .html .htm .php" >> /usr/local/etc/php-fpm.d/www.conf  # 특정 확장자만 php 소스 코드 사용
              php-fpm

 

파일 맨 위에 compose version 은 docker 버전에 맞추어 사용해야 합니다. 아래 URL 에서 확인이 가능합니다.

https://docs.docker.com/compose/compose-file/compose-versioning/#compatibility-matrix

 

이제 컨테이너를 가동합니다.

# docker compose up -d               // 백그라운드로 전체 서비스 (컨테이너) 올리기

* 이 작업이 선행 되어야 컨테이너 별로 제어 (시작/중지) 가 가능함

 

index.html 를 만들고 브라우저로 접속하면 아래 내용 (New index) 이 출력되는것을 확인할 수 있습니다.

# echo "New index" > /home/sysdocu/httpd/html/index.html

 

그리고 변경된 내용이 httpd 컨테이너 내에도 확인됩니다.

( 실 데이터 저장 위치 : /home/sysdocu/httpd/html/ )

# docker exec -it httpd /bin/bash

root@771473b9edc0:/usr/local/apache2# cd htdocs
root@771473b9edc0:/usr/local/apache2/htdocs# cat index.html 
New index

 

현재 컨테이너 구동 상태입니다.

# docker compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
httpd               "httpd-foreground"       httpd               running             0.0.0.0:80->80/tcp, :::80->80/tcp
mysql               "docker-entrypoint.s…"   mysql               running             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
php                 "docker-php-entrypoi…"   php                 running             0.0.0.0:9000->9000/tcp, :::9000->9000/tcp

 

(기타 명령)

# docker compose images       // 올려진 서비스 (컨테이너) 가 사용중인 이미지 리스트 출력. (모든 이미지 출력 : docker images)

# docker compose ps               // 올려진 서비스 (컨테이너) 출력

# docker compose stop php     // 올려진 서비스 (컨테이너) 선택 중지

# docker compose start php     // 올려진 서비스 (컨테이너) 선택 시작

# docker rm -v php                    // 올려진 서비스 (컨테이너) 삭제
# docker compose up -d php    // 하나의 서비스 (컨테이너) 만 구동

 

모든 컨테이너를 더이상 사용하지 않을때 아래와 같이 내립니다.

# docker compose down    // 컨테이너 중지 및 삭제

 

반응형

댓글()