이번 장에서는 openCV에서 특정 색상을 추출할 때 사용되는 inRange를 이용해 차선을 추출하는 예제를 해보겠다 

이전 (9) setMouseCallback을 활용하여 색상의 값을 뽑고 해당 값과 비슷한 색상의 값들을 뽑아 보자

 

1. inRange

  • cv2.inRange(src, lower range, upper range, dst ) 
    - src : 목적이 되는 이미지 
    - lower range : 픽셀의 최솟값 ( 3채널이미지는 (x, x, x) 1 채널은 (x)  ) 
    - upper range : 픽셀의 최댓값
    lower range보다 크고 upper range보다 작은 값에 속하는 픽셀을 뽑아낸다 
import cv2 
import numpy as np 

origin_image = cv2.imread('inrange_image.jpg')

mask = cv2.inRange(origin_image, (0,100,0),(200,255,200))

range_image = cv2.bitwise_and(origin_image, origin_image, mask=mask)

mask = np.stack((mask,)*3, axis=-1)

image = np.concatenate((origin_image, mask, range_image), axis=1)
cv2.imshow('image', image)
cv2.waitKey(0)

 

  • 위의  inRange lower와 upper설정을 보면 값을 사전에 설정하여 입력하였다 
    하지만 위의 사진과 같이 특정 영역을 정확히 뽑아내지 못했다 . 
    inRange의 단점은 이것이다. 특정 객체를 뽑아내려면 해당 객체가 표현하는 색상을 알고 있어야 한다. 
    이럴 때 해당 객체의 색상을 알기 위해 이전 (9) setMouseCallback을 이용하여 색상을 알고 해당 색상에서 일정 범위 안에 해당하는 픽샐들을 뽑으면 객체를 뽑아내기 쉽다 

2. setMouseCallback을 이용한 inRange 

import cv2 
import numpy as np 

def get_RBG_in_image(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONUP:
        print("마우스가 눌린 위치의 BGR값은 : {}".format(param['image'][y,x,:]))

    if event == cv2.EVENT_RBUTTONUP:
        print('마우스오른쪽 버튼이 눌린위치와 비슷한 색상을 가진 픽셀만 뽑기')
        threshold = 20
        value = param['image'][y,x,:]
        mask = cv2.inRange(param['image'],value - threshold, value + threshold )
        range_image = cv2.bitwise_and(param['image'], param['image'], mask=mask)
        cv2.imshow("range_image",range_image)
    return 


origin_image = cv2.imread('inrange_image.jpg')

param = {
    'image' : origin_image
}
cv2.imshow('image', origin_image)
cv2.setMouseCallback('image', get_RBG_in_image, param)
cv2.waitKey(0)

하얀색 방향선을 클릭했을 때 이미지
회색 도로를 클릭했을 떄 이미지

  • setMouseCallback을 설정하여 마우스 왼쪽을 클릭하면 해당 위치에 픽셀의 값을 print 한다 
  • 마우스 오른쪽을 클릭하면 해당 위치의 픽셀과 비슷한 (threashold를 설정) 값을 가지고 있는 픽셀만을 imshow 하였다 
  • 위와 같이 inRange를 이용하여 차량이 진행중에 차선을 검출할 수도 있다 - 조금만 응용하여 동영상에 접목하는 것을 각자 해보자!

대학교 시절에는 리눅스란 말을 듣고 지레 겁먹었던 기억이 난다. 

아무것도 모르는 것에 다가간다는것은 어려웠다 

이후에 리눅스를 자주 사용하며 개발이나 운영에 있어서 윈도보다 편하다는 느낌이 들기도 한다. 

리눅스에 대해서 알아보자 

 

 

1. 리눅스의 정의 

  • 컴퓨터의 운영체제 중 하나 - 리누스 토르발스가 처음 출시한 운영 체제 커널인 리눅스 커널에 기반을 둔 오픈 소스 유닉스 계열 운영체제 계열 
  • 위의 말은 너무 어렵다 그냥 리누스 토르발스라는 사람이 처음 제작했구나 만 알면 된다 
  • 우리가 주로 사용하는 리눅스 운영체제로는 Ubuntu, CentOS, SuLinux, 등등이 있다. 
  • 여기서 위의 각각의 운영체제가 다 같은 리눅스라는 것인가? - 아니다 
  • 위에서 말한 Ubuntu, CentOS, SuLinux는 정확히 말하면 리눅스 배포판(Linux distribution)이다. 
  • 리눅스 배포판이 먼가? 말 그대로 리눅스에서 분산? 나눠진? 분리된? 운영체제들이다 
    리눅스 커널을 기반으로 동작하고 GNU 소프트웨어 및 여러 가지 자유 소프트웨어로 구성된 운영체제이다 
    GNU Software? - "그누"라고도 부르며 운영 체제의 하나이자 컴퓨터 소프트웨어의 모음집이다. 

2. 리눅스 배포판의 종류 

  • 리눅스 배포판 나무위키에 나와있는 리눅스의 발전과정이다. 
  • 보면 생각과 다르게 매우 엄청 많은 수의 운영체제, 갈래, 가지들이 있다. 
  • 대표적인 리눅스 배포판의 시조?는 데비안(Debian), 레드햇(Redhat), 안드로이드(Android) 가있다.
    MacOS는 UNIX이다
  • 그럼 다음 궁금증은 데비안에는 어떤게어떤 게 있고 레드햇에는 어떤 게 있냐일 것이다 
    또는 우분투는 어딧지? CentOS는 어딨지? 가 될 것이다. 
  • 그다음 궁금증은 데비안? 레드햇? 안드로이드가 어떻게 다르냐? 가 될 것이다 

3. 우분투와 CentOS는 어느 배포판에 속하나? 

  • 우분투는 데비안계열 배포판에서 가장 유명하다고 할 수 있다. 
  • 데비안 계열에서 들어봤을 법한 운영체제는 글쓴이 기준으로는 라즈베리파이OS와 우분투 밖에 없는 거 같다.
  • 레드햇 계열은 대표적으로 CentOS와 페도라가 있다. 
    CentOS는 무료 버전이라 많이 들어보았겠지만 페도라는 글쓴이도 사용해보지는 않았다. VirtualBox에서 가끔 아 저런 거도 있구나 라고 보기만 했던 기억이 있다. 

3. 데비안과 레드햇의 차이점 

  • 데비안과 레드햇은 기본적으로 몇 가지 명령어가 다르다 대표적으로 다른 명령어는 설치 - apt, yum, 패키지 - dpkg, rpm
  • yum, apt 
    처음 리눅스를 가지고 계발을 했을 때 가장 자주한 실수가 구글 검색에 "리눅스 XXX 설치"라고 검색한 것이다. 
    계속 우분투에서 YUM이 안된다고 YUM은 어떻게 설치하는지 알아봤던 기억이 있다. 물론 우분투에 yum을 설치할 수 있지만 저장소가 업데이트가 자동으로 되지 않아 가능하면 사용하지 않는 것이 좋은 거 같다 
  • dpkg, rpm ( RedHat Package Manager)
    윈도를 예로 들면 설치 exe파일이라고 생각하면 된다 위의 명령어를 통해 다운로드한 패키지 파일을 설치할 수 있다. 
    가끔 우분투에서 rpm확장자로 된 설치 파일을 실행해야 할 수도 있는데 그때는 Alien을 install 한 후 파일을 변환하기도 한다 
    확장자는 dpkg - .deb    rpm - .rpm이다 

4. 리눅스의 기본 명령어 

  • cd - change directory - 경로를 이동할 때 사용한다 
  • pwd - print working directory - 현재 디렉터리(폴더)의 경로를 출력한다 
  • ls - list - 디렉토리 내에 있는 파일 또는 폴더의 목록을 출력한다 
  • cp - copy - 파일 또는 디렉터리를 복사한다 
  • mv - move - 파일 또는 디렉터리를 이동한다 ( 복사 후 삭제를 함으로 cp보다 오래걸림, 이름 변경할 때도 사용함)
  • mkdir - make directory - 디렉토리를 생성한다 
  • rm - remove - 삭제 
  • cat - concatenate - 단순 파일의 내용을 출력할 때 또는 파일 여러 개를 합쳐서 하나의 파일로 만들 때 
  • find - find - 특정 파일이나 디렉터리 검색
  • ps - process - 실행 중인 프로세스 출력 \
  • kill - kill - 대상 하는 프로세스 중지 
  • service - 시스템 전체 서비스에 대한 명령 -서비스 재시작, 시작, 중지 등등 
  • shutdown - 시스템 종료
  • top -  시스템의 상태 확인 - 메모리, GPU, Process
  • wget - URL에서 파일 다운로드
  • grep - 정규식 터미널 명령 - 하나의 명령어에 부가적으로 사용해서 특정 파일들만 추출 
  • clear - 터미널 화면 출력 지우기 
  • echo - 터미널 콘솔 창에 특정 텍스트 출력 
  • sudo - 관리자 권한으로 실행 
  • chmod - 권한 변경 777, 666, .... 000 
  • tar - 압축파일 관련 압축해제, 압축하기
  • df - 디스크 확인 

'IT기초' 카테고리의 다른 글

(3) Process, Thread, Multi-thread, Multi-process  (0) 2022.11.09
(2) CPU Instruction Cycle  (0) 2022.11.09
[네트워크] 개발자용 네트워크 기초  (0) 2021.09.28

이번 장에서는 openCV에서 나온 영상 또는 이미지에서 마우스를 이용하여 할 수 있는 작업에 대해서 알아보겠다

마우스를 이용하여 그림을 그리거나 특정 색상의 값을 얻을 수 있다 

 

1. 마우스 동작 

마우스의 동작의 종류는 3가지가 있다.  
마우스 오른쪽 버튼 동작, 왼쪽 버튼 동작, 가운데 버튼 동작 

이 3가지 동작마다 각각 눌렸을 때, 눌리고 올렸을 때, 더블클릭했을 때의 기능에 대해서 정의할 수 있다. 

  • EVENT_MOUSEMOVE : 마우스가 움직였을 때 
  • EVENT_LBUTTONDOWN : 마우스 왼쪽 버튼을 눌렀을 때 
  • EVENT_LBUTTONUP :  마우스 왼쪽 버튼을 올렸을 때 
  • EVENT_RBUTTONDOWN : 마우스 오른쪽 버튼을 눌렀을 때 
  • EVENT_RBUTTONUP : 마우스 오른쪽 버튼을 올렸을 때 
  • EVENT_MBUTTONDOWN : 마우스 가운데 버튼을 눌렀을 때 
  • EVENT_MBUTTONUP : 마우스 가운데 버튼을 올렸을 때 
  • EVENT_LBUTTONDBCLICK : 마우스 왼쪽 버튼을 두번 눌렀을 때
  • EVENT_RBUTTONDBCLICK : 마우스 오른쪽 버튼을 두번 눌렀을 때 
  • EVENT_MBUTTONDBCLICK : 마우스 가운데 버튼을 두분 눌렀을 때 

2. 마우스 콜백 함수의 파라미터 

def onMouse(event, x, y, flags, param):
    event = 위에서 정의한 마우스의 동작에 대한 감지 
    x, y = 해당 동작이 감지된 x, y 좌표값 ( 영상또는 이미지에 대한 )
    flags = 마우스 이벤트가 발생할 때의 특정 조건 (컨트롤, 쉬프트, 알트 등 키 조합 생성) 
    param = 파라미터로 전송될 값 (이미지 또는 특정 변수 전송)

 

import cv2 
import numpy as np 

class MouseGesture():
    def __init__(self) -> None:
        self.is_dragging = False 
        self.x0, self.y0, self.w0, self.h0 = -1,-1,-1,-1

    def on_mouse(self, event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            print("왼쪽 버튼 눌림 \t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_LBUTTONUP:
            print("왼쪽 버튼 올림\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_RBUTTONDOWN:
            print("오른쪽 버튼 눌림\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_RBUTTONUP:
            print("오른쪽 버튼 올림\t좌표 : x : {} y : {}".format(x,y) )    
        elif event == cv2.EVENT_MBUTTONDOWN:
            print("가운데 버튼 내림\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_MBUTTONUP:
            print("가운데 버튼 올림\t좌표 : x : {} y : {}".format(x,y) )
        # elif event == cv2.EVENT_MOUSEMOVE:
        #     # 마우스 움직임은 너무 많이 나와서 생략    
        #     print("마우스 움직임\t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_MOUSEHWHEEL:
            # 가로휠이 없는 마우스라 .... 
            print("마우스 가로 휠 \t좌표 : x : {} y : {}".format(x,y) )
        elif event == cv2.EVENT_MOUSEWHEEL:
            print("마우스 그냥 휠 \t좌표 : x : {} y : {}".format(x,y) )
            
        return 

image = cv2.imread('test.JPG')
window_name = 'mouse_callback'
mouse_class = MouseGesture()

cv2.imshow(window_name, image)
cv2.setMouseCallback(window_name, mouse_class.on_mouse, param=image)
cv2.waitKey(0)

3. 적용 예시 

  • 마우스를 클릭한 위치의 픽셀의 값 확인 
    import cv2 
    import numpy as np 
    
    class MouseGesture():
        def __init__(self) -> None:
            self.is_dragging = False 
            # 마우스 위치 값 임시 저장을 위한 변수 
            self.x0, self.y0, self.w0, self.h0 = -1,-1,-1,-1
    
        def on_mouse(self, event, x, y, flags, param):
            if event == cv2.EVENT_LBUTTONDOWN:
                value = param[y,x,:]
                print("왼쪽 버튼 눌림 \t x : {} y : {} 좌표의 픽셀값은 : {}".format(x,y, value) )
            return 
    
    image = cv2.imread('test.JPG')
    window_name = 'mouse_callback'
    mouse_class = MouseGesture()
    
    cv2.imshow(window_name, image)
    cv2.setMouseCallback(window_name, mouse_class.on_mouse, param=image)
    cv2.waitKey(0)​
  • 마우스로 그림 그리기 
    import cv2 
    import numpy as np 
    
    class MouseGesture():
        def __init__(self) -> None:
            self.is_dragging = False 
            # 마우스 위치 값 임시 저장을 위한 변수 
            self.x0, self.y0, self.w0, self.h0 = -1,-1,-1,-1
    
        def on_mouse(self, event, x, y, flags, param):
            if event == cv2.EVENT_LBUTTONDOWN:
                self.x0 = x
                self.y0 = y
                self.is_dragging = True
                print("사각형의 시작 좌표는 x : {} y : {}".format(x,y) )
            elif event == cv2.EVENT_LBUTTONUP:
                self.is_dragging = False
                cv2.rectangle(param['image'], (self.x0, self.y0), (x,y),(0,0,255),2)            
                cv2.imshow(param['window_name'], param['image'])
                print("사각형의 좌표는 ({}, {}), ({}, {})".format(self.x0,self.y0,x,y) )
            elif event == cv2.EVENT_MOUSEMOVE:
                if self.is_dragging:
                    temp_img = param['image'].copy()
                    cv2.rectangle(temp_img, (self.x0, self.y0), (x,y),(0,0,255),2)            
                    cv2.imshow(param['window_name'], temp_img)
            return 
    
    
    image = cv2.imread('test.JPG')
    window_name = 'mouse_callback'
    mouse_class = MouseGesture()
    param = {
        "image" : image,
        "window_name" : window_name
    }
    cv2.imshow(window_name, image)
    cv2.setMouseCallback(window_name, mouse_class.on_mouse, param=param)
    cv2.waitKey(0)​
  •  

IT는 Information Technology이다 

정보기술에는 전기통신, 방송, 컴퓨팅, 통신망 등이 속해있다

 

이번 장에서는 개발을 하기 전 필수로 알아야 하는 네트워크 기초 중 OSI 7계 층중 계발에 매우 자주 사용되는 2~4, 7 계층에 대해서 이야기를 나누어 보겠다 

 

소프트웨어에 관심이 있는 사람은 3계층 부터 보기 바란다.

1~2 계층은 소프트웨어 개발자가 작업할 영역이 없다시피 한다 

 

OSI 7 Layer 

출처 : 나무위키

위의 표는 매우 좋은 자료지만 처음 공부를 시작한다면 뭔가 할 것이다. 

 

 

1. 물리계층( Physical Layer)

UTP 케이블과 RJ45 커넥터

  • 위의 사진을 보면 처음 보는 것이라고 생각할 수 있다. 하지만 모든 PC에 인터넷을 하고 싶으면 연결하는 그 선이다
  • 1 계층은 전기적 특성을 이용해 신호를 전송하는 역할을 한다 
  • 전송을 주고받을 미디어 타입을 설명한다. - UTP(10BASE-T, 100BASE-TX .....)로 받을 거냐 HDMI로 받을거냐 등등~
  • 하드웨어 개발을 할 때는 해당 사항에 대해서 생각을 해야 하지만 그렇게 심각하게 고려할 필요는 없다 복잡하다
    (문제가 생기면 생각하는 편)
  • 주로 PC에서 사용되는 UTP(비차폐 꼬임 쌍선 : Unshielded Twisted Pair cable)의 이름은 말 그대로 차폐되지 않은 꼬인 두 가닥의 선을 의미한다 

출처 : 나무위키

  • 차폐선은 위와 같이 선 주변에 주로 금속으로 된 껍질로 감싸고 있다 

 

2. 데이터 링크 계층 ( Data link layer )

출처 : 나무위키

  • 위 사진처럼 우리가 많이 접한 저런 랜카드(NIC : Network Interface card)가 1,2 계층에 해당한다 
  • UTP 케이블을 연결할 때 어떻게 하는가 위에 RJ45에 해당하는 부분을 삽입한다. 
  • 그렇다 RJ45를 연결하는 부분은 1 계층이고 그 뒤에 딱 봐도 회로로 되어있는 것은 2 계층이다 
  • 여기부터가 인터넷의 시작인 이더넷이 있다 ( 이더넷 : 802.3, Wifi : 802.11 )
  • 각자 공유기를 살 때 제품 상세 설명을 보면 뒤에 802.11ac, 802.11b, 등이 쓰여있다 해당 규격이 와이파이의 규격을 이야기해준다 
  • 자신의 와이파이가 좋은 것인지 보고 싶으면 https://ko.wikipedia.org/wiki/IEEE_802.11 를 참고하기 바란다 
  • 2 계층에는 그 유명한 MAC( Media Access Control ) 주소가 있다. 해당 MAC 주소를 이용하여 주변에 있는 다른 기기와의 통신이 가능하다 MAC을 단순하게 아파트에 몇 호인지를 나타낸다고 생각해도 된다 
  • MAC은 총 48비트로 구성되어있고 이중 첫 24비트는 해당 제품을 만든 회사의 고유 번호이고 그 뒤는 해당 랜카드의 고유 번호이다. MAC 주소는 오직 하나만 존재한다 라고 말해야 하지만 같게 만들수도 있다

 

3. 네트워크 계층 ( Network Layer )

IPv4 의 2진수, 10진수 표기

  • 위의 사진은 IPv4의 경우이다 현재 보통의 PC에는 IPv4를 사용하고 있고 스마트폰의 경우 IPv6를 이용하고 있다 

IPv6의 16진수 표기 출처 : 나무위키

 

  • IPv6는 보통 16진수로 표현한다 IPv4와 같이 표기하기에는 너무 길어진다 무려 2의 128 제곱을 표현해야 한다 
  • 위를 보면 중간에 : 0000 :인 경우 생략하는 것을 볼 수 있다 너무 짧다고 당황하지 말자 
  • IPv6가 생긴 이유는 IPv4가 유한하기 때문이다 2의 32 제곱의 경우 대략 43억의 주소를 가질 수 있기 때문에 요즘같이 한 명당 3개 이상의 IP주소를 가지는 시대에는 IP주소는 부족해질 수밖에 없다 생각해 거의 무한에 가까운 IPv6를 만들었다 
  • 그런데 생각해보면 아직 IPv4를 이용하고 있는데 그게 가능한 이유는 여러 가지 IP를 대신하여 사용할 방법이 있기 때문이다 대표적으로 NAT( Network Address translation ) 이 있다 모두가 사용해봤다 안 해봤다면 거짓말이다 
  • NAT ( Network Address translation ) 
    - 웬만한 공유기(라우터)가 모두 사용하고 있다 
    - 대표적인 공유기로 예를 들겠다 IPtime의 공유기의 경우 192.168.0.1의 게이트웨이를 사용하며 DHCP(Dynamic Host Configuration Protocol )을 이용하여 내부 서브넷에게 192.168.0.0/24의 주소를 뿌려주게 된다 
    - 서브넷이라는 말이 나왔다 서브넷은 해당 IP에서 어디까지가 네트워크의 주소인지를 뜻한다  

    - 서브넷이 나온 이유는 IP의 문제점 때문이다. IP는 자신이 어디로 가야 할지 길을 찾기 위해 같은 네트워크의 모든 End point에게 자신이 찾고 있는 주소를 broadcasting 한다 하지만 만약 하나의 네트워크에 매우 매우 많은 Endpoint가 있다면 모든 endpoint로 Ack가 전송되어 서버에 과부하가 생길 수 있다. 그렇기 때문에 Subnet(Sub network)을 나누어 broadcasting의 범위를 제한하는 것이다. ( 여기까지가 내 네트워크니까 여기서 찾아 - 아파트에서 동을 생각하면 좋다 )
    - 그럼 여기서 너희 집도 192.168.0.1이고 내 집도 192.168.0.1이네?라고 생각이 될 수 있다 여기서 Public IP와 Private IP에 대해서 알게 된다 
    출처 : 나무위키
    - 위의 사진에 설명돼있듯이 IETF에서 정해놓은 규칙에 따라 해당 범위의 IP는 Private IP - 사설망이 되었다 
    - Private IP는 인터넷으로 나가지 못하고 차단된다 
    - 공유기에서는 들어온 공인 아이피를 사설 아이피로 바꾸고 다시 사설 아이피에서 공인 아이피로 바꾸는 작업을 진행한다 

 

4. 전송 계층 ( Transport Layer )

  • 전송계층은 protocol의 영역이고 TCP와 UDP가 대부분을 차지하고 인터넷에서 주로 사용되는 TCP에 대해서 짧게 설명하겠다 
  • TCP ( Transmission Control Protocol )
    - IP의 핵심 프로토콜 중 하나로 TCP/IP라고 많이 부른다 
    - 연결 지향형으로 3 way hand shaking을 통해 사용자를 인증한다 3 way hand shaking은 3번의 악수를 통해 서로 믿는다는 의미인데 해당 사항에 대해서 자세히 알고 싶다면 책을 보고 깊게 공부하는 것을 추천한다 
  • UDP ( User Datagram Protocol ) 
    - 위의 TCP와 반대되는 성격으로 비연결 지향형으로 연결이 되지 않아도 계속해서 패킷을 전송을 한다 

 

7. 응용 계층 ( Application Layer )

ssh

  • 개발자에게 아주 중요한 부분이고 Port에 대해서 설명하겠다
  • TCP와 UDP는 다음 자신의 목적지인 port 정보에 대해서 가지고 있다 
  • port는 Well-Known ports와 Registered ports, Dynamic Ports가 있다 
    - Well-Known ports ( 0 ~ 1023 )는 말 그대로 잘 알려진 포트이다 이미 사용하고 있을 확률이 높은 port로 다른 프로그램에서 해당 범위의 포트를 사용하는 것은 추천하지 않는다. 물론 다른 시스템이 사용하고 있다고 해서 못 사용하는 것은 아니다 단지 충돌이 일어날 수 있기 때문에 잘 사용하지 않고, default로 설정돼있더라도 보안의 문제 때문에 변경하여 사용하는 경우가 많다. 어떤 것이 있는지 자세히 보고 싶다면 https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers 를 참고하기 바란다
    - Registered ports ( 1024 ~ 49151 )는 위의 Well-Known ports와 같지만 대부분 잘 알려진 사용법이 없는 포트들이다. 대표적으로 3306 - MySQL, 3389- 원격 접속, 8080 - HTTP 등이 있다 
    - Dynamic ports ( 49152 ~  65535 ) 는 뭐로든 이용 가능한 포트이다. 딱히 대표적인 포트가 없다 사용하고 싶은 대로 사용해도 되지만 숫자가 길어 글쓴이의 경우 잘 사용하지 않는다. 

 

 

'IT기초' 카테고리의 다른 글

(3) Process, Thread, Multi-thread, Multi-process  (0) 2022.11.09
(2) CPU Instruction Cycle  (0) 2022.11.09
(1) Linux 기초 - 리눅스란?  (0) 2021.11.22

 

 

 

1. git 이란? 

  • 대표적인 형상 관리 도구 
    - 형상 관리란? : 코드의 묶음을 하나의 그림으로 보면 처음으로 제작한 그림(코드)은 버전 1.0 이 되고 해당 그림(코드)을 약간 변형하여 그림에 스티커를 붙였다 하면 이전에 그림이 어떤 모양이었는지를 알고 있다면 기존의 그림을 복원하기가 쉬울 것이다 
     
  • branch(나뭇 가지)와  PR(Pull Request) 
    - github의 경우 public(개방형)으로 만든 코드 묶음을 자유롭게 사용할 수 있고 fork라는 복사와 같은 기능을 통해 해당 public 코드 묶음을 자신만의 코드인 branch로 생성할 수 있다 
    - 또한 PR(Pull Request)이라는 기능을 통해 자신의 코드 수정사항을 github에 적용하기 전에  다른 사람의 의견을 물어본 후 적용시킬 수 있다. 또한 해당 PR을 통해 코드의 수정 부분과 개선 방안 등을 메신저 형식으로 쉽게 사용할 수 있다 

2. git 의 작동 방식 

출처 : https://opentutorials.org/module/3963/24425

 

  • Working directiory 
    - 자신이 작업하는 PC의 폴더이다 
    - 해당 폴더를 기준으로 git을 사용하겠다는 명령이 필요하다 ( git init )
  • Staging area
    - 자신이 작업한 코드의 어떤 부분이 수정되고 삭제되고 추가됐는지 변경된 사항을 저장한다 
  • Local repo
    - local git 저장소이다
    - Staging area에서 전송받은 변경사항을 기록해놓는다
    ( 메세지 : "첫 커밋", commit version : 24369y273ehdfunsz9u23.......)
  • remote repo 
    - 원격 git 저장소이다 대표적으로 github과 gitlab이 있다 
    - 원격에 저장하는 이유의 장점은 공유이다.
    - 여러 사람에게 자신의 코드를 보여줄 수 있고 여러 사람이 같이 프로젝트를 진행할 수 있다 

3. 기본 명령어 

  • git init 
    - 코딩에서 변수를 초기화하는 것과 똑같다 git이라는 것을 사용하기 위해 초기화시킨다 (int number = 0 )
    - 해당 폴더에서 git init을 입력하면 해당 폴더를 git local repo라고 인식시킨다 
    - git init 명령어를 실행하면 다음과 같이 git bash에 괄호( ) 안에 master라는 항목이 적혀있다 
    - git의 기본 branch의 이름은 master이다 ( 최근 main으로 바꿔 쓰는 것을 권장 git branch -M main)
  • git add
    - git add 뒤에 . 을 붙이면 해당 폴더 안에 있는 모든 파일을 working directory에서 stage area에 기록한다는 뜻이다 
  • git commit 
    - git commit -m "메시지"    -m 옵션을 통해 이번 commit에 메모를 남긴다 
    - commit이 완료되면 어떤 파일이 변경되고 생성되고 삭제되고 등등 사항들이 나온다 
    - 대용량 파일을 commit 하려면 추가적인 설정이 필요하다 
  • git remote add [원격지 별명] [원격지 주소]
    - 위의 명령어는 test1이라는 별명으로 나의 원격지 깃헙 repo를 연결하였다 
    - 별명은 자신이 원하는 어떤 것이든 해도 된다 

  • git push [원격지 별명 또는 주소] [local repo이름]
    - push 밀어 넣는다
    - 원격지에 
    - local repo를 

 

 

 

 

자세한 설명

https://git-scm.com/book/ko/v2

 

Git - Book

 

git-scm.com

 

 

 

 

'infra > Tools' 카테고리의 다른 글

[Visual Studio Code] 1. VSC 원격 SSH 연결  (0) 2021.06.19
[Xshell] 2. Xshell 로깅 logging  (0) 2021.06.19
[Xshell] 1. Xshell 다운 및 사용 방법  (0) 2021.06.19

1. docker image pull [옵션] 이미지명[:태그명]

  • ex : docker image pull centos:7           CentOS v7를 다운로드한다 
  • 도커 hub에서 이미지를 다운받는다
  • Digest는 도커 레지스트리에 업로드한 이미지를 고유하게 식별하기 위한 암호화 키이다 (DCT - Docker Content Trust) 
 

GitHub - docker-library/repo-info: Extended information (especially license and layer details) about the published Official Imag

Extended information (especially license and layer details) about the published Official Images - GitHub - docker-library/repo-info: Extended information (especially license and layer details) abou...

github.com

2. docker image ls [옵션] [리포지토리명]

  • 다운로드하거나 가지고 있는 이미지의 목록을 표시한다 

3. docker image inspect 이미지명

  • 해당 이미지의 상세 정보를 확인할 수 있다. 
  • 주요 정보로는 이미지 ID, 작성일, docker 버전, CPU 아키텍처 등이 있다 

 

4. docker image tag  이미지명 사용자명/이미지명:태그 

  • 위 사진과 같이 가지고 있는 이미지에 해당 태그를 추가할 수 있다 자신의 repository에 업로드할 때 태그를 추가하여 업로드하면 좋다 
  • 여기서 중요한 점은 기존의 이미지인 centos와 새로 태그를 추가한 dldidfh/centos 이미지의 IMAGE ID가 같다는 것이다. 이는 이미지를 새로 생성한 것이 아닌 해당 이미지를 부르는 별명을 붙인 것이기 때문이다. 파일은 전혀 변경된 것이 없다 

5. docker search [옵션] 키워드 

  • 키워드를 기준으로 docker hub에 올라와 있는 이미지들을 검색한다 
  • 옵션으로는 --no-trunc 결과를 모두 표시, --limit n건의 검색 결과를 표시 , --filter=stars=n 즐겨찾기 n건 이상의 결과를 표시 star는 즐겨찾기를 누른 사람의 수를 뜻한다 

6. docker image rm [옵션] 이미지명 [이미지명]

  • 가지고 있는 이미지를 삭제한다 
  • 옵션에는 --force 이미지를 강제로 삭제, --no-prune 중간 이미지를 삭제하지 않음 
  • 위의 옵션은 되도록 사용하지 않는 것을 추천한다 

7. docker login [옵션] [서버]

  • 서버를 지정하지 않으면 docker hub에 접속한다 
  • 서버를 지정한다는 뜻은 자신이 가지고 있는 서버에 접속할 수 있다
    (개인은 1개의 private repository 이용 가능 더 많은 registry를 사용하고 싶다면 유료 서비스를 이용해야 한다)

8. docker image push 이미지명[:태그명]

  • docker image push dldidfh/centos:111 
  • dldidfh라는 계정의 repository에 centos:111이라는 이미지를 업로드한다

9. docker logout [서버명]

  • 서버명을 지정하지 않으면 docker hub에 로그인되어있는 아이디를 로그아웃 한다 

 

10. 컨테이너 생성 관련 명령어 

 

docker 자주 사용하는 명령어

docker ps  (docker ps [OPTIONS]) 로컬 도커 컨테이너 리스트를 보여준다  --all : 모든 컨테이너를 보여준다  --filter  : 입력 값에 따른 필터링된 결과를 보여준다  --format :  --last  N  : 최근에..

house-of-e.tistory.com

 

11. docker container commit [옵션] 컨테이너 식별자 [이미지명[:태그명]]

  • 컨테이너로부터 이미지를 작성한다 
  • 옵션으로는 --author  작성자 지정, --message  메시지 지정, --change 커밋 시 dockerfile 명령을 지정, --pause 컨테이너를 일시 정지하고 커밋한다 

12. docker container export 컨테이너 식별자 > tar파일명. tar 

  • 컨테이너를 tar 파일로 출력한다 

13. docker container import <파일 또는 URL> | - [이미지명[:태그명]]

  • 파일이나 URL형태의 외부 파일을 이용하여 이미지를 작성한다 

14. docker image save [옵션] <저장 파일명> [이미지명]

  • docker 이미지를 tar 파일로 저장한다 
  • docker image save -o export.tar 이미지명 
  • -o 옵션은 저장할 파일명을 지정한다 

15. docker image load [옵션]

  • tar 이미지로부터 이미지를 읽어온다 
  • docker image load -i export.tar 
  • -i 옵션은 파일명을 지정한다 

'infra > docker' 카테고리의 다른 글

(2) docker - Container 기초  (0) 2021.08.29
(1) docker - 인프라 기초  (0) 2021.08.25

1. 컨테이너란? 

  • 호스트 OS상에 논리적인 구획을 만들고 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것

  • 호스트 OS의 리소스를 논리적으로 분리하고 오버헤드가 적기 때문에 고속으로 작동한다 

 

호스트형 서버 가상화

  • 위의 그림은 과거 많이 사용된 대표적인 가상화 툴인 virtual box의 구조이다. 
  • 사용해본 사람은 느꼈듯이 가상환경을 만들고 부팅을 진행하는데 꽤 시간이 소모된다
  • 각 가상 환경마다 각각의 OS를 가동하고 있기 때문에 overhead가 크다

 

컨테이너형 서버 가상화

  • 도커의 구조는 호스트 OS에 의존하는 형식이다. 
  • virtualbox가 초기 시작할 때 " 이 부분은 내 거야 " 하고 차지하고 시작하는 것과는 다르게 도커는 호스트와 대부분의 리소스를 공유한다
  • 호스트 OS의 사용자를 추가하는 느낌 

 

하이퍼바이저형 가상화

  • 호스트형 서버 가상화와 비슷한 모양이지만 호스트 OS가 빠지고 각각의 가상 환경에 OS가 있다. 
  • 호스트 OS없이 각 가상 환경마다 별도의 OS가 하드웨어를 직접 제어하기 때문에 자원을 효율적으로 사용할 수 있다. 
  • docker와는 지향하는 바가 다르다. 하이퍼바이저형은 서로 다른 환경을 어떻게 효율적으로 emulate 할지라는 점을 지향하고 있다

 

2. docker 개요

  • 애플리케이션의 이식성 - portability
    - 기존의 water fall형 개발방식에서는 애플리케이션 개발 환경과 테스트 환경, 실제 서비스 환경의 환경이 모두 달랐다. 그렇기에 각각의 과정마다 애플리케이션에 문제가 발생할 확률이 높았다
    - docker의 경우 docker file 형태로 환경을 구성하고 git 같은 CI를 이용하여 애플리케이션 개발부터 실제 서비스 환경까지 모두 같은 docker file을 이용하여 제작하므로 환경의 다름으로 인한 문제가 발생하지 않는다 
    - 이러한 환경의 제약이 많은 어플리케이션일수록 docker를 이용한 배포가 효과를 발휘한다 

 

3. docker의 기능 

  • Build - 이미지를 만드는 기능
    - 하나의 이미지는 하나의 어플리케이션을 넣어 두고 여러 개의 컨테이너를 조합하여 서비스 구축을 권장
    ( CentOS , Ubuntu, ......)
    - docker 이미지의 경우 명령어를 통해 수동으로 만들 수도 있지만 CI를 위하여 docker file형태로 작성하는 것을 권장한다 
    - docker는 이미지를 겹쳐서 새로운 이미지를 만들 수 있다 - docker는 각 이미지를 차분(이미지 레이어)로 관리하기 때문에 각각의 겹치는 부분에서 변경된 부분만을 가진다.
    - CentOS + MySQL(CentOS) = CentOS + MySQL
  • Ship - 이미지를 공유하는 기능 
    - docker 이미지는 docker 레지스트리에서 공유할 수 있다 
    docker 공식 레지스트리인 docker hub에서는 CentOS나 Ubuntu 같은 Linux배포판의 기본 기능을 제공하는 베이스 이미지를 배포하고 있다 
    - 이러한 베이스 이미지에 독자적인 MySQL이라던지 Jupyter 같은 독자적인 docker 이미지를 만들어 가는 것이다 
    - docker hub는 git과 연계할 수 있다. git hub 상에서 Docker file을 관리하고 거기서 Docker 이미지를 자동으로 생성하여 Docker Hub에서 공개하는 것도 가능하다 ( Automated Build )
  • Run - 컨테이너를 작동하는 기능
    - Docker의 경우 이미 움직이고 있는 OS 상에서 프로세스를 실행시키는 것과 거의 똑같은 속도로 빨리 실행시킬 수 있다 
    - Docker는 하나의 Linux 커널을 여러 개의 컨테이너에서 공유하고 있다 
    - 컨테이너 안에서 작동하는 프로세스를 하나의 그룹으로 관리하고 각 그룹마다 각각의 파일 시스템이나 호스트명, 네트워크를 할당하고 있다 
    - 그룹이 다르면 프로세스나 파일에 대한 액세스를 할 수 없다 
    - 위의 컨테이너의 독립을 위해 Linux의 커널 기능인 namespace, cgoups를 이용한다
    - docker component에는 Docker Engine, Docker Registry, Docker Compose, Docker Machine, Docker Swarm이 있다 각 기능은 추후 정리하겠다 

 4. Docker의 작동 구조 

  • 컨테이너를 구획화하는 장치 - namespace
    - 컨테이너를 구획화하는 장치는 Linux kernel의 namespace라는 기능을 사용한다 
    - 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념, 이름과 연결된 실체는 그 이름이 어떤 namespace에 속해 있는지 고유하게 정해진다 - namespace가 다르면 동일한 이름이라도 다른 실체로 처리된다 

    - namespace의 주된 기능 
    • PID namespace :
      Linux에서 각 프로세스에 할당된 고유한 PID(process ID)를 격리한다 - namespace가 다른 프로세스끼리는 서로 액세스 할 수 없다 
    • Network namespace :
      네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있다 -
      - 호스트 OS상에 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트를 사용할 수 있다 
    • UID namespace : 
      사용자 ID와 그룹 ID를 namespace 별로 독립적으로 가질 수 있다 
      - 컨테이너 안의 UID/GID가 0인 root 사용자를 호스트 OS 상에서는 일반 사용자로서 취급할 수 있다 
      - namespace 안의 root 계정은 호스트 OS에 대해서는 관리 권한을 일절 갖지 않는다 - 보안적 요소
    • MOUNT namespace :
      MOUNT namespace에 격리된 파일 시스템 트리를 만든다 마찬가지로 namespace 안에서 수행한 마운트는 호스트 OS나 다른 namespace에 액세스 할 수 없다 
    • UTS namespace : 
      namespace별로 호스트명이나 도메인명을 독자적으로 가질 수 있다 
    • IPC namespace : 
      프로세스 간의 통신(IPC - Inter-Process Communication - 공유 메모리, 세마포어/메시지 큐) 오브젝트를  namespace별로 독립적으로 가질 수 있다 ( 세마포어 - Semaphore - 자원관리에 이용되는 배타 제어장치 - 공유 자원의 개수 변수)
  • 릴리즈 관리 장치 - cgroups 
    - Docker는 물리 머신 상의 자원을 여러 컨테이너가 공유하며 작동함 이때 Linux kernel 기능인 control grouos 기능을 사용하여 자원의 할당 등을 관리함 
    • cgroups는 프로세스와 스레드를 그룹화하여 그 그룹 안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능 
      - 호스트 OS의 CPU나 메모리와 같은 자원에 대해 그룹별로 제한을 둘 수 있음 
      - cgroups로 컨테이너 안의 프로세스에 대해 자원을 제한함으로써 예를 들면 어떤 컨테이너가 호스트 OS의 자원을 모두 사용해 버려서 동일한 호스트 OS상에서 가동되는 다른 컨테이너에 영향을 주는 일을 막을 수 있다 
      - 관리 가능한 영역 :
      1. cpu : CPU 사용량 제한
      2. cpuacct : CPU 사용량 통계 정보를 제공 
      3. cpuset : CPU나 메모리 배치를 제어
      4. memory : 메모리나 스왑 사용량을 제한 
      5. devices : 디바이스에 대한 액세스 허가/ 거부 
      6. freezer : 그룹에 속한 프로세스 정지/재개
      7. net_cls : 네트워크 제어 태그를 부가 
      8. blkio : 블록 디바이스 입출력량 제어 
    • cgroups는 부모 자식 관계에서는 자식이 부모의 제한을 물려받는다 
      - 자식이 부모의 제한을 초과하는 설정을 하더라도 부모 cgroups의 제한에 걸린다 
  • 네트워크 구성 
    - Linux는 Docker를 설치하면 서버의 물리 NIC가 docker0이라는 가상 브리지 네트워크로 연결된다 
    - 컨테이너가 실행되면 172,17.0.0/16이라는 서브넷 마스크를 가진 private IP 주소가 eth0로 자동으로 할당된다  OSI 2 계층인 네트워크 인터페이스로 pair인 NIC와 터널링 통신을 한다 
    - docker0이라는 가상 브리지 네트워크와 호스트 OS의 물리 NIC에서 패킷을 전송할 때는 NAPT기능을 사용한다 
    • NAPT - Network Address Port Translation
      - 하나의 IP주소를 여러 컴퓨터가 공유하는 기술 - IP주소와 포트 번호를 변환하는 기능 
      - TCP/IP의 포트 번호까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결할 수 있다 
      - Docker에서는 NAPT에 Linux의 iptables를 사용한다 
    • NAT(Network Address Translation)와 NAPT의 차이점 
      - NAT라우터는 클라이언트의 private IP를 NAT가 가지고 있는 public IP로 변환하여 요청을 송신한다 응답은 NAT라우터가 송신처를 클라이언트의 private IP 주소로 변환하여 송신한다 
      - 이러한 주소 변환은 public IP와 private IP를 1:1로 변환하기 때문에 동시에 여러 클라이언트가 액세스 할 수 없다 
      - NAPT는 private IP와 함께 포트 번호도 같이 변환한다 
      - private IP를 public IP로 변환할 때 private IP 별로 서로 다른 public IP:포트번호로 변환한다 
      - 201.xxx.xxx.xxx:1500 = A 가상 머신 , 201.xxx.xxx.xxx:1600 = B 가상 머신 
      - 이로써 하나의 public IP와 여러 개의 private IP를 변환할 수 있다 
      - Linux에서 NAPT를 구축하는 것을 IP Masquerade라고 부른다 
  • Docker 이미지의 데이터 관리 장치 
    - 어떤 데이터를 복사할 필요가 생겼을 때 새로운 빈 영역을 확보하고 거기에 복사를 한다 
    하지만 만일 복사한 데이터에 변경이 없다면 A=B이면 그 복사는 쓸데없는 것이 된다 
    그래서 복사를 요구받아도 바로 복사하지 않고 원래의 데이터를 그대로 참조시켜 원본 또는 복사 어느 쪽에 수정이 가해진 시점에 비로소 새로운 빈 영역을 확보하고 데이터를 복사한다 
    이러한 장치를 Copy on Write라고 부른다 Docker에서는 Copy on Write 방식으로 컨테이너의 이미지를 관리한다 
    - Docker의 이미지를 관리하는 스토리지 디바이스로는 다음과 같은 것이 있다 
    1. AUFS : 다른 파일 시스템의 파일이나 디렉터리를 투과적으로 겹쳐서 하나의 파일 트리 구성, 표준 Linux kernel 아님 
    2. Btrfs : Linux용 Copy on Write 파일 시스템 - 롤백, snapshot 기능 
    3. Device Mapper : 파일 시스템의 블록 I/O와 디바이스의 mapping관계를 관리 - thin-provisioning, snapshot - Red Hat OS나 Ubuntu 등에서 Docker를 이용할 때 사용 
    4. OverlayFS : 파일 시스템에 다른 파일 시스템을 투과적으로 merging 하는 기능 
    5. ZFS : 볼륨 관리, snapshot, check sum, replication 등을 지원 

 

위의 개념들은 추후 각 기능을 사용할 때 어떤 방식으로 컨테이너가 생성되는지를 이해하기 위해 필요하다 

특히 docker run의 파라미터를 이해하는데 필요하다 

 

'infra > docker' 카테고리의 다른 글

(3) docker - 기본 명령어  (0) 2021.09.09
(1) docker - 인프라 기초  (0) 2021.08.25

이제는 소프트웨어 엔지니어 또한 docker를 이용하여 실제 환경과 Test환경을 똑같게 만들어 작업을 한다 

지금까지 docker를 사용해 왔지만 자세하고 세부적인 내용은 공부하지 않았다.

docker를 자세히 파악하여 더욱 다양한 방식으로 사용하기 위해 공부를 하자

 

1. 시스템 기반의 구성 요소 

  • 하드웨어 : 시스템 기반을 구성하는 물리적인 요소 (전원장치, 스토리지, 건물, 공조, 보안 설비, 소화 설비)
  • 네트워크 : 시스템 이용자가 원격지에서 엑세스 할 수 있도록 서버들을 연결하기 위한 요구사항(라우터, 스위치,)
  • OS         : 하드웨어나 네트워크 장비를 제어하기 위한 기본 소프트웨어(Windows, Ubuntu, CentOS)
    • 하드웨어 리소스나 프로세스를 관리 
    • 서버용 OS도 존재 - 장시간 가동해도 안정적, 대량의 데이터 효율적 수행
  • 미들웨어 :서버가 특정 역할을 다하기 위한 기능을 갖고 있는 소프트웨어(MySQL, NGINX, DB)

2. 시스템의 이용 형태 

  • 온프레미스(On-premises) : 자사에서 데이터센터를 보유하고 시스템 구축부터 운용까지를 모두 수행하는 형태
  • 퍼블릭 클라우드 : 인터넷을 경우하여 불특정 다수에게 제공되는 클라우드 서비스
  • 프라이빗 클라우드 : 특정 기업 그룹에게만 제공되는 클라우드 서비스
  • 트래픽의 변동이 많거나 백업을 반드시 해야하는 시스템의 경우 클라우드를 이용하여 확장성을 확보할 수 있다
  • 클라우드를 이용하면 비즈니스의 설립부터 서비스까지 릴리즈 시간을 줄일 수 있다. 

3. Linux

  • linux kernel : OS의 코어가 되는 부분, 메모리 관리, 파일 시스템, 프로세스 관리, 디바이스 제어 등 OS로서 하드웨어나 어플리케이션 소프트웨어를 제어하기 위한 기본적 기장을 잦고 있는 소프트웨어 
    • 디바이스 관리 : 디바이스 드라이버라는 소프트웨어를 이용하여 하드웨어 제어
    • 프로세스 관리 : 명령을 실행할 때 해당 프로그램 파일에 쓰여 있는 내용을 읽어 들여 메모리상에 전개한 후 메모리상의 프로그램을 실행함 = 프로세스 
    • 메모리 관리 : 프로그램과 데이터를 물리 메모리에 효율적으로 할당 
      - 메모리의 제한이 있으므로 하드디스크와 같은 보조기억장치에 가상 메모리 영역을 생성 = Swap memory
      - 메모리상에 전개된 이용 빈도가 낮은 데이터를 Swap으로 보내고 Swap상의 데이터를 다시 메모리로 돌림
    • Shell : 사용자가 내린 명령을 커맨드로 받아 kernel에 전달(bash, csh, tcsh, zsh)
      - 어플리케이션 실행, 정지, 재실행
      - 환경변수 관리
      - 명령 히스토리 관리
      - 명령 실행 결과 표시 및 파일 출력
    • 파일 시스템 : VFS(Virtual File System)라는 장치를 사용하여 데이터가 어디에 있던(하드, USB, network) 사용 가능
  • Linux distribution( 리눅스 배포판) : 보통 Linux는 배포판이라는 형태로 패키지화 되어 배포됨 ( Ubuntu, Debian, Fedora, CentOS)
  • Linux 파일 구성 
    /bin 기본 커맨드 ( ls, cp. mv 등 )
    /boot OS 시작에 필요한 파일 (커널이 해당 폴더의 vmlinuz라는 파일이다)
    /dev 디바이스 파일 ( /dev/had = 하드 , /dev/ttf = 표준입출력이 되는 단말 디바이스)
    /etc 설정 파일 ( IP, 사용자 비밀번호)
    /home 사용자 홈 디렉토리
    /lib 공유 라이브러리 
    /mnt 파일 시스템의 마운트 포인트용 디렉토리
    /media CD/DVD-ROM의 마운트 포인트
    /opt  어플리케이션 소프트웨어 패키지
    /proc 커널이나 프로세스에 관한 정보 (해당 폴더 아래있는 숫자 폴더는 프로세스ID를 뜻함, cpuinfo = CPU 정보, partitions = 디스크 파티션 정보)
    /root root용 홈 디렉토리
    /sbin 시스템 관리용 마운트
    /srv 시스템 교유의 데이터
    /tmp 임시 디렉토리
    /usr 각종 프로그램이나 커널 소스를 놓아두는 디렉토리 
    /var 로그나 메일 등 가변적인 파일을 놓아두는 디렉토리 ( /var/log = 가동 로그, /var/spool = 어플리케이션 임시 파일로 사용하는 스풀이 저장)

4. IaC (Infrastructure as Code)

  • Immitable Infrastructure : 클라우드를 이용함으로써 논리적으로 인프라를 재구성 할 수 있기 때문에 인프라의 변경 이력을 관리할 필요가 줄어듬 - 지금 있는것만 확인하면 됨 
  • 기존에는 파라미터 시트(버전 정보와 설정 항목의 설정 값이 쓰여있는 시트)를 토대로 수동으로 작업했지만 code를 이용하여 자동화 할 수 있다
  • Continuous integration : Code로써 인프라를 관리하기 때문에 Git등의 CI툴을 이용하여 인프라의 구조를 협업하기 편함( commit message, docker file)

5. 인프라 구성 관리 툴

  • OS의 시작을 자동화 : Red Hat 계열에서 사용가능한 KickStart, Local PC에 가상환경을 만들기 위한 Vagrant
  • OS나 미들웨어의 설정을 자동화 : DB server, web server, 감시 에이전트 등과 같은 미들웨어의 설치나 버전 관리, OS의 /etc 아래있는 설정 파일이나 방화벽 설정 자동화 - Chef, Ansible, Itamae, Puppet
  • 여러 서버를 관리하는 자동화 : 컨테이너 오케스트레이션의 사실상 표준이 된 Kubernetes
  • CI(Continuous Integration) : 코드를 추가 및 수정할 때마다 테스트를 실행하여 확실하게 작동하는 코드를 유지하는 방법, 사양서에 정해진 대로 작동하는지를 확인 - Jenkins, Git
  • CD(Continuous Deploy) : 지속적 배포 - 기능을 추가할 때마다 어플리케이션을 제품 환경에 배포
    - 배포에서 가장 중요한 점은 서비스의 연속성이다 서비스가 중지되면 안된다
    - Blue Green deploy - 버전1서버을 블루 버전2서버를 그린라고 했을 때 블루를 서비스하면서 그린을 테스트하여 성공하면 그린을 서비스하고 블루를 종료 - 자연스러운 변경이지만 클라우드 환경이 아니라면 어려움

'infra > docker' 카테고리의 다른 글

(3) docker - 기본 명령어  (0) 2021.09.09
(2) docker - Container 기초  (0) 2021.08.29

+ Recent posts