[DevOps] Docker

나무나무·2025년 8월 29일

DevOps

목록 보기
2/5

가상화(Virtualization)
- 하드웨어 기능을 소프트웨어로 분리하고 추상화하는 기술
- 하나의 물리적 시스템에서 여러 개의 가상 시스템 실행 가능

가상머신(VM, Virtual Machine)

  • 가상 머신은 컴퓨터상에 논리적으로 만들어낸 "가상 컴퓨터"

동작 원리

  • 하나의 물리 자원(서버)에 가상화 계층(→ Hypervisor)을 설치
  • Hypervisor 위에 여러 개의 운영체제(Guest OS)를 설치하여 독립적으로 운영
  • 각 VM은 자체 운영체제, 커널, 드라이버 등을 포함함

도커(Docker)

  • 2013년 3월 출시된 오픈 소스 컨테이너 프로젝트
  • Go 프로그래밍 언어로 작성되어 리눅스 컨테이너에 여러 기능을 추가해 애플리케이션을 개발, 실행하기 위한 플랫폼
  • 가상 머신과는 다르게 도커 컨테이너는 게스트 OS를 설치하지 않아 가상 머신보다 이미지 용량이 크게 줄어 서비스 개발 및 운영 환경에 도커를 많이 사용함

도커 구성 요소

  • 클라이언트-서버 아키텍처 사용
  • Docker Client : 도커 설치하면 그것이 Client → pull, build, run 등의 명령어 사용
  • Docker host : 도커가 띄워져 있는 서버를 의미, 컨테이너와 이미지를 관리함
  • Docker daemon : 도커 엔진
  • Registry : 외부 이미지 저장소 → 도커 host에 pull할 수 있음 → 가져온 이미지 run
  • Docker Image : 컨테이너를 만들고 실행하기 위한 읽기 전용 파일

도커는 리눅스 컴퓨터에서 사용
- 종류와 상관 없이 리눅스 운영체제가 사용됨.
- 윈도우, macOS에서도 도커 구동은 가능하지만, 내부적으로 리눅스가 사용됨

WSL(Window Subsystem for Linux)
- 별도의 가상머신 또는 이중 부팅 없이 윈도우에서 리눅스를 사용할 수 있게 하는 Window 기능


Docker Image

  • 모든 컨테이너는 이미지를 기반으로 생성
  • 컨테이너 생성을 위한 ‘읽기 전용 파일’
  • 컨테이너 생성을 위한 템플릿, 즉 일종의 “틀” → 애플리케이션을 실행할 수 있는 최소한의 환경만 제공하기 때문에 경량화된 OS 환경 같은 느낌임
  • 도커 컨테이너는 도커 이미지를 실행한 인스턴스 → 컨테이너 상태를 기반으로 새로운 이미지를 생성할 수도 있음
  • 이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있다.

도커 허브(Docker Hub)

  • 도커에서 공식적으로 제공하는 이미지 저장소
  • 태그는 일반적으로 버전을 명시, 버전 생략 시 latest로 인식

명령어 정리

  • docker search [키워드] : 이미지 검색
  • docker pull [이미지 이름]:[태그] : 이미지 내려받기
  • docker images [이미지 이름] : 도커 허브에서 내려받은 이미지 목록 확인
  • docker image inspect [이미지 ID] : 이미지 세부 정보 출력
  • docker save -o [추출할 파일 이름] [이미지 이름]:[태그] : 이미지를 파일로 추출
  • docker load -i [추출된 파일 이름] : 추출한 이미지 로드
  • docker rmi [이미지 이름, 이미지 ID] : 이미지 삭제
  • docker commit [옵션] [컨테이너 이름] [이미지 이름]:[태그] : 이미지 생성

Docker Container

  • 도커 이미지를 실행한 상태
  • 컨테이너는 리눅스 커널 기능을 활용하여, 프로세스 단위로 격리된 실행 환경을 제공하는 기술 ⇒ 컨테이너 안에는 애플리케이션 구동에 필요한 라이브러리 및 실행 파일만 존재 ⇒ 용량이 작음
  • 기존의 가상머신처럼 운영체제 전체를 가상화하는 것이 아니라, 애플리케이션이 실행되는 환경만을 가상화 함 ⇒ 컨테이너에서 실행되는 애플리케이션이 종료되면 컨테이너도 같이 종료됨

컨테이너의 핵심 기술 요소
가상화 공간 생성을 위해 리눅스 자체 기능인 chroot, namespace, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만듦 → 성능 손실 x

  • chroot: 파일 시스템 루트 변경 → 격리된 디렉토리 환경 제공
  • namespace: 프로세스, 네트워크, 사용자 ID 등을 격리
  • cgroup: 리소스(CPU, 메모리 등) 사용 제한 및 할당 관리

명령어 정리

  • docker run [옵션] [이미지 이름] : 컨테이너 생성 및 실행
  • docker ps [옵션] : 컨테이너 목록 조회(실행 중)
  • docker ps [옵션] - a : 컨테이너 목록 조회(모든 컨테이너)
  • docker stop [컨테이너 이름 / 컨테이너 ID] : 컨테이너 종료
  • docker exec [컨테이너 이름 / 컨테이너 ID] [명령] : 테이너에서 특정 명령을 실행
  • docker rm [옵션] [컨테이너 이름] : 컨테이너 삭제 / 실행 중인 컨테이너는 삭제할 수 없음(중지 후 삭제 or -f 추가
  • docker logs [컨테이너 이름] : 컨테이너 로그 출력 / --tail(마지막 로그 줄부터 출력할 줄의 수를 설정) / -f (컨테이너에서 실시간으로 출력되는 로그를 확인 가능) / -t(날짜 시간)

Docker Volume

  • 컨테이너를 삭제하게 될 경우 컨테이너에서 작업했던 데이터는 모두 삭제됨 → 컨테이너는 삭제되어도 데이터는 유지하고 싶은 경우에 "볼륨" 사용
  • 내부 컨테이너 데이터를 외부로 링크를 걸어주는 기능 → 컨테이너 내부에서 데이터가 수정된 즉시 볼륨 걸린 외부 데이터도 같이 수정됨 → 이후 컨테이너 삭제 시 외부 볼륨은 남게 됨.
  • 실제 물리 저장소를 쓰는 것처럼 컨테이너 내부로 해당 볼륨을 마운트해서 사용
    마운트 : 외부 저장소에 저장된 데이터를 현재 시스템의 파일 시스템 구조에 연결해서 사용
    도커에서 마운트 : 호스트 시스템의 파일 또는 디렉토리를 도커 컨테이너의 파일 시스템에 연결하는 작업을 의미.

명령어

  • docker -v [호스트 디렉토리] : [컨테이너 디렉토리] : 컨테이너 생성 시 호스트와 볼륨 공유
  • docker volume create --name 볼륨 이름 : 도커 볼륨 생성

Dockerfile

  • 도커파일(Dockerfile)은 도커 이미지를 생성하는 설정 파일
  • 컨테이너 생성 후 이미지 커밋 작업 자동화

도커파일 작성

  • [명령어] [매개값] 의 형태로 작성
    - 작성된 명령어들은 위에서 아래로 작성된 순서대로 실행
  • Dockerfile 작성 후 빌드할 경우 Docker는 나열된 명령문을 차례로 수행해서 DockerImage를 생성함.
  • FROM ubuntu:latest : ubuntu 이미지에서 새 계층 생성
  • RUN apt-get update : Ubuntu 패키지 관리자인 apt를 이용해 패키지 업데이트
  • RUN apt-get install sudo : 시스템에 sudo 명령어 설치 -> 일반 사용자에게 임시로 관리자 권한 부여
  • RUN sudo apt-get install net-tools : net-tools : 네트워크 관리 도구 모음 -> ifconfig 명령어 사용 가능
  • CMD ifconfig : CMD : 컨테이너 시작 시 실행될 기본 명령어 지정 -> ifconfig 실행

도커 파일 빌드

  • docker build --no-cache -f [도커파일 이름] -t [생성할 이미지 이름]:[태그] [도커파일 경로] : 파일 빌드 → 이미지 생성
    • -f : 생략할 경우 지정한 경로에서 DockerFile 이란 이름의 파일을 찾음
    • -t : 생략할 경우 16진수 형태의 이름의 이미지가 생성됨
    • --no-cache : 빌드 시 캐시 사용하지 않도록 설정
  • 이미지를 생성할 때 지정하는 도커 파일 경로에 해당하는 디렉토리 → 컨텍스트

명령어

  • FROM : 도커 파일로 생성할 이미지 기반 이미지를 설정
  • LABEL : 생성 이미지에 메타 데이터 추가
  • RUN : 생성되는 컨테이너 내부에서 명령어 실행
  • ADD : 이미지에 파일 추가
  • COPY : 이미지에 파일 추가
  • WORKDIR : 작업 디렉토리 설정 → cd 명령어와 동일한 기능
  • EXPOSE : 생성된 이미지로 컨테이너 실행 시 노출할 포트
  • CMD : 컨테이너 시작 시 실행할 명령어 설정
  • ENTRYPOINT : 컨테이너 시작 시 실행할 명령어 설정
    • CMD, ENTRYPOINT 둘 중 하나는 반드시 설정
    • 둘을 같이 사용할 경우 CDM 명령을 인자로 ENTRYPOINT 명령어 출력
  • VOLUME : 볼륨을 사용해 빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 디렉토리를 설정
  • ENV : 생성된 이미지에서 사용할 수 있는 환경 변수 설정
  • ARG : 내부로 값을 전달받을 수 있는 변수를 선언
profile
백엔드 개발자 나무입니다

0개의 댓글