카테고리 없음

[따라하며 배우는 도커와 CI환경] 도커 기본, 기본적인 도커 클라이언트 명령어 알아보기

bona.0 2023. 1. 17. 18:38

 

본 포스팅은 인프런에서 강의하시는 John Ahn님의 '따라하며 배우는 도커와 CI환경'이라는 강의를 보며 

제가 이해한 내용을 정리하는 포스팅입니다. 

 

도커를 쓰는 이유?

결론: 프로그램을 다운 받는 과정을 간단하게 만들기 위해

  • ex) installer는 운영체제, 서버, 패키지 버전에 의존한다..
    • Redis를 wget 사용해 다운 / 도커를 사용해서 다운
      • wget 명령어가 없는 운영체제는 못 다운 받는다..
      • docker로 다운받으면 이미지 하나 다운으로 끝

도커란 무엇인가

  • 컨테이너를 사용하여 응용프로그램을 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구
  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 서버에서 컨테이너의 개념
    • 다양한 프로그램, 실행환경을 컨테이너로 추상화하고,
    • 동일한 인터페이스를 제공하여,
    • 프로그램의 배포 및 관리를 단순하게 해준다.
      • AWS, Azure, Google cloud 등 에서도 실행가능하게 해준다.

도커 이미지, 컨테이너

  • 도커 이미지
    • 프로그램을 실행하는데 필요한 설정과 종속성을 가짐
  • 도커 컨테이너
    • 이미지의 인스턴스로, 프로그램을 실행시킴

도커를 사용할 때의 흐름

  1. 도커 CLI에 커맨드 입력
    • Windows는 Docker desktop 실행한 상태에서
  2. 도커 서버(= 도커 Daemon)이 그 커맨드를 받아서, 이미지 생성이나 컨테이너 실행과 같은 모든 명령 실행

도커 vs 기존의 가상화 기술

  • 가상화 기술 전후
    • 전:
      • 한대의 서버를 하나의 용도로
    • 하이퍼 바이저 기반의 가상화 출현 후:
      • 논리적으로 공간을 분할하여 vm이라는 독립적인 가상환경의 서버 이용 가능해짐
      • 하이퍼바이저
        • Host 시스템에서 다수의 guest os를 구동할 수 있게 해주는 SW
        • HW를 가상화하면서 HW와 각각의 VM을 모니터링하는 중간 관리자
        • 하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 HW자원(예를 들면 core)을 할당받는다. 논리적으로 분리되어있기 때문에, 한 VM에 오류가 발생하더라도 다른 VM으로 퍼지지 않는다.
  • 도커 vs 하이퍼바이저 기반의 가상화
    • 공통점: hw에서 격리된 어플리케이션을 배치하는 방법
    • 차이점
      • 도커:
        • 하이퍼바이저와 guest os가 필요하지 않기 때문에 더 가볍다.
        • 이미지들이 동일한 커널을 공유한다(+), 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템에서 볼 수 있다.
          • ex) 몽고 db 컨테이너를 실행하면, 호스트의 일반 쉘에서 [c]ps-e grep 몽고[\c]를 실행하면 프로세스가 표시된다.
        • os를 내장하지 않기에 가볍고, 일반적으로 5-100MB
      • 하이퍼바이저 기반의 가상화:
        • VM은어플리케이션을 실행하기 위해, VM을 띄우고, 자원을 할당하고, 게스트 OS를 부팅하고, 어플리케이션을 실행하기 때문에 훨씬 복잡하고 무겁게 실행한다.
    이미지로 컨테이너 만들기
    • 순서
      1. [c]docker run <이미지 kakaotalk>[\c]
      2. 도커 이미지에 있는 파일 스냅샷(kakaotalk) 을 컨테이너 하드디스크에 옮겨준다.
      3. 이미지에서 가지고 있는 명령어를(컨테이너가 실행될 때 사용될 명령어)를 이용해서 카카오톡을 실행시켜줌
    리눅스의 C-group, 네임스페이스를 도커환경에서 쓸 수 있는 이유
  • host os가 맥이나 윈도우더라도 어떻게 리눅스 환경의 관리체계를 사용할 수 있을까?
    • 도커 클라이언트와 서버는 리눅스 환경에서 돌아가고 있고, 리눅스 커널이 있음.. (+)

by 인프런 '따라하며 배우는 도커와 CI환경'

 

도커 이미지 내부 파일

  • 이미지 내부파일 시스템 구조 보기: [c]docker run <image_name> ls[\c]
    • cli의 네번째 오는 건 원래 이미지가 가지고 있는 시작 명령어를 무시하고, 여기에 있는 커맨드를 실하게 하는 것.(여기서 ls)
    • [c]docker run alpine ls[\c]
    • [c]docker run hello-world[\c]
      • hello-world 이미지에선 ls명령어 사용 불가
      • → ls 명령어를 사용할 수 있게 하는 파일이 이미지 내에 없

컨테이너 나열: docker ps

  • 꺼져있는 컨테이너까지 : [c]docker ps -a[\c]

 

도커 컨테이너 생명주기

  1. 생성: [c]docker create <image name>[\c]
  2. 시작: [c]docker start -a <container name/id>[\c]
    1. -a: attach, output을 보여주기
  3. 실행
    1. docker run <image name> == create + start
  4. 중지
    1. gracefully하게 중지(그동안 하던 작업 완료): [c]docker **stop** <container name/id>[\c]
    2. 어떤 것도 기다리지 않고 바로 중지: [c]docker **kill** <container name/id>[\c]
  5. 삭제: [c]docker rm <container name/id>[\c]
    1. 이미지 삭제: [\c]docker rmi <image id>[\c]
    2. 도커를 쓰지 않을 때 한번에 컨테이너, 이미지, 네트워크 삭제: [/]docker system prune[\c]

 

실행중인 컨테이너에 명령어 전달

  • 이미 실행 중인 컨테이너에 명령어 전달: [c]docker exec <container id> <명령어>[\c]
    • docker run 은 새로운 컨테이너 만들고 실행

 

Redis를 이용한 컨테이너의 이해

  • 기본
    • 레디스 서버를 작동시키기
    • 레디스 클라이언트 실행 후, 명령어를 레디스 서버에 전달
      • 레디스 클라이언트도 컨테이너 안에서 실행을 시켜야 함.
      [c]docker run redisdocker exec -it <con id> redis-cli[\c]
    • -it: 명령어를 실행시킨 후, 계속 명령어를 적을 수 있게 해줌(redis-cli안에 들어가서 명령어 칠 수 있게 해줌)

 

실행중인 컨테이너의 터미널 들어가기

[c]docker exec -it <con id> sh/bash/powershell[\c]

  • 터미널에서 빠져나오기: ctrl + D