티스토리 뷰

728x90
반응형

RHCSA 8 기출문제에서 컨테이너에서 어려움을 갖는 분들이 계시는 거 같아서 

제 지식과 교재를 바탕으로 내용을 작성 해봅니다.

PODMAN 옵션과 아키텍처에 대해 조금이라도 도움이 되시기 바라요

RHCSA  컨테이너 Podman 기초 다지기 시작!

목차

    1. 컨테이너 동작 원리

    2. 컨테이너 기본 실행 ( 설치 , 시작 , 종료 , 이미지 찾기 , 이미지 관리 ,이미지 삭제 )

    3. 컨테이 구성 ( 포트 매핑 )

    4. 컨테이너 저장장치 연결 

    5. 컨테이너 서비스로 관리

     


    1. 컨테이너  동작 원리

     

    RHCSA8 기출문제 포스팅 을 하면서 PODMAN 문제를 단순히 외워서 풀려 고 하시면 문제가 발생하는 게 

    옵션에  대해 이해를 못 해서 마냥 따라 하기는 불안 안 하실 거예요 그래서 원리부터 간단히 짚고 넘어가겠습니다.

    Docker에 교육을 받은 셨거나 공부 해보 신 분들이라면 그냥 간단히 확인 정도로 하고 시고 , 다음 목차로 넘어가시면 될 거예요

     

    vmware , hypervisor를 사용하면 되지 왜 컨테이너를 사용해서 새로운 걸 배우게 하느냐 하는 분들 계십니다.

    이렇게 생각하시는 분들은  cpu , memory 사용률을 확인해 보시면 우선 확인 한 차 이를 보실 수 있습니다.

     

    podman 은 Pod Manager tool의 약자로 OCI 표준 container와 런타임을 개발, 관리, 실행할 수 있게 해주는 container engine입니다.

    이미지 제일 하단에서부터 위로 쌓아 올려가는 것으로 이해하시면 됩니다.

    ` 컴퓨터에  Host OS를 컴퓨터에 설치 한 운영체제(OPERATING SYSTEM )이고요

      컴퓨터에 OS를 설치하고 그 위에  HYPERVISOR( VM WARE , HYPERVISOR -V , VIRTUALBOX)를 설치하고 

      또 그 위에 어려 분이 테스트하거나 운영하실  OS를 또 설치하게 됩니다. RHCSA8 경우 REHDAT8.2 또는 CEONTOS8 이상을 설치 하시 겠죠 실습을 하시려고 하신다면요.(이미지에서는 GUEST OS)

     

    설치한 GUEST OS 위에 여러분이 테스트하고 운영할 웹서버, WAS , DB , SDK 등 각 GUEST OS에서 설치해 사용할 애플리케이션을 또 설치하셔야 하고요... 

    그럼 극단적으로 내 컴퓨터가 8 core 16th이고 메모리 8GB 인 컴퓨터이라고 가져하면

    다른 건 떠나서 메모리만 봐도

    ' 윈도/4GB + VM/1GB + GUEST OS/1GB/(실습 용 리눅스) + APP/500M (설치 한 웹서버 )'

     = 4 + 1+ 1+ 500K   -> 6500MB 메모리를 사용하게 됩니다...

    물론... 이건 극단적 이 예를 든 것이고... 실습하시는 여러분은 베어메탈 서버를 다체 보유 하고 계시지 않는다면

     컴퓨터, 노트북에 VM 설치하고 GUSET OS 올리고 하시겠죠... ( 고사양 컴퓨터를 사용하신다면 이쯤이 버틴다 하시겠지만...)

    실제 서비스 하고 운영하게 되는 기업 서버에서는 자원 활용이 가장 중요합니다.

    생각해 보세요...

    카카오톡 쓰는데 메시지 보내고, 받는데 10초 정도 걸린다 생각하면...... 어마어마하죠?

     

     

    컨테이너는 의 주요 목적은 최대한 리소스를 줄이고 운영, 개발 환경을 간소화해서 운영을 하도록 하는 게 목적인 거죠

    컨테이너에는 보안, 스토리지, 네트워크 격리 등 가상 시스템과 동일한 이점이 있지만

    라이브러리 와 런타임 리소스를 분리하거나 반대로 분리하게 됩니다.

    RHCSA  컨테이너 Podman 기초 다지기에서 이해하고 넘어가야 하는 부분입니다.


    - 가상화 특징 

    1.   단일 하드웨어에서 동시에 여러 운영 체제르르 실행 가능
    2.   하이퍼바이저를 사용하여 하드웨어를 가상 하드웨어 시스템 여러 개로 분할하, 어려 운영 체제를 동시에 실행 가능
    3.   전체 운영 체제 환경에서 해당 애플리케이션을 지원

     

    - 컨테이너 특징

      1. 운영 체제에서 직접 실행되며 시스템의 모든 컨테이너에서 하드웨어 및 OS리소스를 공유, 애플리케이션을 경량으로 유지,

          빠른 게 동시 실행 가능

      2. 동일 운영 체제 커널을 공유, 컨테이너화된 애플리케이션 프로세스를 시스템의 나머지와 분리, 해당 커널과 호환되는 

         모든 소프트웨어를 사용

      3. 필요한 하드웨어 리소스가 가상 시스템보다 훨씬 적고 , 시작 및 중지 속도가 빠름 

     

     

    PODMAN , DOCKER 왜 나뉘고 어디선 DOCKER 쓰고 어디선 PODMAN 쓰냐 하는 궁금증 생기실 수도 있죠

    핵심만 추리면 PODMAN 은 deamonless, rootless / docker는 root권한 필요 compoes 관리 등 

    서로에 장점이 나뉘게 됩니다.

    깊이 들어가면 OCI 니 뭐니 깊이 들어가야 하니... 여기까지..

    ( podman 이 좀 더 업데이트되며 나하 지고 있으니 격차는 벌어지겠지만 docker 역시 발전하고 있고

    쿠버네티스라는 컨테이너 관리 기술이 발전 중이니....)

     

    설명이 너무 길어졌고 정말 이해를 돕기 위한 극단적 예를 들어 이런 거구나 하는 정도만 알고 넘어가시고

    정규 교육이나 교재를 통해 확인해 보시는 걸 추천드립니다.

    ( 저는 현업 SE 재직 중이고 관련 자격증 보유하고는 있지만 강사의 기준으로 다른 사람은 가르치는 일을 하고 있지는 않아요 실무에서 필요한 부분에 대한 지식과 개념위주로 이해하고 있어서... 그래서 잘못된 개념을 주입하게 될지 조심스러움이 굉장히 큽니다......)

     

     


     

    컨테이너 기본 실행 ( 설치, 시작, 종료, 이미지 찾기 , 이미지 관리, 이미지 삭제 )

    • 컨테이너 설치

      컨테이너(podman) rhel 시스템에 yum 명령으로 container-tools 모듈을 설치

    [root@rhcsa~]$  yum module install container-tools

    podman / container-tools 에는 여러 모듈이 설치되는데  podman , skoepo , buildah를 가장 많이 사용하게 된다.

    rhedhat에서는 공식을 레지스트리를 가지고 있으면 이미지를 저장하고 검색할 수 있는 repository를 보유하고 있다.

    redhat 로그인을 통해 연결할 수 있고 기본 컨테이너 레지스트리는 다음과 같다.

    - registry.redhat.io : 공식 rhel 기반 컨테이너

    - registry.connect.redhat.com : 타사 제품 기반 컨테이너 

     // registry.access.redhat.com : 구형 버전으로 거의 중단되어 감

     

    • 컨테이너  이미지 검색, 이미지 PULL

    레지스트리에서 컨테이너 이미지를 가져와 실행을 해야 하며  podman pull 명령어를 사용해 지정한 이미지를 가져와 로컬에 저장

    우선 이미지 내가 필요한 이미지를 검색하여  찾아보고 시스템에 다운로드하여 보자

    rhel9 로 검색 한 내용

     

    $ podman search rhel9

     podman 레지스트리와 docker.io 인 도커 레지스트리까지 검색된 것을 확인할 수 있다

    여러 개 의 이미지가 보이며 이미지에 패키징 된 다야암 애플리케이션들이 있는 것을 확인할 수 있다.

    이글 후반에 이미지를 생성하는 빌딩을 해야 하니 우선 buildah를 설치해 보자

    $ podman pull registry.redhat.io/rhel9/buildah

    그럼  다음고 같이 에러가 나온다

     

    Trying to pull registry.redhat.io/rhel9/buildah:latest...
    Error: initializing source docker://registry.redhat.io/rhel9/buildah:latest: unable to retrieve auth token: invalid username/password: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: 

     

    이유는 redhat 레지스트리를 통한 공식 이미지를 받으려면 로그인이 필요한데

    단순히 redhat에 가입해서 로그인만 하면 되는 게 아니고..

    *** 유료 *** 로 서브스크립션 등록을 해야 사용할 수 있다.

    그래서 우선을 무료(?)인 docker.io 에서 받자

     

    search 옵션으로 검색후 이미지 다운로드

     

    $ podman search buildah
      # search 옵션으로 buildah 를 레지스트리에서 검색
      
    $ podman pull docker.io/noenv/buildah
      # pull 옵션 으로 docker.io/noenv/buildah 받는다
      
     - 받기가 끝나면
     
    $ podman images 
      # images 로 이미지를 잘 받아졌는지 확인

    inspect 내용

    위 이미지는 inspect 옵션으로 다운로드한 이지미를 확인하는 내용인데

    $ podman inspect docker.io/noenv/buildah:latest
     # inspect 옵션과 다운 받은 image name 을 입력하면 볼수 있다.
    • 컨테이너 이미지 삭제

    그리고 받았으니 지우는 법도 알아야겠죠?

    삭제하는 방법은~

    # podman rmi [image id]
    
    $ podman rmi 81135e2c1076
      # rmi 옵션 으로 image id 인 81135e2c1076 를 삭제한다.
      # rm 옵션 도 있는데 이건 이미지를 지운 는게 아니고 이미지로 컨테이너를 만들었을때
        해당 컨테이너를 지울때 사용 한다..( 아래에서 설명 함)

     

    • 컨테이너 실행

    run 옵션으로 실행

    $ podman run -it docker.io/noenv/buildah:latest
      # run 옵션  과 i , t 의 플래그로 컨테이너 이미지를 터미널 , 입력 형식으로 실행

     

    여기서 확인하고 넘어가게 될것음 이미지를 실행시키고 pwd , id  명령어로 확인해 보면 root로 변경되었고

    exti로 이미지를 나온 후 pwd, id로 확인해 보면 user로 변경된 것을 확인할 수 있다.

    $ podman run -it --name=buildah docker.io/noenv/buildah
      # --name 플래그로 실행할 컨테이너 이름을 buildah 로 지정하고 실행 한다.

    내용을 잘 확인해 보자~~

    실습하면서 받은 이미지는 한 개인데 컨테이너는 여러 개 실행하고 각각 컨테이너에 이름을 지정해 줄 수 있다는 걸 확인할 수 있다.

    혹시 이미 생성된 컨테이너 이름을 중복하게 되면 에러 메시지가 나온 게 된다.

     

     

     

    Error: error creating container storage:
    the container name "buildah" is already in use by b6167ce3807a2ac0d8459355c4ac194098dd0ce5b1513a45d1dd8036aa7f032b.
    You have to remove that container to be able to reuse that name: that name is already in use
    
    오류: 컨테이너 저장소를 만드는 중 오류 발생: 컨테이너 이름 "buildah"가 b6167ce3807a2ac0d8459355c4ac194098dd0ce5b1513a45d1dd8036aaa7f032b에서 이미 사용되고 있습니다.
         해당 이름을 재사용하려면 해당 컨테이너를 제거해야 합니다. 해당 이름은 이미 사용 중입니다

     

    - 해결 방법 -

     

    rm 옵션으로 container 삭제

    $ podman rm buildah2
      # rm 옵션으로 buildah 컨테이너를 삭제
      # podman ps -a 로 삭제된 컨테이너를 확인 할수 있다.

    run --rm 으로 실행이 끝나면 buildah3 자동 삭제

    ' --rm ' 옵션 
    
    $ podman run --rm --name=buildah3 docker~~~ cat/etc/release
      # --rm 으로 컨테이너 실행후 명령줄이 끝나면 buildah3 컨테이너를 알아서 삭제한다.
      ## 컨테이너 내부를 조작 하지 않아야 함
    핵심
    !!!
    하나의 이미지로 여러 개의 컨테이너를 실행할 수 있다

    • 컨테이너 확인 

    컨테이너 이미지 확인

    $ podman ps 
      # 실행중인 컨테이너 확인
      
    $ podman ps -a
      # 실행이 중지된 컨테이너 까지 확인

     

    컨테이너 기본 ( Port mapping 포트 매핑)

    1. podman run -p 80:8080 
      포트 매핑 옵션은 -p와 host와 컨테이너를 매핑할 포트를 앞, 뒤 순서로 넣어 주면 된다.
      간단한 예로 httpd 서비스를 컨테이너를 통해 연결하고 싶다면 httpd 서비스를 컨테이너로 시작하고
      host 서버의 80 port와 컨테이너의 httpd 서비스 포트인 8080을 매핑해 주면 된다.
      그렇게 하면 hosts 서버에는 web serviece 가 없더라도 컨테이너의 httpd 서비스를 local port 80으로 확인할 수 있다.
      host 서버에서 80 port를 열어 두는 방화벽 작업까지 하게 된다면  외부에서도 컨테이너의 web service를 확인할 수 있다.

    해보자!!! 

    #위에서 배운대로~
    
    $ podman search httpd     # httpd image 검색
    # 적당한걸 찾았으면
    
    $ podman pull docker.io/publici/httpd    # docker.io/publici/httpd 을 받는다
    
    $ podman images          # 이미지 잘 받았나 확인
    $ podman run -d -p 80:8080 docker.io/publici/httpd

    하면 결과가!!!

    응~~ 에러야~~~

    Error: rootlessport cannot expose privileged port 80,
    you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024),
    or choose a larger port number (>= 1024): 
    listen tcp 0.0.0.0:80: bind: permission denied
    
    //
    오류:  포트는 권한 있는 포트 80을 표시할 수 없습니다,
    /etc/sysctl.conf(현재 1024개)에 'net.sys4.ip_priviled_port_start=80'을(를) 추가할 수 있습니다,
    또는 더 큰 포트 번호(>= 1024)를 선택합니다: 
    수신 TCP 0.0.0.0:80: 바인딩: 사용 권한 거부
    //

    설명 들어가자면 rootless는 port 1024 보다 작거나 같은 포트는 권한이 없어 열 수 없다! 

    즉 1024 이하의 port를 열려고 하면 무조건 root 권한으로 컨테이너를 실행해야 한다는 보안적인 말

    그럼 어쩌란 말이냐.... 

    답은 80 포트 말고 host port를 8080으로 바꾸어서 서비스하면 된다~~~

    -p 옵션의 포트 매핑 은 web 이든 DB 든 모든 port 열결에 사용할 수 있다

     

    자 그럼 이게 실행할 컨테이너에 httpd service port 가 80 인지 뭔지 어떻게 알고 매핑을 하냐?

    너는 아니까 그렇게 하는 거 아니냐!!!!! 이색 깔아하시면  다음을 보시죠

    • podman inspect [ image name ]

    이미지 중간 부터 이하 생략

       중간쯤에 보면 80/tcp라고 보이죠?

    그리고 더 설명할 것이 redhat 공시 레지스트리에서 이미지를 받게 되면 inspect로 확인할 때

    utl , usage 레이블이 있어서 설명과 수정 가능 항목들을 볼 수 있는데 docker.io 개인들이 만든 파일들은 그런 내용을 잘 넣지 않는가 보다.

    RHCSA  컨테이너 Podman 기초 다지기 부분에서 이 부분이 가장 중요할 수 있는데 이미지의 내부 항목들을 확인하지 못하면

    일일이 구동시키고 들어가서 확인해야 하는 문제들이 있다.

     

    마무리

    이거 하루 이틀 만에 다 쓸 양이 아니다..... 벌써 3일째 쓰구 있다.

    일하면서 짬짬이 쓰는데.... 우와 이거 감당 안된다... 이거 누가 본다고;;;;

    뭐 하는 짓인가 싶지만... 그래도 내 복습 겸 필요하신 분들 있을까 해서 써봅니다.

    목차에 둘 거지건 다음 포스팅 때 작성 할게요

    여기까지가 대략적인 사용 법이고... 빼먹은 옵션도 있을 거고 설명 안 하고 넘어간 거도 있을 거예요

    읽어 보시고  실습해 보시고 문의 사항 있음 댓글 달아주시고...

    그리고 이 포스팅을 100% 신뢰하시기보다(용어 나 명칭) 참고하고 이런 게 있구나 하고 실습에 필요한 정도로만 참고하세요

    저는 공인 강사도 아니고... 돈 받고 하는 것도 아니기 때문에... 나름 최대한 잘못된 정보를 드리지 않기 위해 노력은 하고 있습니다.

     

    RHCSA  컨테이너 Podman 기초 다지기! 두 번째를 기다려보아요

    다음은 RHCSA8,9 시험에서 중요한 서비스 등록 이 남았네요~~ 투비컨티뉴~~

     

     

     

    728x90
    반응형
    댓글