BackEnd Skils

[Backend] Dorker 총 정리

JellyApple 2024. 12. 30. 18:41

이번에 백엔드를 조금씩 맡으면서 도커를 사용할 일이 생겼으나 실제 설명과 그 때마다 검색하는 것으로는 영 이해가 되지 않아 이 참에 한 번 크게 정리하고자 했다.

  • Docker?
    • 애플리케이션을 실행하는 상자(컨테이너)를 만드는 도구
    • 이 상자(컨테이너) 안에는 애플리케이션과 그것을 실행 하는 데 필요한 모든 것이 들어 있음.
    • 즉, 애플리케이션이 어디서든 동일한 환경에서 실행되도록 상자(컨테이너)를 만들어서 이 문제를 해결함
    • Docker는 이사박스 , 즉 물건을 상자에 넣으면, 어디로 이사를 가든 그 상자 안에 있는 물건은 똑같이 유지됨.
    • Docker는 어플리케이션이 어디서든 동일한 환경에서 실행되도록 상자(컨테이너)를 만들어서 이 문제를 해결해줌
  • 컨테이너?
    • 컨테이너는 Docker가 만든 애플리케이션을 실행하는 상자
    • 컨테이너 특징
      • 상자 안에는 애플리케이션과 그 실행에 필요한 모든 것이 들어 있음(운영체제 일부, 라이브러리, 코드 등)
      • 가볍고 빠르게 실행 가능함
      • 각각의 컨테이너는 서로 독립적이다.
    • 흔히 컵라면으로 비유할 수 있다.
      • 컵라면 안에는 면 , 스프 , 포크 등 필요한 모든 것이 들어 있음.
      • 물만 부으면 어디서든 바로 먹을 수 있음
      • 컨테이너도 이렇게 필요한 모든 것을 포함해서, 어디서든 실행 가능하다.
  • Docker Compose?
    • 여러 개의 컨테이너를 한꺼번에 관리하는 도구
    • 애플리케이션은 보통 여러 부분으로 구성된다.
      • 예: 웹 서버, 데이터베이스 , 캐시 등
    • 이걸 각각의 컨테이너로 만들고 실행하고자 하면 굉장히 번거로움.
    • Docker Compose는 하나의 설정 파일(docker-compose.yml)로 여러 컨테이너를 정의하고 관리할 수 있게 해줌.
    • 흔히 음식 배달 세트로 비유할 수 있다.
      • 피자, 치킨, 음료 등 각각을 따로 주문하려면 번거롭지만, 세트 메뉴를 주문하면 한꺼번에 다 옴.
      • Docker Compose도 여러 컨테이너를 한꺼번에 실행하고 관리한다.
  • Docker, Docker Compose, 컨테이너의 관계
    1. Docker
      1. 컨테이너를 만드는 도구
      2. 상자를 하나씩 만들고 실행
    2. 컨테이너
      1. Docker가 만든 상자
      2. 애플리케이션을 실행하는 독립적인 환경
    3. Docker Compose
      1. 여러 컨테이너를 한꺼번에 실행하고 관리.
      2. 컨테이너 간의 네트워크, 데이터 연결 등을 설정
  • 실제 예시
    1. Docker
      1. 단일 컨테이너 실행
      docker run -d -p 8080:80 nginx // Nginx 웹 서버가 실행되며, 로컬에서 8080번 포트로 접근 가능
      
    2. Docker Compose
      1. docker-compose.yml 파일로 여러 컨테이너 정의
      version: '3.8'
      services: 
        web:
          image: nginx
          ports: 
            - "8080:80"
        db:
          image: mysql:5.7
          environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: mydb 
      
      b. 실행
    3. docker-compose up

⇒ Nginx 웹 서버와 MySQL 데이터베이스가 함께 실행 됨.

  • 사용 이유
    • 환경 일관성
      • 내컴퓨터에서 잘 되던 애플리케이션이 서버에서도 동일하게 실행됨
    • 빠른 배포
      • 애플리케이션을 어디든 몇 초 만에 배포 가능
    • 복잡한 애플리케이션 관리
      • Docker Compose로 여러 컨테이너를 쉽게 정의하고 실행
    • 효율성
      • 가상머신보다 빠르고 가벼우며, 리소스를 적게 사용
  • Docker Hub?
    • Docker 이미지를 저장하고 공유하는 공식 이미지 레지스트리
    • Docker 컨테이너를 실행하기 위한 이미지들을 저장하고 다운로드 할 수 있는 클라우드 기반 이미지 저장소
  • Docker Hub 역할
    1. 이미지 저장소
    • Docker 이미지를 업로드 하고 저장.
    • 로컬에서 만든 이미지를 Docker Hub에 업로드해 다른 사람과 공유 가능
    1. 이미지 다운로드
    • 애플리케이션을 실행하기 위한 이미지를 Docker Hub에서 다운로드 가능
    • 예: Nginx, MySQL, Node.js 등 인기 애플리케이션 이미지 바로 사용 가능
    1. 협업 도구
    • 팀원이 같은 이미지를 사용하도록 공유 가능
    • Private repository를 통해 민감한 이미지를 안전하게 관리
    1. 자동 빌드 지원
    • GitHub 등과 연동해 코드 변경 시 자동으로 이미지를 빌드하고 업로드
  • Docker Hub 주요 개념
    1. 이미지(Image)
    • Docker 컨테이너 실행에 필요한 애플리케이션과 환경을 포함
    • Docker Hub에서 제공되는 이미지:
      • 공식 이미지(Official Images)
        • Docker에서 인증한 이미지
        • 안정성과 보안이 검증됨
        • 예: nginx, mysql, node
      • 커뮤니티 이미지
        • 커뮤니티 사용자가 만든 이미지
        • 다양하지만 신뢰성을 검증해야함
    1. 레포지토리(Repository)
    • Docker 이미지를 저장하는 공간
    • GitHub 처럼 이미지 버전을 관리하고 공유 가능.
    • 예:
      • nginx: 공식 Nginx 레포지토리
      • myusername/myapp : 사용자 정의 애플리케이션 레포지토리
    1. 태그(Tag)
    • 레포지토리 내 이미지 버전을 식별
    • 예 :
      • nginx:lateset: 최신 버전의 Nginx.
      • nginx:1.20: Nginx 1.20 버전.
  • Docker Hub 사용 방법
  1. Docker Hub 계정 생성
  • 로그인 후 레포지토리 만들거나 이미지 탐색 가능
  1. Docker CLI와 Docker Hub 연동
  • 로그인 : Docker CLI에서 Docker Hub 계정에 로그인
docker login
  • 사용자 이름과 비밀번호 입력
  • 이미지 다운로드
docker pull <이미지이름>:<태그>
// docker pull nginx:lateset
  • 이미지 실행
docker run -d -p 8080:80 nginx

⇒ 브라우저에서 http://localhost:8080 접속 시 Nginx 화면 확인

  • 이미지 업로드
    1. 로컬 이미지에 태그 추가
docker tag <로컬이미지이름> <dockerhub계정명>/<레포지토리명>:<태그>
// docker tag myapp myusername/myapp:1.0


          2. Docker hub로 푸시

docker push <dockerhub계정명>/<레포지토리명>:<태그>
// docker push myusername/myapp:1.0
  • Docker Hub 에서 레포지토리 확인
    • DockerHub 웹 사이트 → 로그인 → Repositories 탭에서 업로드된 이미지 확인 가능.
  • 자동 빌드 설정
    • GitHub 연동하여 코드 변경 시 자동으로 Docker 이미지를 빌드하고 Docker Hub에 업로드:
      • Docker Hub → Create Repositiory 클릭
      • Build Settings → Github 계정 연결
      • 코듶 ㅜ시 시 Docker 이미지가 자동으로 빌드 및 업데이트
  • Docker Hub와 Local Docker 간의 흐름
    1.  이미지를 다운로드
    • docker pull mysql:8.0

      2. 컨테이너 실행
    • docker run -d mysql:8.0
      3. 로컬에서 만든 이미지를 Docker Hub에 업로드
    • docker push myusername/myapp:1.0
  • Docker Hub를 사용하는 이유
    1. 이미지 공유
      1. 팀이나 커뮤니티와 이미지를 쉽게 공유 가능
    2. 공식 이미지 활용
      1. 안정적이고 신뢰할 수 있는 이미지 제공
    3. 자동화 지원
      1. GitHub와 연동하여 CI/CD 파이프라인 구축
    4. 클라우드 백업
      1. 로컬 이미지 손실 시 Docker Hub에서 다시 가져올 수 있음
  • Docker 이미지?
    • Docker 이미지는 컨테이너를 실행하기 위한 청사진.
    • 애플리케이션과 그 실행에 필요한 모든 파일(코드, 라이브러리, 의존성, 설정 등)이 포함된 불변의 파일 시스템 스냅샷
    • 컨테이너는 이 이미지를 기반으로 실행되며, 이미지 자체는 실행되지 않는다. 즉, 이미지는 컨테이너를 생성하기 위한 설계도 또는 템플릿 역할을 한다
  • Docker 이미지 주요 개념
    1. 이미지 구성
      1. Docker 이미지는 여러 계층(Layer)로 구성됨.
        1. 각 계층은 하나의 명령어 실행 결과를 저장한 결과물
        2. 계층은 읽기 전용(immutable)이며, 이미지를 업데이트 하면 새로운 계층이 추가됨.
    2. 이미지 특징
      1. 불변성
        1. 이미지 자체는 변경되지 않음. 변경이 필요하면 새로운 이미지를 생성함
      2. 경향성
        1. 여러 이미지가 동일한 계층을 공유하며 디스크 공간을 절약함
      3. 이식성
        1. Docker 이미지는 운영체제, 하드웨어, 클라우드에 상관없이 동일하게 실행됨
  • 이미지와 컨테이너의 관계
    • 이미지
      • 실행 준비가 완료된 정지된 설계도
      • 컨테이너가 실행되기 위한 사전 정의된 상태
    • 컨테이너
      • 이미지를 실행한 실행 중인 상태
      • 이미지를 기반으로 애플리케이션이 동작하며, 컨테이너 내부는 읽기/쓰기 가능함
  • Docker 이미지의 주요 구성 요소
    • 애플리케이션 코드 : 이미지에 포함된 프로그램 코드
    • 필요한 라이브러리/패키지 : 애플리케이션 실행에 필요한 모든 파일(의존성)
    • OS 레이어 : 최소한의 운영체제 파일(우분투, Alpine)
    • Dockerfile 명령 실행 결과 : 이미지 생성 시 Dockerfile에서 실행된 명령 결과가 포함
  • Docker 이미지와 계층(Layer)
    • Docker 이미지는 계층으로 구성되며 , 계층은 이전 계층 위에 쌓여서 최종 이미지를 만든다.
    1. 계층의 특징
      1. 계층은 읽기 전용
      2. 계층은 변경되지 않으며, 새로운 계층이 추가될 때마다 업데이트됨
    2. 계층의 동작
      1. 여러 Docker 이미지는 동일한 계층을 공유할 수 있다.
      2. 예를 들어, python: 3.9 이미지를 기반으로 새로운 이미지를 생성하면, Python 계층은 여러 이미지에서 공유됨.
  • Docker 이미지 사용법
    1. Docker Hub에서 이미지 다운로드
    docker pull <이미지이름>:<태그>
    

       2. 로컬 이미지 목록 확인
  • docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              d1a364dc5483        2 days ago          133MB
mysql               8.0                 57f7eb58b147        4 days ago          500MB

           3. 이미지 기반 컨테이너 실행

: Docker 이미지 기반으로 컨테이너를 실행함

docker run <이미지이름>:<태그>
  1. 이미지 생성

: 새로운 이미지는 Dorkerfile을 사용하여 생성함.

dorker build -t my-python-app:1.0 .
  • Docker 이미지 사용하는 이유
    • 환경 일관성
      • 이미지는 개발 환경과 배포 환경을 동일하게 유지
      • 모든 종속성과 설정이 포함
    • 이식성
      • 이미지가 클라우드, 로컬 , 서버 등 어디서나 동일하게 작동
    • 경량성
      • 가상머신보다 가볍고 빠르게 실행가능
    • 버전 관리
      • 이미지 버전별로 태그를 추가해 관리
    ⇒ 비유하면 Docker 이미지는 레고 블록 세트임→ 이것만 있으면 언제든지 똑같은 결과물을 만들 수 있음
    ⇒ Docker 컨테이너는 조립된 레고 결과물 → 이미지를 기반으로 실제로 실행되는 상태.
    ⇒ 블록 세트에 모든 재료와 조립 설명서(Dorkerfile)가 들어 있음