[작성자:] d_dive

  • 컨테이너와 VM 가상화 이해하기

    컨테이너와 VM 가상화 이해하기

    가상화(virtualization)

    – 일반적으로 서버 스토리지, 네트워크, 애플리케이션 등을 가상화 하여 하드웨어 리소스를 효율적으로 사용하는데 그 목적이 있고, 이를 통해 기업은 효율적인 자원 활용, 자동화된 IT 관리, 빠른 재해 복구 등의 장점을 갖을 수 있음.

    – 물리적 하드웨어 유지 관리 대신 소프트웨어적으로 추상화된 가상화를 통해 제한된 부분을 쉽게 관리하고 유지할 수 있음.

    – 하이퍼바이저 기반의 가상머신(VM, Virtual Machine)

    컨테이너 가상화 vs VM 가상화

    – 두가지 가상화 모두 실행하고자 하는 애플리케이션 프로세스 및 종속 요소와 소스 등을 패키지, 즉 이미지화 하여 HostOS와 격리된 환경을 제공.

    – 다만, VM 가상화는 실제 호스트 운영체제와 같이 별도의 GuestOS를 두고 원하는 애플리케이션을 설치하는 **하드웨어 수준의 가상화 구현.**

    – 컨테이너 가상화는 VM 가상화에 비해 경량이면서 호스트 운영체제의 커널을 공유하는 운영체제(OS)수준의 가상화 구현.

    – 따라서, 컨테이너 가상화는 원하는 애플리케이션 환경을 빠르게 번들링하여 패키지함.

    애플리케이션 배포 방식 비교

    컨테이너화 기술

    – 리눅스 컨테이너 기술은 LXC(Linux Container)를 이용한 시스템 컨테이너화로 시작
    – OS 수준의 가상화 도구.
    – cgroup, namespace 등의 커널 기술을 공유하여 컨테이너에 제공

    – 이후 애플리케이션 컨테이너 기반의 Docker 출시가 되었고, 초기 Docker 버전은 LXC를 활용해 컨테이너를 생성.

    – 지속된 컨테이너 엔진의 발전으로 Docker는 containerd, runC 를 이용하는 방식으로 변경.
    – 커널 기술의 공유를 통해 컨테이너 생성을 지원하는 runC
    – 생성된 컨테이너의 라이프사이클 관리를 지원하는 containerd
    – 사용자 환경에서의 명령을 전달하는 dockerd

    Dockerd 기능

  • Docker와 컨테이너의 중요성: 빠르고 경량화된 배포

    Docker와 컨테이너의 중요성: 빠르고 경량화된 배포

    컨테이너 기술

    • 컨테이너는 애플리케이션을 언제든 실행 가능하도록 필요한 모든 요소를(소스 코드, 구성 요소, 종속성 등) 하나의 런타임 환경으로 패키징한 논리적 공간.
    • 이러한 패키징 기술을 Docker에서는 Dockerfile build를 통해 구현

    애플리케이션과 종목 항목을 하나로 묶어, 실행하게 해주는 운영 시스템을 가상화한 경량의 격리된 프로세스라고 볼 수 있음

    • mircoVM 이라고도 함.
    • 운영체제 수준의 가상화 제공.
    • 독립성을 갖기 때문에 다른 컨테이너에 영향을 주는 않는 statless 환경 제공.(VM과 같음)

    컨테이너 기술이란

    • 이 기술은 개인 데스크탑 뿐 아니라 기업 내의 온프레미스 서버에서 AWS와 같은 퍼블릭 클라우드까지 언제 어디서든 빠르고 효율적으로 배포 가능. 확장성 또한 가지고 있음.
    • 이를 통해 서버구성, OS 설치, 네트워크, 개발 도구 구성 등의 반복적이고 불편한 작업에 시간을 낭비하지 않고 개발자는 애플리케이션 개발 그 자체에 집중할 수 있음.

    컨테이너의 특징

    • 컨테이너는 우리가 개발한 최소한의 image를 통해 실행되므로 경량.
      – 컨테이너 이미지 생성의 Best pratice 중 하나는 이미지 경량화 다.
    • 일반 서버 환경에서의 애플리케이션 실행과 달리 언제든 프로세스 수준의 속도로 빠르게 실행(run) 할 수 있고, 한번에 여러 개의 컨테이너를 동시에 실행 가능.
      – Docker에서는 Docker compose 기술을 통해 구현.
    • 개인 환경이던 클라우드 환경이던 어떤 OS, 어떤 환경에서도 동작 가능한 이식성을 보유하고 있음.
    • 컨테이너 자체 애플리케이션 환경에 대한 관리만 요구되므로, 지속적 서버관리 비용을 절감 할 수 있음.
    • 개발팀과 운영팀의 업무 분리로 각자의 업무와 세븐화된 관리에 집중할 수 있음. 즉, 컨테이너는 DevOps workflow 구성에 최적. ===> CI/CD 업무

    컨테이너는 어떤 타입으로 생성

    • 컨테이너 패키징 메커니즘 시스템 / 애플리케이션 / 라우터 컨테이너
    • 시스템(or OS) 컨테이너
      – 호스트 OS 위에 Ubuntu와 같은 배포판 리눅스 image를 통해 배포되는 컨테이너.
    • 또다른 VM의 형태이고, 내부에 다양한 애플리케이션 및 라이브러리 도구를 설치, 실행 가능.
    • 대표적으로 LXC, LXD, OpenVZ, Linux VServer, BSD jails 등이 있음.
    • 애플리케이션 컨테이너(Docker의 주역할.)
      – 단일 애플리케이션 실행을 위해 해당 서비스를 패키징하고 실행하도록 설계된 컨테이너.
    • 3-tier 애플리케이션과 같은 경우 각 tier (frontend-backend-DB)를 개별 컨테이너로 실행하여 연결.
    • 대표적으로 Docker container runtime, Rocket 등이 있음

    Docker는 무엇

    • 여러 계층의 Application을 container로 분리, 연결하여 실행하는 **MSA(MicroService Architecture) 프로젝트에 유용함
    • Application의 Infra(runtime)는 Image를 통해 제공하고 Public or Private 하게 공유 가능
    • Github와 유사한 방식(open share)으로 Docker hub에서 제공 함.
    • 이렇게 제공된 image를 기반으로 Application 서비스를 제공, 이를 통해 컨테이너화(containerization) 할 수 있음

  • Docker로 CentOS7 환경 구축하기

    Docker로 CentOS7 환경 구축하기

    Docker 셋팅

    Docker Desktop 설치

    Docker centOS7 image 다운

    • docker hub 에서 다운로드 받으면 됨

    해당 이미지를 이용해서 docker container 제작해 centOS7 환경 구축

    docker run --privileged -it -d --name centos_test --hostname centos_test centos:7.9.2009 /usr/sbin/init

    -ddetached mode 흔히 말하는 백그라운드 모드-p호스트와 컨테이너의 포트를 연결 (포워딩)-v호스트와 컨테이너의 디렉토리를 연결 (마운트)-e컨테이너 내에서 사용할 환경변수 설정–name컨테이너 이름 설정–rm프로세스 종료시 컨테이너 자동 제거-it터미널 입력을 위한 옵션–link컨테이너 연결 [컨테이너명:별칭]

    docker 실행

    docker exec -it centos_test /bin/bash

    yum 안될 때

    yum command를 찾지 못할 때..

    yum update

    net-tools, vim, wget 설치

    yum install net-tools vim wget

    npm, nodejs 설치되지만, 버전이 맞지 않아 pm2를 설치 오류가 생김

    해결법

    nvm(node Version Manager)를 설치

    먼저 wget을 설치해주어야 함

    yum install wget
    
    ---
    # nvm 다운로드 및 설치.
    wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
    # 설치가 완료되면 .bashrc 파일에 아래 설정이 추가 되어짐.
    # .bashrc export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" 
    # This loads nvm bash_completion
    # nvm 설정 적용.
    source ~/.bashrc
    # nvm 설치 버전 확인.
    nvm --version
    
    ---
    
    nvm use systemnode -v
    npm uninstall -g a_module

    기본 사용법

    nvm list 
    #or 
    nvm ls
    • 특정 버전 사용
    nvm use <version> 
    # ex) nvm use 16.17.0
    • 버전 추가 및 삭제
    # 버전 추가 
    nvm install <version> 
    # ex) nvm install 16.17.0 
    # 16.x.x 의 마지막 버전 추가 
    nvm install <major version> 
    # ex) nvm install 16 
    # 버전 삭제 
    nvm uninstall <version> 
    # ex) nvm uninstall 16.17.0
    • 기본 버전 설정
    nvm alias default <version> 
    # ex) nvm alias default 16.17.0

    node.js 설치

    nvm 저장소에 지원하는 node 버전을 확인해 봄

    # 지원하는 node 버전 확인. 
    nvm ls-remote
    
    # LTS 버전으로 설치.
    nvm install --lts
    
    # 정상적으로 설치 되어졌는지 확인.
    node -v 
    npm -v

    pm2 설치

    npm install pm2 -g
    • -g : global 설치

    AWS EC2 서버 접속

    해당 container에 키파일 저장
    키파일이 있는 폴더에 디렉토리를 변경해준다

    pm2-logrotate 설치

    pm2 install pm2-logrotate

  • Firewalld 방화벽 설정 가이드

    Firewalld 방화벽 설정 가이드

    📌 Firewalld 상태 확인 및 관리

    sudo systemctl status firewalld
    • active (running)이면 동작 중
    • inactive (dead)이면 정지 상태

    📌 Firewalld 시작 및 종료

    sudo systemctl start firewalld   # 방화벽 시작
    sudo systemctl stop firewalld    # 방화벽 정지
    sudo systemctl restart firewalld # 방화벽 재시작
    sudo systemctl enable firewalld  # 부팅 시 자동 시작 설정
    sudo systemctl disable firewalld # 부팅 시 자동 시작 해제

    📌 방화벽 규칙 설정 및 관리

    sudo firewall-cmd --list-all
    • 현재 활성화된 방화벽 영역(zone)과 적용된 규칙을 확인할 수 있음.

    📌 방화벽 영역(Zone) 확인

    sudo firewall-cmd --get-active-zones

    📌 방화벽 영역(Zone) 디폴트 존 변경

    # 디폴트 존 변경.
    sudo firewall-cmd --set-default-zone=block
    
    # 특정 인터페이스 block 존에 바인딩.
    sudo firewall-cmd --zone=block --change-interface="인터페이스이름"
    
    # 변경 사항 영구 적용.
    sudo firewall-cmd --runtime-to-permanent

    📌 특정 포트 허용

    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    • — zone=public: public 영역에 적용
    • — add-port=8080/tcp: 8080 포트의 TCP 트래픽 허용
    • — permanent: 영구 적용 (재부팅해도 유지됨)

    📌 즉시 적용하려면 방화벽 다시 로드

    sudo firewall-cmd --reload

    📌 특정 서비스 허용

    Firewalld는 서비스 단위로 접근을 제어할 수 있음. 예를 들어, SSH(22번 포트)를 허용하려면:

    sudo firewall-cmd --zone=public --add-service=ssh --permanent
    sudo firewall-cmd --reload

    서비스 목록 확인

    sudo firewall-cmd --get-services

    포트 차단

    sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
    sudo firewall-cmd --reload

    서비스 차단

    sudo firewall-cmd --zone=public --remove-service=http --permanent
    sudo firewall-cmd --reload

    ➡️ Example

    Block 존 ➡️ ipv4로 내가 열고 싶은 IP/32, Port, TCP 열려면..

    sudo firewall-cmd --zone=block --add-rich-rule='rule family="ipv4" source address="IP/32" port port="port번호" protocol="tcp" accept' --permanent
  • Ubuntu 22.04에서 수동 IP 설정하기

    Ubuntu 22.04에서 수동 IP 설정하기

    📌 NetworkManager에서 고정 IP 설정

    nmcli device show <인터페이스 이름>

    📌 NetworkManager를 사용하여 수동 IP 설정

    sudo nmcli connection modify <Wired connection 1> ipv4.method manual ipv4.addresses <사용할 IP/mask> ipv4.gateway <게이트웨이 IP> ipv4.dns <DNS IP> autoconnect yes

    📌 변경사항 적용

    sudo nmcli connection down enp5s0 && sudo nmcli connection up enp5s0
    sudo systemctl restart NetworkManager

    ✅ 확인 사항

    ☁️ IP 설정 확인

    ip a show <네트워크 인터페이스 이름>

    ☁️ 라우팅 정보 확인

    ip route

    ☁️ DNS 확인

    nmcli device show enp5s0 | grep DNS

    ☁️ 인터넷 연결 테스트

    curl https://google.com
    ping -c 4 google.com
    ping -c 4 8.8.8.8

  • 리눅스 SSH 세션 끊김 문제 해결법

    리눅스 SSH 세션 끊김 문제 해결법

    📌 리눅스 SSH 세션 끊김 문제 해결법

    터미널 접속하고 나서, root 계정으로 vi /etc/profile 파일로 들어간 다음, TMOUT 부분이 있을 것이다.

    나는 rocky linux를 사용하고, 처음에는 900초로 설정되어있던 거를 7200초로 변경하였다.

    세션을 끊은 뒤, 다시 접속하면 영구적으로 적용이 완료될 것이다.

  • ubuntu 22.04에서 Nvidia 드라이버 자동 업데이트 비활성화 설정하는 법

    ubuntu 22.04에서 Nvidia 드라이버 자동 업데이트 비활성화 설정하는 법

    📌 ubuntu 22.04에서 Nvidia 드라이버 자동 업데이트 비활성화 설정하는 법

    ✅ 자동 보안/패키지 업데이트

    • unattended-upgrades 서비스 비활성화
    sudo systemctl disable --now unattended-upgrades
    sudo apt remove unattended-upgrades
    • 또는 설정 파일 수정 (파일 내용: /etc/apt/apt.conf.d/20auto-upgrades)
    APT::Periodic::Update-Package-Lists "0";
    APT::Periodic::Unattended-Upgrade "0";

    ✅ NVIDIA 드라이버 자동 업데이트 방지

    sudo apt-mark hold nvidia-driver-<version>
    sudo apt-mark hold linux-image-<version>

    ✅ 커널 자동 업데이트 방지

    sudo apt-mark hold linux-image-generic linux-headers-generic

    ✅ snap 자동 업데이트 비활성화(snap 사용 시)

    sudo systemctl disable snapd.service
    sudo systemctl disable snapd.socket
    sudo systemctl disable snapd.seeded.service

    ✅ 자동 패키지 다운로드 방지

    sudo systemctl disable --now apt-daily.timer apt-daily-upgrade.timer

    ⏰ cron, systemd 타이머 기반 자동 작업들 점검

    ls /etc/cron.daily/
    -----
    0anacron  apport  apt-compat  cracklib-runtime  dpkg  logrotate  man-db
    
    ls /etc/systemd/system/*.timer

    ✅ apport 제거, anacron 무력화, apt-compat 무력화

    sudo apt purge apport -y
    sudo chmod -x /etc/cron.daily/0anacron
    sudo chmod -x /etc/cron.daily/apt-compat

    🚀 확인 작업

    ✅ NVIDIA 드라이버 및 관련 패키지 고정 여부

    apt-mark showhold | grep nvidia
    
    ---
    
    nvidia-driver-535-server
    nvidia-dkms-535-server
    libnvidia-compute-535-server:amd64
    ... 등등

    ✅ 커널 고정 여부 확인

    apt-mark showhold | grep linux
    
    ---
    
    linux-image-5.15.0-91-generic
    linux-headers-5.15.0-91-generic

    ✅ 자동 업데이트 비활성화 확인

    systemctl is-enabled unattended-upgrades

    ✅ cron.daily 내 자동 업데이트/리포트 스크립트 비활성화 확인

    ls -l /etc/cron.daily/

    ✅ 전체 hold 패키지 리스트 확인

    apt-mark showhold

  • CUDA 및 NVIDIA 드라이버를 RHEL 8에 설치하는 방법

    CUDA 및 NVIDIA 드라이버를 RHEL 8에 설치하는 방법

    🚀 CUDA 및 NVIDIA 드라이버를 RHEL 8에 설치하는 방법

    이 포스트는 RHEL 8 기반 시스템에서 CUDA 개발 환경과 NVIDIA 드라이버를 수동으로 구축하는 과정을 정리한 것입니다. 로컬 패키지 저장소 설정부터 GPU 드라이버, CUDA 설치까지의 전체 흐름을 담았습니다.

    📁 1. 로컬 YUM 리포지터리 구성

    ISO 또는 USB를 통해 마운트된 RHEL 설치 미디어에서 리포지터리를 복사하고 설정합니다.

    mkdir /local_repo
    cp -r /run/media/User/RHEL-8–4–0-/AppStream /local_repo/
    cp -r /run/media/User/RHEL-8–4–0-/BaseOS /local_repo/
    chown -R User:User /local_repo/AppStream /local_repo/BaseOS

    리포지터리 설정 파일 작성 (/etc/yum.repos.d/local.repo):

    [AppStream]
    name=AppStream
    baseurl=file:///local_repo/AppStream
    enabled=1
    gpgcheck=0
    
    [BaseOS]
    name=BaseOS
    baseurl=file:///local_repo/BaseOS
    enabled=1
    gpgcheck=0

    🌐 언어 및 지역 설정 (한국어) — 선택

    sudo dnf install glibc-locale-source glibc-langpack-ko -y
    sudo localectl set-locale LANG=ko_KR.UTF-8
    locale

    🛠️ 필수 패키지 및 개발 도구 설치

    sudo dnf groupinstall "Development Tools" -y
    sudo dnf install -y epel-release
    sudo dnf install -y gcc kernel-devel-$(uname -r) kernel-headers-$(uname -r) dkms elfutils-libelf-devel

    🔌 NVIDIA 드라이버 설치 (nouveau 비활성화 포함)

    sudo bash -c 'echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf'
    sudo dracut --force
    sudo reboot
    
    # 재부팅 후 nouveau가 비활성화되었는지 확인:
    lsmod | grep nouveau  # 출력 없으면 성공

    🖥️ NVIDIA 드라이버 설치 (.run 파일 방식)

    wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.154.05/NVIDIA-Linux-x86_64-535.154.05.run
    chmod +x NVIDIA-Linux-x86_64-535.154.05.run
    
    # GUI 모드 종료 (텍스트 모드로 부팅)
    sudo systemctl set-default multi-user.target
    sudo reboot
    
    # 재부팅 후 설치:
    sudo ./NVIDIA-Linux-x86_64-535.154.05.run
    
    # 설치 완료 후 GPU 확인:
    nvidia-smi

    🧠 CUDA 설치 (12.2 버전)

    sudo dnf config-manager --add-repo=https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
    sudo dnf clean all
    sudo dnf makecache
    sudo dnf install -y cuda-12-2
    sudo dnf install -y cuda-toolkit-12-2

    🔧 CUDA 환경 변수 설정

    sudo bash -c 'cat <<EOF > /etc/profile.d/cuda.sh
    export PATH=/usr/local/cuda-12.2/bin:\$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:\$LD_LIBRARY_PATH
    EOF'
    
    source /etc/profile.d/cuda.sh

    ✅ 설치 확인

    nvidia-smi         # GPU 상태 확인
    nvcc --version     # CUDA 컴파일러 버전 확인

    🔄 GUI 모드 복원 (필요시)

    sudo systemctl set-default graphical.target
    sudo reboot

    📌 참고 사항

    • nouveau 모듈이 비활성화되지 않으면 NVIDIA 드라이버 설치 시 에러가 발생합니다.
    • .run 방식 드라이버 설치는 커널 업데이트 시 재설치가 필요할 수 있습니다.
    • CUDA 설치 이후 /usr/local/cuda 심볼릭 링크를 확인하면 다른 버전으로 전환도 가능

  • 리눅스환경에서 Firewalld 이용하기

    리눅스환경에서 Firewalld 이용하기

    📌 Firewalld 상태 확인

    firewall-cmd --state
    firewall-cmd --get-default-zone

    📌 기본 존 변경

    firewall-cmd --set-default-zone=block

    📌 현재 활성화된 존 확인

    firewall-cmd --list-all

    📌 서비스 허용

    firewall-cmd --zone=block --add-service=<서비스명>
    firewall-cmd --zone=block --add-service=http

    📌 block 존에서 IP와 포트 허용 설정

    firewall-cmd --zone=block --add-rich-rule='rule family="ipv4" source address="IP" port port="포트" protocol="tcp" accept'

    ✅ 변경사항을 영구적으로 저장

    firewall-cmd --runtime-to-permanent

    ✅ Firewalld 재시작

    systemctl restart firewalld
  • 리눅스에서 포트 없는 프로세스 체크하기

    리눅스에서 포트 없는 프로세스 체크하기

    리눅스에서 포트 없는 프로세스 체크하기

    만약 사용하는 port가 없고, 프로세스 이름으로 health check를 하려면, 먼저 리눅스 서버에 python 설치한다. 그리고, sh 파일을 만들어야 한다.

    #!/bin/bash
    # 체크할 프로세스의 경로를 변수에 저장합니다.
    PROCESS_PATH="프로세스 이름"
    # 프로세스가 실행 중인지 확인합니다.
    if pgrep -f "$PROCESS_PATH" > /dev/null
    then
        PROCESS_STATUS=1  # 프로세스가 실행 중이면 1
    else
        PROCESS_STATUS=0  # 프로세스가 실행 중이지 않으면 0
    fi
    # Prometheus 메트릭 포맷으로 출력합니다.
    echo "# HELP process_up Is the process running (1 for yes, 0 for no)"
    echo "# TYPE process_up gauge"
    echo "process_up $PROCESS_STATUS"

    해당 코드는 프로세스가 실행 중인지 아닌지 체크하는 code, 위의 sh 파일을 주기적으로 확인하는 sh파일 생성

    #!/bin/bash
    while true; do
        /usr/local/bin/b2b_check.sh > /var/www/html/metrics
        sleep 15
    done

    (선택) 시스템 서비스 등록을 해줘도 됨.

    해당 파일을 python설치하면 기본적으로 있는 http로 데이터를 받아 prometheus가 데이터를 받을 수 있게 만들어 준다.

    그리고, 그라파나에서 해당 프로세스 체크를 PromQL — 대시보드 형태로 제작하면 된다.