docker

노영삼·2020년 9월 27일
0

docker

목록 보기
1/2

도커 기본

도커

컨테이너를 사용하여 응용 프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설꼐된 도구 이며 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계 입니다.


컨테이너

컨테이너 안에 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다.

코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 켬퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어 표준 단위이다.

  • 이미지의 인스턴스

컨테이너 이미지

코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지입니다. 컨테이너 이미지는 런타임에 컨테이너가 되고 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.

  • 이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있습니다.
  • 이미지는 시작시 실행 될 명령어와 파일 스냅샷을 가지고 있다.

도커 이미지 생성 흐름

  1. dockerfile
  2. docker client
  3. docker server
  4. 이미지 생성

dockerfile

docker image를 만들기 위한 설정파일입니다. 컨테이너가 어떻게 행동해야하는지 설정들을 정의합니다.

FROM

  • 베이스 이미지

  • 이미지 생성시 기반이 되는 이미지 레이어.

WORKDIR

  • 작업 디렉토리를 지정한다.
  • 해당 디렉토리가 없으면 새로 생성한다.
  • 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
  • 이미지안에서 어플리케이션 소스 코드를 가지고있는 디렉토리를 생성합니다.

COPY

  • 파일이나 폴더를 이미지에 복사한다.
  • 로컬에서 도커 컨테이너로 복사한다.

RUN

  • 도커 이미지가 생성되기 전에 수행할 쉘 명령어
  • 추가적으로 필요한 파일 다운 받기 위한 명령어 명시

CMD

  • 컨테이너가 시작되었을 떄 실행할 실행 파일 또는 쉘 스크립트
  • 해당 명령어는 docker file 내 1회만 사용가능

베이스 이미지에서 다른 종속성이나 새로운 커맨드를 추가 할때는 임시 컨테이너를 만들 후 그 컨테이너를 토대로 새로운 이미지를 만들고 임시 컨테이너를 지운다.

// 이미지를 빌드할 때 쓰일 도커 파일을 지정해준다.
docker build -f Dockerfile.dev .

예시

FROM node:alpine AS builder
WORKDIR /app
COPY package.json ./
RUN npm install
COPY ./ ./
CMD ["npm", "run", "build"]

FROM nginx
EXPOSE 3000
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
# mysql 이미지를 사용 기본 설정을 변경하는 경우
FROM mysql:5.7

ADD ./my.cnf /etc/mysql/conf.d/my.cnf
#nginx 이미지를 사용 기본 설정을 적용하는 경우
FROM nginx

COPY ./default.conf /etc/nginx/conf.d/default.conf

베이스 이미지

  • 도커 이미지는 여러개의 레이어로 구성되어있다.
  • 베이스 이미지는 이 이미지의 기반이 되는 부분이다.

도커 사용 흐름

  1. 도커 클라이언트에 커맨드를 입력한다.
  2. 도커 서버에 컨테이너를 위한 이미지가 캐쉬 되어 있는지 확인
  3. 없으면 도커 허브에서 다운받는다
  4. 캐쉬되어 있으면 그 이미지로 컨테이너를 생성한다.
  5. 이미지의 파일 스냅샷을 하드 디스크에 올린다.
  6. 이미지의 시작 커맨드를 이용하여 어플리케이션을 실행한다.

도커와 기존 가상화 기술

공통점

  • 도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 한경 내에 애플리케이션을 배치하는 방법입니다.

차이점

  • 격리된 환경을 얼마나 격리 시킬 것인가.

도커

  • 하이퍼 바이저와 게스트 OS가 필요하지 않으므로 더 가볍다.
  • 어플리케이션을 실행할 때 호스트 OS위에 어플리케이션의 실행 패키지인 이미지를 배포하기만 하면 된다.
  • 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다.

VM

  • 어플리케이션을 실행 하기 위해서 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하여 어플리케이션을 실행한다
  • 과정이 훨씬 복잡하고 무겁다.
  • VM 내부에서 실행되는 모든 것은 호스트 운영체제와 하이퍼 바이저와 독립되어 있다.

컨테이너 생명주기

  • 생성
    • docker create
    • 파일 스냅샷을 하드 디스크로 옮긴다.
  • 시작
    • docker start
    • 실행 될 명령어를 컨테이너에 넣고 실행한다.
  • 실행
    • docker run = docker create + docker start
  • 중지
    • docker stop
      • 하던 작업들을 완료하고 컨테이너를 중지 시킨다.
    • docker kill
      • 즉시 컨테이너를 중지 시킨다.
  • 삭제
    • docker rm
    • 모든 컨테이너 삭제 docker rm docker ps -a -q'

docker compose

다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구입니다.

멀티 컨테이너 상황에서 쉽게 네트워크를 연결 시켜주기 위해서 dokcer compose를 이용한다.

//이미지를 빌드하기만 하며, 컨테이너를 시작하지는 않는다
docker-compose build

//이미지가 존재하지 않을경우에만 빌드하며, 컨테이너를 시작한다.
docker-compose up

//필요치 않을때도 강제로 이미지를 빌드하며, 컨테이너를 시작한다.
docker-compose up --build

//이미지 빌드 없이 컨테이너를 시작한다. 이미지가 없으면 실패한다.
docker-compose up --no-build

//docker compose로 실행시킨 컨테이너를 종료한다.
dokcer-compose down

예시

version: "3"
services:
	#컨테이너 이름
  react: 
  	#dockerfile 지정
    build:
      context: .
      dockerfile: Dockerfile.dev
    #
    ports:
      - "4000:3000"
    #로컬 머신에 있는 파일 매핑
    volumes:
      - /usr/src/app/node_modules
      - ./:/usr/src/app
    stdin_open: true
  #컨테이너 이름
  tests:
  	#dockerfile 지정
    build:
      context: .
      dockerfile: Dockerfile.dev
    #로컬 머신에 있는 파일 매핑
    volumes:
      - /usr/src/app/node_modules
      - ./:/usr/src/app
    #컨테이너 시작시 실행되는 명령어
    command: ["npm", "run", "test"]

restart

  • no : 재시작 안함

  • always : 항상 재시작

  • on-failure : on-failure 에러 코드와 함께 컨테이너가 멈출 때만 재시작

  • unless-stopped : 개발자가 임의로 멈추려고 할 때를 제외하고 항상 재시작

  • version: "3"
    services:
      nginx:
        restart: always
        build:
          context: ./nginx
          dockerfile: Dockerfile

volumes

  • 컨테이너를 지우면 컨테이너에 저장된 데이터들이 지워진다. 따라서 영속성이 필요한 데이터는 volume을 설정해 준다.
  • 도커 컨테이너를 삭제해도 volume을 지정했다면 데이터들은 호스트 파일 시스템에 남아있다.
  1. 이미지로 컨테이너를 생성
  2. 이미지는 컨테이너 생성후 읽기 전용
  3. 컨테이너 안에서의 변화
  4. 변화된 데이터를 컨테이너 안에 저장
  5. 컨테이너 삭제시 컨테이너 안에 저장된 데이터도 함께 삭제된다.
profile
개발자가 되고싶다.

0개의 댓글