Docker 공부노트 - image와 컨테이너 udemy 강의를 듣고

코변·2022년 8월 23일
0

도커 공부노트

목록 보기
1/5
post-thumbnail

Photo by Rubaitul Azad on Unsplash

도커란?

  • 도커는 컨테이너를 관리하고 만드는 도구

컨테이너란?

  • 리눅스운영체제의 기술 중 하나로 표준화된 소프트웨어의 단위이다.
  • 코드들의 패키지이자 그 코드들을 실행하기 위한 라이브러리와 실행파일의 총체
  • 표준화가 되어 있기 때문에 같은 버전의 패키지, 디펜던시를 사용한다면 같은 코드에 대해 같은 결과를 반환한다.

virtual machine과 다른 점은 무엇이고 왜 사용하는가

  • virtual machine
    • 장점
      • 분리되고 표준화된 환경을 생성할 수 있다.
      • 환경별 구성을 가질 수 있어 동료와 같은 구성인지 확인하여 다른 환경에서 발생하는 문제를 예방할 수 있다.
    • 단점
      • 여러대를 구동하는 경우 메모리, cpu, 하드드라이브등 자원낭비가 생겨 오버헤드가 발생할 수밖에 없다.
      • 예를들어 모든 virtual machine을 동일한 os에서 돌린다고 하면 각각 os를 설치해주어야 한다.
      • 원하는 모든 시스템에 virtual machine을 설정해야하고 완전히 동일한 방식으로 구성해야하기 때문에 조금 까다로울 수 있다.
  • 도커
    • virtual machine과 다른 장점
      • 운영체제와 시스템에 미치는 영향이 적다. (리소스 낭비가 적음)
      • 공유, 재구축, 배포하는것이 매우 쉽다

이미지와 컨테이너

  • 이미지란 코드와 코드를 실행하는데 필요한 도구를 포함한다.
  • 내가 설정한 구성으로 이미지를 생성할 수 있고 그 이미지를 통해 여러 컨테이너를 만드는 것도 가능하다.
  • 이미지는 모든 설정명령과 모든 코드가 포함된 공유가 가능한 패키지이다.
  • 컨테이너는 이미지의 구체적인 실행 인스턴스다.
    즉 이미지를 기반으로 컨테이너를 실행하는 것이다.
    → 그래서 컨테이너에 띄운다라는 표현을 사용하는구나 직관적이다.
docker ps -a
## ps → 프로세스
## -a 는 all을 의미 모든 프로세스를 표시
docker run -it image_id
## -it → 컨테이너와 상호작용을 할 수 있다.
## 컨테이너 내부에서 실

FROM node

  • 베이스가 되는 이미지가 무엇인지 선언한다.
  • ex) python 3.10, node14등등..

WORKDIR /app

  • app이라는 폴더를 작업영역으로 만들 수 있다.(다른 이름으로도 변경 가능)
  • 코드를 어떤 폴더에서 실행할건지 선언해준다.
  • 작업폴더를 app으로 설정해준것

COPY . /app

  • 앞은 내가 이미지로 옮기고 싶은 경로
  • .을 입력하면 지금 도커파일이 있는 경로의 모든 파일을 복사하겠다는 의미
  • 뒤는 이미지 내부의 경로 -> 이미지 내부에는 자체 파일시스템이 있다.
  • 아래와 같이 /app을 선언했으나 폴더가 없다면 알아서 생성해줌
  • WORKDIR /app처럼 /app으로 워킹디렉토리를 설정했다면
  • COPY . ./와 같이 이미지의 현재 디렉토리로 나타내줄수도 있음

RUN npm install

  • run 코드를 통해서 명령어를 실행할 수 있다.
  • 이 예시는 RUN 코드를 통해서 디펜던시들을 다운로드 해준다.
  • Dockerfile에 있는 명령어들은 이미지를 설정하기 위한 도커 명령어들이다.
  • 이미지는 실행하는 주체가 아니다 이미지를 기반으로 컨테이너를 실행하는 것이다.
  • 그렇기에 RUN코드에 RUN python manage.py runserver or npm server.js와 같은 서버를 키는 명령어는 지양해야한다.

EXPOSE 8000

  • 우리 로컬 컴퓨터에서는 도커 컨테이너에 접근하는 법을 모른다.
  • 그렇기에 내가 컨테이너의 8000번 포트를 서버로 지정해두었다면 expose 명령어를 통해서 컨테이너의 8000번포트에 접속할수 있도록 해야한다.

CMD ["npm" "server.js"]

  • CMD ["python", "manage.py", "runserver"]
  • CMD는 이미지가 생성될 때 실행되지 않고
  • 이미지를 기반으로 컨테이너가 실행된 후에 서버를 킬 수 있다.
FROM node

WORKDIR /app

COPY . /app

RUN npm install

RUN python manage.py runserver

EXPOSE 8000

CMD ["npm" "server.js"]

위 코드대로 이미지를 빌드하고 docker run을 통해 컨테이너에 띄우면 80번포트로 접속이 불가능하다.
이유는 현재 로컬 포트와 도커 컨테이너의 포트를 연결시켜주지 않아서인데 아래와 같은 명령어로 포트를 연결해줄 수 있다.
강사는 위의 expose 명령어가 없이도 동작은 되지만 쓰는 것이 권장된다고 한다.

## 앞이 로컬 포트, 뒤가 컨테이터의 포트
docker run -p 80:80 image-id

컨테이너를 종료하는 명령어

## 앞이 로컬 포트, 뒤가 컨테이터의 포트
docker stop container-name

이미지와 컨테이너의 관계

  • 이미지는 빌드되고나면 고정되고 그대로 유지된다.
  • 빌드된 이미지는 읽기전용이며 외부에서 편집할 수 없다.
  • 당연하게도 내 코드의 변경사항을 이미지에 반영하고 싶다면 다시 빌드해야한다.

레이어 기반 아키텍쳐

  • 도커는 빌드할 때 결과들을 캐시해두고 다시 빌드할 때 달라졌는지 여부를 판단하여 달라지지 않았다면 캐시된 데이터를 사용하고 달라졌다면 새롭게 빌드한다.
  • 따라서 app 폴더 아래에 복사를 하고 npm install 을 실행하면
  • app 폴더 아래에 변화가 생길 때 마다 npm Install 을 새롭게 실행하므로 최적화 할 필요가 있다.
FROM node

WORKDIR /app

COPY pakage.json /app

RUN npm install

COPY . /app

EXPOSE 8000

CMD ["npm" "server.js"]

위와 같이 도커파일을 수정하면 파일을 변경할 때 마다 npm install이 실행되지 않는다.

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글