Docker - 기본 개념

choko's avatar
Jun 29, 2024
Docker - 기본 개념
도커는 애플리케이션 뿐만 아니라 실행에 필요한 시스템 환경을 모아서 컨테이너(*Container*)로 관리합니다. 이렇게 만든 것을 도커 이미지(*Docker Image*)라고 하는데 이 이미지로 만든 컨테이너는 도커가 설치된 곳이라면 어디든 똑같이 동작합니다. 그곳이 Windows 든, macOS 든, Linux 든 상관이 없고 온프레미스(*On-premise*)든 클라우드든 상관 없습니다. 이를 이용하면 개발자가 커밋을 할 때마다 [Jenkins](https://jenkins.io/) 와 같은 지속적인 통합(*Continuous Integration, CI*) 툴에서 해당 소스를 도커 이미지로 빌드하고 이미지 리파지토리에서 이미지를 버전 별로 관리할 수 있습니다. 해당 이미지를 어느 환경이든 배포만 하면 독립적으로 동작하기 때문에 지속적인 딜리버리(*Continuous Delivery, CD*)가 가능합니다. 도커는 특히 분산 환경을 쉽게 구축할 수 있는 클라우드 서비스와 잘 맞습니다. 그래서 주요 클라우드 프로바이더들은 모두 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공합니다.
 
 

도커를 구성하는 컴포넌트

notion image
  • Docker Engine : 도커 이미지를 생성하고 컨테이너를 실행하는 핵심 기능.
  • Docker Registry : 도커 이미지 공개 및 공유. 도커 허브도 도커 레지스트리를 사용.
  • Docker Compose : 여러 컨테이너를 관리하기 위한 툴.
  • Docker Machine : 로컬의 VirtualBox 나 퍼블릭 클라우드에 도커 실행 환경을 구축하는 툴.
  • Docker Swarm : 여러 도커 호스트를 마스터(Master)와 노드(Node) 구조로 클러스터화하는 툴. 쿠버네티스와 비슷한 기능.

도커 기본동작

"도커 이미지"는 해당 파일 실행에 모든 것을 담고있고, "도커 컨테이너"는 이미지를 부분별로 쪼개서 담아둔 뒤 실행하는 역할을 한다.
notion image
 
 

Build - 이미지 만들기

notion image
  • 도커는 애플리케이션과 실행에 필요한 라이브러리, 미들웨어, OS, 네트워크 설정 등 필요한 모든 파일을 모아서 도커 이미지로 만든다.
  • 도커 이미지는 명령어를 이용해 수동으로 만들 수도 있지만 자동으로 빌드와 배포를 하는 CI/CD 환경에서는 도커 설정 파일(Dockerfile)을 이용해 자동으로 만들 수 있다.
 

Ship - 이미지 공유

notion image
  • 도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리(Docker Registry)라고 부름.
  • 대표적으로는 도커의 공식 레지스트리인 Docker Hub 가 있습니다. 도커 허브에서는 업체에서 제공하는 공식 이미지를 받을 수 있다.
    • 이런 베이스 이미지를 활용하면 환경을 빠르고 안전하게, 그리고 자동으로 구축할 수 있다
    • Github 와 같은 형상관리툴과 연동해서 Dockerfile 을 관리하고 도커 이미지를 자동으로 빌드해서 도커 허브로 배포도 가능함
 
 

Run - 컨테이너 동작

  • 도커는 도커 이미지를 가지고 컨테이너를 생성해서 동작시킨다
    • 하나의 이미지를 가지고 여러 개의 컨테이너를 만들어낼 수도 있다. 도커는 컨테이너를 생성하고 관리하기 위한 여러 명령을 제공함
  • 실제 업무에서는 보통 한 대의 호스트에 모든 컨테이너를 동작시키는 것이 아니라 여러 호스트로 된 분산 환경인 경우가 많다. 이런 분산 환경에서 여러 노드의 컨테이너를 관리하기 위해 쿠버네티스(Kubernetes, k8s)와 같은 컨테이너 오케스트레이션 툴(Container Orchestration Tool)을 주로 사용한다.
 
 

기본 명령어

  • search : 이미지 검색 -> docker search <이미지 이름>
  • pull : 이미지를 받음 -> docker pull <이미지 이름>:<태그>
  • images : 이미지 목록 출력 -> docker images
  • run : 컨테이너로 생성한 이미지를 이용하여 Bash Shell 실행 -> docker run <옵션> <이미지 이름> <실행할 파일>
    • 옵션
      • -d : 백그라운드에서 실행
      • -name : 컨테이너에 이름 부여
      • -p : 호스트와 컨테이너 간의 포트 배포/바인드를 위해 사용
        • 4567 포트로 리스닝하고 있는 HTTP서버를 호스트 컴퓨터에서 80번 포트로 접속 가능
          • ex) docker run -p 4567:80 -d nginx:latest → 127.0.0.1:4567 접속
  • ps : 모든 컨테이너 목록을 출력 -> docker ps
  • start : 정지한 컨테이너를 시작 -> docker start <컨테이너 이름>
  • restart : OS 재부팅처럼 컨테이너를 재시작함 -> docker restart <컨테이너 이름>
  • attach : 컨테이너에 접속 -> docker attach <컨테이너 이름>
  • exec : /bin/bash를 통하지 않고 외부에서 컨테이너 안의 명령을 실행 -> docker exec <컨테이너 이름> <명령> <매개 변수>
  • stop : 컨테이너를 정지함 -> docker stop <컨테이너 이름>
  • rm : 컨테이너 삭제 / rmi : 이미지 삭제 -> docker rm <컨테이너 이름> / docker rmi <이미지 이름>:<태그>
 
  • 시스템 상의 모든 컨테이너 삭제
    • $ docker rm -f $(docker ps -aq)
  • 시스템 상의 모든 이미지 삭제
    • $ docker rmi $(docker images -q)
 
 
 
Share article

Tom의 TIL 정리방