Docker

Shaun·2023년 9월 17일
1

Docker

목록 보기
7/7
post-thumbnail

다 까먹었던 도커를 다시 반복하면서 공부내용을 간략하게 정리 해봤다.

도커

  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 컨테이너는 코드와 모든 종속성을 패키지화하여 응용 프로그램이한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위
  • 도커는 실행환경에 필요한것들을 모두 가지고 있음!

도커 사용이유

  • 도커 없이 프로그램을 받을경우 installer 받고 - > 실행 ->설치 ...
  • 해당 프로그램을 받으려면 부수적인 프로그램을 받아야되는경우도 많다.
    -> 과정도 길고 환경에따라 에러발생 가능성이 많다

하지만 도커 같은경우에는 명령어 하나면 끝! 자세한 과정은 뒤에

도커 실행 과정(이미지 ->컨테이너)


도커이미지는 크게 두가지로 구성 되있음

  • 시작시 실행될 명령어
  • 파일 스냅샷

  • docker run imageName -> 도커 이미지에 있는 파일스냅샷을 하드디스크에 옮겨준다. 옮긴뒤에 실행될 명령어가 실행되면서 컨테이너가 실행됨

  • 도커 CLI -> 도커서버 이미지 캐시 보관장소에서 이미지가 없으면 도커 허브에서 다운받아옴

하이퍼 바이저 전후 비교

  • 전 : 한대의 서버 하나의 용도 및 하나의 os -> 남는 서버공간 낭비
  • 후(하이퍼바이저 기반 vm): 논리적 공간분리 -> 다수의 os 활용

  • 철저한 공간분리로 인해 다른 vm에게 영향을 주지 않음
  • 하지만 하드웨어 자원을 vm에게 에뮬레이트 하는 방식이므로 오버헤드가 큼

-> 이 기술을 토대로 도커가 나옴!

도커 vs vm

  • 도커의 가장 큰 장점은 게스트 os가 없어서 훨씬가볍다는 점!
  • 기존 vm은 vm 만들고 ->게스트os 설치 -> 실행 이기때문에 같은 커널을 공유하지 않지만 도커는 같은 호스트 os에서 실행시키기 때문에 같은 커널을 공유한다!

  • 도커 사용시 같은 커널을 공유하지만 컨테이너와 실행파일에 필요한 하디드스크 쪽은 철저히 분리 되있다.

컨테이너 기술

  • 사실상 리눅스 c-group / 네임스페이스 기술을 가져다 사용한것!
    • c-group : 시스템 리소스 사용량 조절
    • 네임스페이스 : 하나의 시스템에서 프로세스를 격리시킬 수 있는 기술

  • 실제로 docker verison 을 쳐보면 Linux 라고 나옴

기본 명령어

  • docker run imageName

  • docoker run imageName a(a=이미지 내부 실행명령어 무시하고 이것 실행) -> 하지만 이미지에 이 명령어를 실행할 수 있게하는 파일이 존재하여야함!

  • docker ps

  • docker ps -a

  • docker exec 컨테이너이름 (실행중인 컨테이너 안에 명령어 날리기)

  • docker exec -it 컨테이너이름 (it = 들어가서 계속 명령어 칠수있음)

  • docker exec -it 컨테이너이름 sh(컨테이너 쉘환경 접속)

도커 생명주기

  • create 는 하드디스크에 넣기만 / start 는 이미지 안에 있는 실행명령어 실행

  • docker start -a 컨테이너이름

  • docker stop : sigterm 을 줘서 gracefull하게 중지

  • docker kill : sigterm 을 주지 않고 바로 중지

도커 이미지 생성


  • 이미지: 베이스이미지(os) 와 n개의 레이어로 구성

FROM : 이미지이름:태그 -> 태그 안붙이면 최신으로
RUN: 도커 이미지가 생성되기전 실행될 쉘 명령어
CMD : 컨테이너가 실행 됬을때 실행될 쉘 스크립트

이미지 생성 순서

  • 이미지 생성시 임시 컨테이너 생성 -> 하드디스크에 스냅샷 저장(FROM) -> RUN -> CMD -> 이미지 생성하고 임시컨테이너 삭제

  • 이미지를 만들동안 잠시 받아두는 용도 -> 임시컨테이너

도커 테스트 (노드)

노드로 간단한 어플리케이션을 만든뒤 도커로 띄워보자

  • 베이스이미지는 노드 10으로 하며(from)

  • 추가적 필요한데이터 npm(노드 사용시 필요한것들은 다운 받아주는것)(run)

  • 이미지가 만들어지고 그 이미지로 컨테이너 실행시 server.js 부터 실행(cmd)

  • package.json / server.js 를 같이 컨테이너 안에 넣어서 이미지를 생성하려고 COPY 명령어 사용


  • 도커 포트 맵핑

workDir 설정

  • workdir을 설정하면 sh로 접근시 root로 접근하는게 아니라 이곳으로 바로간다

  • 우리가 설정한 파일들이 이곳으로 저장된다.

-> workDir을 설정하지 않으면 이미지를 만들때 COPY로 만든 파일이름과 원래 있던 파일시스템 이름이 동일한 경우 덮어씌우기를 해버려서 workDir에 따로 만들어준다.

COPY 순서

  • 기존 방식 ./ ./ 은 코드에 변화가 있을때마다 종속성 변화가 아니였음에도 불구하고 npm install로 종속성을 다운 받는다.

  • 하지만 종속성이 필요한 부분COPY명령어로 따로빼주면 -> 그 코드에 변화가 없을시에는 종속성을 따로 다운받지 않음. 기존 방식은 ./ ./ 라 변화가 있으면 무조건 다시 받았음

Volume

  • 지금까지는 도커파일 -> 빌드 ->이미지생성 ->컨테이너 시작 순으로 진행을 해왔다. 하지만 이 방법의 단점은 코드가 수정될때마다 다시 처음부터 시작해야 된다는 단점을 가지고 있다. 이 방법은 로컬에서 컨테이너로 '복사'를 하는 방법이고 volume은 '참조'를 하는 방식이다.

  • npm install로 인해 노드 종속성들이 다운받아지는 곳이 node_module 하지만 로컬에서는 필요없음! 그래서 도커 컨테이너에서 로컬을 참조시 참조하지 말라는 명령어가 두번째, 세번째는 우리가 만든 파일들이 있는곳을 참조 하라는 명령어

Docker compose


  • 여러 컨테이너를 한번에 컨트룰 하고 싶을때 사용!

  • yml 파일 작성시 services 밑으로 컨테이너 이름 하고 이미지를 넣어준다.

  • build는 dockerfile 위치 -> . 은 현재 디렉토리위치

  • docker-compose up -d --build. (d는 백그라운드에서 실행,build는 이미지가 있던 없던 이미지 빌드하고 시작)

profile
호주쉐프에서 개발자까지..

0개의 댓글