Home Inception ③ 구현 과정
Post
Cancel

Inception ③ 구현 과정

기본 설정

docker-compose.yml

  • 개념
    • 다중 컨테이너 도커 애플리케이션을 정의하는 YAML 파일
      • 확장자 yml과 yaml은 기능상의 차이는 없다.
        • yml은 과거 Windows의 확장자 3자리 규칙 때문에 사용하던 확장자
        • 8.3 파일명 (8.3 filename)
          • DOS를 포함한 Windows 95 이전 버전의 FAT 파일 시스템에 존재하던 파일명 길이에 관한 규칙
          • 전체 파일 이름은 8글자, 확장자는 3글자로 제한하였다.
    • 응용 프로그램을 구성하는 서비스, 구성 방법 및 응용 프로그램 간의 관계를 설명한다.
    • 각 서비스는 동일한 네트워크 내에서 별도의 컨테이너로 정의되어 서로 쉽게 통신할 수 있다.
  • 구성
    • Services
      • 이미지, 볼륨, 포트 등 컨테이너형 서비스들에 대해 정의함
      • volumes
        • 데이터를 유지시켜준다.
        • 컨테이너가 삭제되어도 볼륨에 저장해두면 데이터를 저장할 수 있다.
      • env_file (optional)
        • docker compose 명령행 도구가 자동적으로 이 파일을 로드한다.
        • 파일명이 .env가 아니거나 yml 파일과 다른 경로에 있을 때는 정의해야 한다.
      • ports
        • 포트를 정의
        • [호스트 측 포트 번호] : [컨테이너 측 포트 번호]
        • 예시
          1
          2
          
            ports:
                - 3306:3306
          
          • 컨테이너의 3306번 포트를 개방하고 호스트의 3306번 포트와 매핑한다는 의미
    • Networks
      • 컨테이너를 연결하는 데 사용되는 도커 네트워크를 정의함
    • Volumes
      • 영구 데이터를 저장하는 데 사용되는 도커 볼륨을 정의함
      • driver : 볼륨 드라이버
        • local : 빌트인 docker 볼륨 드라이버. 데이터를 호스트 파일 시스템에 저장한다.
      • driver_opts : 위의 볼륨 드라이버에 대한 옵션
        • device : 볼륨 데이터가 호스트 파일 시스템 상에 저장되는 경로
        • o : 마운트 명령에 전달할 추가적인 옵션
          • bind
            • 볼륨이 bind mount로 마운트된다.
          • device 필드에 경로를 지정했지만 bind로 정의하지 않은 경우는?
            • device가 무시되고 볼륨에 데이터가 저장된다.
    • Environment variables
      • 애플리케이션 서비스에서 사용할 수 있는 환경 변수를 나열함
    • Configurations
      • 애플리케이션 서비스에 필요한 추가 구성 파일이 포함됨

Makefile

  • clean
    1
    
      sudo docker compose -f ./srcs/docker-compose.yml down -v --rmi all --remove-orphans
    
    • down : 컨테이너를 중지. 컨테이너, 네트워크, 볼륨을 제거
    • -v : docker-compose.yml 파일의 volumes 섹션에 정의된 볼륨을 제거한다.
      • 여기 정의되지 않은 볼륨은 제거하지 않기 때문에 dangling 볼륨이 남아있을 수 있음.
    • --rmi all : 서비스에 사용된 모든 이미지 제거
    • --remove-orphans : 가동을 시작했지만 docker-compose.yml 파일에 정의되어 있지는 않은 컨테이너를 제거
  • fclean
    1
    
      sudo docker system prune --volumes -af
    
    • 사용하지 않는 도커 이미지, 컨테이너, 네트워크, 볼륨을 삭제
    • clean 룰의 docker compose down 명령어를 실행한 뒤에 이 명령어를 실행하는 이유?
      • 어느 서비스에도 속하지 않은 dangling 볼륨을 제거하기 위해

컨테이너

MariaDB

mariadb-logo

  • MySQL RDBMS(관계형 데이터베이스 관리 시스템)에서 포크한 자유-오픈 소스 RDBMS
  • MySQL과 높은 호환성을 유지하여 drop-in 대체 기능을 제공한다.
    • drop-in 대체 : 기존 소프트웨어와 호환되도록 디자인된 소프트웨어 구성 요소
  • 웹 애플리케이션을 위한 백엔드 DBMS로 자주 사용되며, 분석 및 비즈니스 인텔리전스 목적으로도 흔히 사용된다.

Dockerfile

  • Docker image를 만드는 방법
    • Docker Hub에서 이미지 pull : 과제에서 금지
    • Dockefile로 이미지 빌드
  • 순서
    • 컨테이너의 기반 이미지를 설정한다. (FROM)
    • 환경 변수를 설정한다. (ENV)
    • 컨테이너 안에 주요 패키지를 설치한다. (RUN)
      • RUN : 빌드 과정동안 명령을 실행하는데 사용
    • 로컬에서 필요한 파일들을 컨테이너 내부 디렉토리에 복사한다. (COPY/ADD)
      • shell에서 다음과 같이 명령어를 입력하면 동작중인 컨테이너의 내부의 셸을 실행시킬 수 있다.

        1
        
          docker exec -it my_container sh
        
        • -i (interactive) : 컨테이너와 detach된 이후에도 상호작용할 수 있도록 STDIN을 계속 열어준다.
        • -t (pseudo-tty) : pseuto-TTY를 할당하여 터미널을 통해 컨테이너와 상호작용할 수 있게 해줌.
      • RUN cp 대신 COPY/ADD를 사용하는 이유?

        • COPY/ADDRUN cp 보다 성능이 좋다.
          • RUN을 사용하면 2개의 레이어에 걸쳐 이루어지는 반면 COPY/ADD는 한 레이어만에 작업이 이루어지기 때문에 더 효율적이다.
        • COPY/ADD를 사용하면 파일 소유권(file ownership)이나 권한(permission)이 유지된다.
    • 포트를 expose한다. 도커에게 컨테이너가 해당 포트를 listen할 것이라고 알려준다. 다른 컨테이너가 이 컨테이너와 연결할 때 해당 포트를 사용할 수 있게됨. (EXPOSE)
    • 컨테이너가 시작될 때 실행할 명령어를 정의한다. (ENTRYPOINT/CMD)
      • CMD : 주로 ENTRYPOINT에 전달될 디폴트 인자를 제공하는데 사용됨. 여러번 호출할 수 있음.
      • ENTRYPOINT : 도커파일의 마지막에 한 번만 호출할 수 있음.
      • 다음과 같이 Dockerfile을 작성하게 되면 아래와 같은 결과를 확인할 수 있음.
        1
        2
        3
        
          FROM alpine:latest
          ENTRYPOINT ["/bin/echo"]
          CMD ["Hello, world!"]
        
        1
        2
        3
        
          $ docker build -t my-image .
          $ docker run my-image
          Hello, world!
        
  • 주의 사항
    • Shell script를 실행하기 전에 권한 변경
      • chmod +x [filename]
    • 컨테이너가 Shell script를 실행하는 경우
      • 문제점
        • ENTRYPOINT가 셸 스크립트인 경우, 해당 스크립트가 PID1이 된다.
          1
          
            ENTRYPOINT ["/tmp/entrypoint.sh"]
          
        • 하지만 해당 스크립트는 자식 프로세스(mardb)의 종료를 처리(process reaping)하지 않기 때문에 좀비 프로세스가 생성될 수 있다.
      • 해결책
        • 방법 1. dumb-init 또는 tini를 ENTRYPOINT로 사용하고 CMD로 셸 스크립트를 실행한다.

          1
          2
          
            ENTRYPOINT ["/usr/bin/dumb-init", "--"]
            CMD ["/tmp/entrypoint.sh"]
          
          • ENTRYPOINT의 "--" : 뒤에 오는 모든 CMD를 받는다는 의미
        • 방법 2. 셸 스크립트가 종료될 때 exec mysqld와 같은 방법으로 프로세스를 실행한다.

          • exec를 사용하면 메인 프로세스가 셸 스크립트에서 mysql로 변경된다.
          • 시그널이 셸 프로세스가 아닌 mysqld에게로 제대로 전달된다.
          • mysqld가 종료되면 컨테이너도 같이 종료된다.

entrypoint.sh

컨테이너가 시작될 때 실행할 셸 스크립트

  • 역할
    • mysql 서버 데몬을 백그라운드로 실행
    • DB에 쿼리문을 입력한 뒤에 mysql 서버 중지
    • mysqld_safe 실행
      • mysql 서버를 foreground로 실행한다.
      • 서버에 crash가 발생한 경우 재시작한다. (mysqld와의 차이점)

init.sql

mariadb에 입력할 쿼리문

  • 쿼리문 순서
    • DB 생성
    • 유저 생성
      • Admin 유저
      • 일반 유저
    • 권한 부여
      • Admin 유저
      • 일반 유저
    • 권한 적용
    • root에 암호 설정
  • 주의 사항
    • mysql -u root와 같이 암호 없이 접속이 불가능한지 확인

50-server.cnf

MariaDB 컨테이너에 포함된 설정 파일

  • 특징
    • mariadb-server 패키지의 일부
    • DB 서버의 기본 설정을 담고있다.
    • /etc/mysql/mariadb.conf.d/ 디렉토리 내부에 존재한다.
  • 사용 방법
    • 전체 파일에서 일부를 변경한 호스트의 50-server.cnf파일을 컨테이너로 덮어씌우는 방법으로 설정을 적용함
      • bind-address0.0.0.0으로 변경하여 모든 IP로의 접속을 가능하게 한다.
    • MariaDB의 설정을 변경하는 가장 좋은 방법은 my.cnf라는 파일에 특정 속성만 변경하여 /etc/mysql/에 위치시키는 것.
    • my.cnf
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      
        # The MariaDB configuration file
        #
        # The MariaDB/MySQL tools read configuration files in the following order:
        # 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
        # 2. "/etc/mysql/conf.d/*.cnf" to set global options.
        # 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
        # 4. "~/.my.cnf" to set user-specific options.
        #
        # If the same option is defined multiple times, the last one will apply.
        #
        # One can use all long options that the program supports.
        # Run program with --help to get a list of available options and with
        # --print-defaults to see which it would actually understand and use.
              
        #
        # This group is read both both by the client and the server
        # use it for options that affect everything
        #
        [client-server]
              
        # Import all .cnf files from configuration directory
        !includedir /etc/mysql/conf.d/
        !includedir /etc/mysql/mariadb.conf.d/
      

기타

  • MariaDB 사용 방법
    • DB에 접근
      1
      
        mariadb -u <username> -p<password>
      
    • DB 내 데이터 확인
      1
      2
      3
      4
      
        SHOW DATABASES;
        USE $MARIADB_DATABASE;
        SHOW TABLES;
        SELECT user, host, password FROM mysql.user;
      

NGINX

Dockerfile

  • ENTRYPOINT ["nginx", "-g", "daemon off;"]
    • daemon off;
      • nginx를 foreground에서 실행하도록 하는 지시어
      • 이로 인해 웹서버가 시작된 이후에도 컨테이너가 종료되지 않는다.
        • 이 지시어가 없다면 nginx가 background에서 시작되고 컨테이너는 종료된다.

default.conf

Nginx의 기본 설정 파일

  • 특징
    • 보통 /etc/nginx/conf.d 에 위치한다.
      • /etc/nginx/sites-enabled 디렉토리의 default.conf : 주로 컨테이너화 되지 않은 서버에서 사용
    • 서버 블록을 명시하는데 사용된다.
      • 특정 도메인 이름이나 IP 주소로 요청이 들어왔을 때 Nginx가 어떻게 응답해야하는지에 대한 정의를 내림.
  • 작성 예시

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      server {
      listen 443 ssl;
      listen [::]:443 ssl;
    
      ssl_certificate /etc/ssl/certs/taehooki.crt;
      ssl_certificate_key /etc/ssl/private/taehooki.key;
      ssl_protocols TLSv1.2 TLSv1.3;
      ...
      }
    
    • /etc/ssl/certs/etc/ssl/private은 인증서와 개인키를 저장하는 일반적인 경로
  • 참고 : HTTP를 HTTPS로 리다이렉션하는 방법

    1
    2
    3
    4
    5
    
      server {
      listen 80;
      server_name taehooki.42.fr;
      return 301 https://$server_name$request_uri;
      }
    
    • 80번 포트(HTTP)를 listen하다가, 들어온 요청을 HTTPS로 변경한다.
    • 301 : 영구적으로 이동시킨다는 의미

WordPress

Dockerfile

  • wp-cli 설치
    1
    
      RUN curl https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
    
  • PHP PID파일 생성
    • php-fpm8.1 -F를 실행하기 전에 /run/php/php8.1-fpm.pid 파일이 해당 경로에 존재해야한다.
      1
      
        RUN mkdir /run/php && touch /run/php/php8.1-fpm.pid
      

entrypoint.sh

  • wordpress를 설치
  • wp-cli를 통해 세부 설정을 진행

www.conf

  • 개념
    • PHP-FPM의 설정 파일
    • /usr/local/etc/php-fpm.d/ 에 위치
    • PHP-FPM이 관리하는 FastCGI의 동작을 정의한다.
  • 주요 속성
    • 생성할 하위 프로세스 수
    • 각 프로세스가 처리할 수 있는 최대 요청 수
    • 프로세스를 실행할 사용자 및 그룹
    • PHP-FPM이 수신해야 하는 소켓 파일 또는 TCP/IP 주소 및 포트 번호
  • 변경사항
    • listen 속성을 다음과 같이 수정
      1
      2
      
        # listen = /run/php/php8.1-fpm.sock
        listen = 9000
      

결과

컨테이너 실행

  • make로 이미지 빌드 후 컨테이너 실행 wp
  • docker images, docker ps, docker network ls, docker volume ls 확인 wp
  • docker logs -f <Container ID>로 wordpress 설치가 완료되었는지 확인 wp

Wordpress 접속

  • https://<intra ID>.42.fr로 이동
    • 127.0.0.1로는 접속할 수 있지만 위 주소로는 접속할 수 없다면 /etc/hosts 파일에 도메인을 매핑해야한다.
    • 다음과 같은 경고창이 뜨는데, openSSL을 통해 인증서를 발급받았기 때문이다. wp
      • 인증서 정보는 다음과 같다. wp
    • [Advanced] - [Accept the Risk and Continue]를 차례로 클릭하면 사이트에 접속할 수 있다.
  • 컨테이너 생성 시 Wordpress를 설치했고 wp-cli로 기본적인 설정을 마쳤다면 다음과 같은 화면을 볼 수 있다. wp
  • https://<intra ID>.42.fr/wp-admin으로 이동한 뒤 admin 계정으로 로그인 wp
    • 로그인을 마치면 다음과 같이 관리 페이지가 나온다. wp
    • Users탭에서 이전에 등록한 사용자를 확인할 수 있다. wp

Ref.

This post is licensed under CC BY 4.0 by the author.

Inception ② 배경 지식 : 기타

Git 커밋 메시지 관련 지침 (Commit Message Convention)