DevOps

Docker 기초 끝내기 🙉

팅리엔 2023. 3. 1. 10:33

컨테이너 기술의 발전

  • Traditional Deployment:
    • Hardware - Operating System - App(Libs & Frameworks)
    • 문제점: 서비스가 점점 커지면서 한 서버에서 운영하는 서비스가 여러 개가 되면, 각각의 서비스에 필요한 라이브러리에 대해 의존성 충돌이 생길 수 있다. 관리가 어려워지고 서비스의 확장성이 낮아진다.
  • Virtualized Deployment
    • Hardware - Operating System - Hypervisor - Virtual Machines (Operating System - App(Libs & Frameworks))
    • 운영체제 상의 Hypervisor 컴포넌트를 통해 게스트OS(별도의 CPU, RAM, HDD 등)를 만든다. 하나의 Virtual Machine에 하나의 어플리케이션을 실행한다.
    • 장점: 여러 개의 어플리케이션이 서로에게 영향을 주지 않고 독립적으로 실행될 수 있다.
    • 문제점: 게스트OS를 만드는 데 큰 오버헤드가 발생한다. 일반 OS에 비하여 게스트OS의 성능이 좋지 않다.
  • Container Deployment
    • Hardware - Operating System - docker
    • 프로세스 단위의 격리 환경을 만든다. 호스트OS의 커널을 공유하여 사용하고, 컨테이너 안에는 어플리케이션을 실행하는 데 필요한 코드만 존재하여 오버헤드가 적고 가상머신보다 성능이 좋다.
    • Docker는 이 Container Engine 기술 중 가장 주목받는 기술로 2013년 등장했다.
  • Kubernetes Deployment
    • Container Orchestration
    • 여러 컨테이너들의 배포를 관리한다.

 

실습 환경

  • Docker for Desktop 설치 (docker, docker-compose)

Docker for Desktop 설치하기

도커는 리눅스 컨테이너를 관리하는 기술로, 기본적으로 macOS / Windows에서 네이티브로 사용할 수 없다.
도커의 기능을 완전하게 사용하려면 리눅스에서 사용하는 것이 바람직하다.

도커 데스크탑은 macOS / Windows에서 도커를 사용할 수 있도록 해주는 추가적인 경량 가상화 기술을 사용한 일종의 플랫폼으로, docker와 docker-compose를 포함하며 데스크탑 GUI를 제공한다.

brew intall --cask docker

참고: https://docs.docker.com/desktop/install/mac-install/

 


 

도커 구성 요소

  • Docker Client
    • 도커 명령어가 client 역할을 수행한다고 보면 된다.
  • Docker Host
    • Docker engine (Docker daemon)
      • Containers, Images 관리
      • 이미지는 직접 build 하거나, remote에서 pull 명령어로 가져온다.
  • Registry
    • remote 이미지 저장소

 

도커 이미지와 컨테이너

이미지와 컨테이너는 1:N 관계이다.
Docker File — (build) —> Docker Image — (run) —> Docker Container

이미지 Image

  • 컨테이너를 생성할 때 필요한 요소
  • 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있다.
  • 여러 개의 계층으로 된 바이너리 파일로 존재한다.
  • Dockerfile을 이용해 build를 수행하면 이미지가 생성된다.
  • 이름 구성: [Repository Name]/[Image Name]:[Image Tag]
  • 이미지 pull / push 시에 저장소 이름을 생략하면 기본 저장소인 도커 허브로 인식한다. 태그를 생략하면 latest로 인식한다.

컨테이너 Container

  • 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스
  • 이미지는 읽기 전용으로 사용하여 변경 사항은 컨테이너 계층에 저장된다. 
(컨테이너에서 무엇을 하든지 이미지는 영향을 받지 않는다.)
  • 이미지에 대해 run을 실행하면 컨테이너가 생성된다.

이미지 저장소 Image Repository

  • 도커 이미지를 관리하고 공유하기 위한 서버 어플리케이션
  • QUAY, DockerHub, AWS ECR, Docker Registry

 

 

도커 컨테이너 라이프 사이클

컨테이너 시작하기

  • 컨테이너 생성
  docker create [image]
  • 컨테이너 시작
  docker start [container]
  • 컨테이너 생성 및 시작
  docker run [image]

이미지가 없을 경우에는 자동으로 pull을 먼저 수행하여 이미지를 다운 받는다.

 

컨테이너 시작 (docker run 명령어) 주요 옵션

  • -i: 호스트의 표준 입력을 컨테이너와 연결 (interactive)
  • -t: TTY 할당
  • --rm: 컨테이너 실행 종료 후 자동 삭제
  • -d: 백그라운드 모드로 실행 (detached)
  • --name hello-world: 컨테이너 이름 지정
  • -p 80:80: 호스트 - 컨테이너 간의 포트 바인딩
  • -v /opt/example:/example: 호스트 - 컨테이너 간의 볼륨 바인딩
  • 마지막에 입력하는 명령어는 컨테이너 내에서 실행되는 명령어를 가리킨다.

 

컨테이너 종료하기

  • 컨테이너 종료 (SIGTERM 시그널 전달)
    • gracefully shut down
docker stop [container]
  • 모든 컨테이너 종료
docker stop $(docker ps -a -q)
  • 컨테이너 강제 종료 (SIGKILL 시그널 전달)
docker kill [container]

 

컨테이너 삭제하기

  • 컨테이너 삭제 (실행 중인 컨테이너는 삭제 불가)
docker rm [container]
  • 컨테이너 강제 실행 종료 후 삭제 (SIGKILL 시그널 전달)
docker rm -f [container]
  • 컨테이너 실행 종료 후 자동 삭제 (실행 명령어)
docker run --rm ...
  • 중지된 모든 컨테이너 삭제
docker container prune

 


 

도커 컨테이너 관리 - EntryPoint와 Command

컨테이너 명령어: [EntryPoint][Command]

 

엔트리 포인트

도커 컨테이너가 실행될 때 고정적으로 수행되는 스크립트 또는 명령어

생략 가능하며, 생략될 경우에는 커맨드에 지정된 명령어만 수행된다.

 

커맨드

도커 컨테이너가 실행될 때 수행되는 명령어 또는 엔트리 포인트에 지정된 명령어에 대한 인자값

 

Dockerfile의 엔트리 포인트와 커맨드

FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production

ENTRYPOINT ["docker-entrypoint.sh"] #옵셔널
CMD ["node"] #필수

 

도커 명령어의 엔트리 포인트와 커맨드

이미지에 지정된 엔트리 포인트와 커맨드를 덮어쓸 수 있다.

docker run --entrypoint sh ubuntu:focal
docker run --entrypoint echo ubuntu:focal hello world

위 명령어에서 ubuntu:focal의 기본 엔트리 포인트는 bash를 실행시키는 것인데, sh가 실행되도록 / echo가 실행되도록 변경했다.

 

 

도커 컨테이너 관리 - 환경변수

도커 컨테이너를 실행할 때 환경변수를 주입할 수 있다.

 

1. --env, -e 옵션 사용

docker run -i -t -e MY_TEXT=helloworld ubuntu:focal bash

2. --env-file 옵션 사용

# my.env
MY_TEXT=helloworld
docker run -i -t --env-file ./my.env ubuntu:focal bash

 

 

도커 컨테이너 관리 - 명령어 실행

docker exec

실행 중인 컨테이너에 명령어를 실행한다. 이슈 해결 시 빈번하게 사용되는 명령어.

docker exec [container] [command]

# my-nginx 컨테이너에 bash 셸로 접속하기
docker exec -i -t my-nginx bash

# my-nginx 컨테이너에 환경변수 확인하기
docker exec my-nginx env

 

 

도커 컨테이너 관리 - 네트워크

...

 

 

 

 


 

기본 명령어

  • 도커 버전 확인하기
docker -v
  • 실행 중인 컨테이너 목록 확인하기
    • -a: 전체 컨테이너 목록 확인하기
docker ps
  • 이미지 / 컨테이너의 정보 확인하기
docker inspect [id]