Docker/Docker

[Docker] Docker 기초

JABHACK 2025. 1. 29. 13:43

Docker의 장점

1. 애플리케이션 개발 및 배포의 간편화

  • 환경 격리:
    • Docker 컨테이너 내부에서 소프트웨어를 설치하고 실행하더라도, 호스트 OS에는 영향을 미치지 않습니다.
  • 일관성 있는 배포:
    • 동일한 환경에서 실행되는 컨테이너를 사용하여 개발, 테스트, 운영 환경 간에 일관성을 유지합니다.
  • CI/CD 지원:
    • 지속적인 통합(Continuous Integration) 및 배포(Continuous Deployment) 과정에서 Docker는 테스트 및 배포를 표준화합니다.

2. 독립성과 확장성 강화

  • 애플리케이션의 독립성:
    • 각 컨테이너는 독립적으로 실행되므로, 여러 애플리케이션이 서로 간섭 없이 동작할 수 있습니다.
  • 확장성:
    • 컨테이너 기반으로 손쉽게 애플리케이션을 스케일 업 또는 스케일 다운할 수 있습니다.

3. Docker의 표준화된 위치

  • 사실상 가상화의 표준:
    • Docker는 경량화된 컨테이너 기술로, 기존의 가상머신보다 빠르고 효율적입니다.
    • 다양한 클라우드 플랫폼에서 Docker를 지원하며, DevOps 환경에서 널리 사용됩니다.

 

Docker Image 관리

 

Docker 이미지란?

  • Docker 이미지는 **컨테이너 실행에 필요한 모든 요소(파일, 라이브러리, 설정 값 등)**를 포함한 가벼운 템플릿입니다.
  • Immutable(불변성):
    • 이미지가 한 번 생성되면 변경할 수 없으며, 수정이 필요하면 새로운 이미지를 생성해야 합니다.
  • Stateless(상태 저장 없음):
    • 컨테이너 실행 시 필요한 정적 파일만 포함하며, 데이터 상태는 컨테이너 외부 볼륨에 저장하거나 컨테이너 실행 중에만 유지됩니다.

Docker 이미지의 구조

Docker 이미지는 계층화된 파일 시스템으로 구성되며, 각 계층은 이미지의 변경 사항을 나타냅니다.

이미지 계층 구성

  1. Base Layer:
    • 모든 Docker 이미지는 베이스 이미지로부터 시작됩니다.
    • 예: ubuntu, alpine, node 등.
  2. Intermediate Layers:
    • 애플리케이션 실행에 필요한 파일, 라이브러리, 환경 설정 등이 추가된 계층.
    • 각 명령(RUN, COPY, ADD)이 실행될 때마다 새로운 계층이 생성됩니다.
  3. Top Layer:
    • 최종 애플리케이션 상태를 포함하는 계층.
    • 변경 사항 없이 불변으로 유지.

Docker 이미지 구조 확인

  1. 이미지 목록 확인
    • 설치된 모든 Docker 이미지를 확인.
  2. docker images
  3. 이미지 세부 정보 확인
    • 이미지의 메타데이터(환경 변수, 볼륨, 작업 디렉토리 등)를 확인.
  4. docker inspect <image-name-or-id>
  5. 이미지 계층 확인
    • 이미지가 어떻게 구성되었는지, 각 계층의 명령과 크기를 확인.
  6. docker history <image-name-or-id>

Docker 이미지의 장점

  1. 경량화:
    • 필요한 파일과 설정만 포함하여 용량이 작음.
    • 효율적인 저장 및 전송 가능.
  2. 이식성:
    • 동일한 이미지를 사용해 어떤 환경에서도 일관된 애플리케이션 실행 가능.
  3. 효율적인 업데이트:
    • 이미지를 수정할 필요가 있으면 새로운 계층만 생성.
    • 기존 계층은 캐시로 재사용 가능.

이미지 생성 및 관리

Dockerfile을 사용한 이미지 생성

# Base Layer
FROM ubuntu:latest

# Intermediate Layers
RUN apt-get update && apt-get install -y curl
COPY ./app /app
WORKDIR /app

# Top Layer
CMD ["./start.sh"]

이미지 빌드

docker build -t my-app:1.0 .

이미지 실행

docker run -it my-app:1.0

이미지 업데이트

  • 기존 이미지를 수정할 수 없으므로, 새로운 Dockerfile을 작성해 새 이미지를 생성해야 합니다.
  • 이미지를 업데이트하면 캐싱된 계층을 활용하여 빌드 속도를 개선.

요약

특징  설명
Stateless - 컨테이너 실행 시 상태 데이터를 유지하지 않음.- 애플리케이션 실행 환경을 동일하게 유지.
Immutable - 이미지 수정 불가.- 새로운 요구사항 발생 시 새로운 이미지를 생성해야 함.
구성 방식 - 계층화된 파일 시스템.- 각 명령(RUN, COPY)이 실행될 때마다 계층 추가.
관리 방법 - docker images: 이미지 목록 확인.- docker inspect: 이미지 메타데이터 확인.- docker history: 이미지 계층 확인.
장점 - 경량화, 이식성, 효율적인 업데이트.- 환경 독립적 애플리케이션 배포.

 

더보기

Docker 이미지 및 주요 명령어 표로 정리

 

명령어 설명  예제
docker pull Docker 이미지를 Docker Hub 또는 Private Registry에서 다운로드. docker pull nginx:latestdocker pull gcr.io/google-samples/hello-app:1.0
docker image inspect Docker 이미지의 메타데이터 및 내부 구조를 JSON 형식으로 확인. docker image inspect nginx:latestdocker image inspect --format="{{.Os}}" nginx:latest
docker image history 이미지 계층 정보를 확인하며, 각 명령(RUN, COPY 등)에 따른 이미지 생성 히스토리 제공. docker image history nginx:latest
docker login Docker Hub에 로그인하여 이미지 다운로드 및 업로드 가능. docker login
docker logout Docker Hub에서 로그아웃. docker logout

Docker 이미지의 주요 개념


항목  설명
이미지 계층 구조 Docker 이미지는 여러 계층으로 구성되며, 각 계층은 특정 명령(RUN, COPY 등)의 결과.
Immutable(불변성) 이미지는 한 번 생성되면 변경할 수 없음.새로운 요구사항은 새로운 이미지를 생성하여 처리.
Stateless 실행 중 상태 데이터는 컨테이너 외부(예: 볼륨)에 저장하여 애플리케이션 환경을 일관되게 유지.
레지스트리 Docker Hub 또는 Private Registry를 통해 이미지를 관리 및 공유.

Docker 명령어 사용 결과 예시

docker pull

docker pull nginx:latest
latest: Pulling from library/nginx
a378f10b3218: Pull complete
5b5e4b85559a: Pull complete
Digest: sha256:add4792d930c25dd2abf2ef9ea79de578097a1c175a16ab25814332fe33622de
Status: Downloaded newer image for nginx:latest

docker image inspect

docker image inspect nginx:latest
[
    {
        "Id": "sha256:593aee2afb642798b83a85306d2625fd7f089c0a1242c7e75a237846d80aa2a0",
        "RepoTags": ["nginx:latest"],
        "Created": "2023-10-25T01:21:47.343274012Z",
        "ContainerConfig": {
            "Hostname": "1e4063a23e5d",
            "ExposedPorts": {"80/tcp": {}}
        },
        ...
    }
]

docker image history

docker image history nginx:latest
IMAGE          CREATED       CREATED BY                                      SIZE
593aee2afb64   4 days ago    /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon…   0B
<missing>      4 days ago    /bin/sh -c #(nop) EXPOSE 80                    0B
<missing>      2 weeks ago   /bin/sh -c #(nop) ADD file:55ad846fa191e6…     74.8MB

Docker Desktop

항목 설명
Docker Desktop Docker CLI와 GUI를 제공하여 Docker 컨테이너와 이미지를 관리하는 데 도움.
Docker Hub Public 및 Private Registry로 이미지를 저장 및 공유.
Access Token 관리 Docker Hub에서 Access Token을 생성하여 보안성을 강화하고, 관리 인터페이스에서 제어 가능.

Docker 명령어 활용 포인트

  • 이미지 확인:
    • 이미지 상태를 점검하고 필요한 경우 레지스트리에서 재다운로드.
  • 로그인 관리:
    • Docker Hub에 로그인하여 이미지를 푸시/풀하거나 Private Registry 관리.
  • 이미지 계층 분석:
    • docker image history와 docker image inspect를 통해 이미지 구성과 최적화 확인.

 

 

Docker Container와 Container 를 다루는 CLI

Docker Image와 Container 관계 요약

항목 설명
Docker Image 컨테이너를 실행하기 위한 운영체제(OS), 애플리케이션, 라이브러리 정보를 포함. 컨테이너의 "틀"과 같은 역할.
Docker Container Docker Image를 실행한 상태. 이미지로부터 생성된 실행 단위. 1개의 이미지로 다수의 컨테이너를 생성 가능 (1:N 관계).

 

비유:

  • Docker Image는 붕어빵 틀.
  • Docker Container는 틀에서 구워낸 붕어빵.

Docker Container와 관련 CLI 명령어 요약

1. Docker Image 관리

명령어 설명

명령어 설명
docker pull <이미지명:태그> 지정된 태그의 이미지를 다운로드.
docker images 다운로드된 이미지 목록 확인.
docker build -t <이미지명> Dockerfile을 기반으로 이미지를 빌드.
docker image prune 태그가 없는 불필요한(dangling) 이미지 삭제.

2. Docker Container 생성 및 실행

명령어 설명
docker create 컨테이너 생성만 수행, 실행은 하지 않음.
docker start <컨테이너명> 중지된 컨테이너 실행.
docker attach <컨테이너명> 실행 중인 컨테이너에 연결.
docker run create, start, attach를 한 번에 실행.
docker run -d 백그라운드에서 실행.
docker run -p <호스트포트>:<컨테이너포트> 호스트와 컨테이너의 포트 연결.
docker run -v <호스트경로>:<컨테이너경로> 호스트 디렉토리와 컨테이너 디렉토리를 연결.
docker run --rm 실행 후 종료 시 컨테이너를 자동 삭제.

3. 컨테이너 상태 관리

명령어 설명
docker ps 실행 중인 컨테이너 목록 확인.
docker ps -a 실행 중이거나 중지된 모든 컨테이너 확인.
docker stop <컨테이너명> 실행 중인 컨테이너 중지.
docker pause <컨테이너명> 컨테이너 일시 중지.
docker unpause <컨테이너명> 일시 중지된 컨테이너 재개.

4. 실행 중인 컨테이너 정보 확인

명령어  설명
docker top <컨테이너명> 컨테이너 내에서 실행 중인 프로세스 확인.
docker stats 컨테이너 리소스 사용량(CPU, 메모리 등) 확인.
docker logs <컨테이너명> 컨테이너 로그 확인.
docker inspect <컨테이너명> 컨테이너의 세부 정보 확인(JSON 형식).

5. Docker 리소스 정리

명령어 설명
docker container prune 중지된 모든 컨테이너 삭제.
docker image prune 사용되지 않는 태그 없는 이미지 삭제.
docker system prune 사용하지 않는 모든 리소스 삭제(이미지, 컨테이너, 네트워크, 볼륨 등).

추가 설명

  1. 컨테이너와 프로세스 관계
    Docker Container는 독립된 프로세스로 실행되며, ps -ef 명령으로 확인 가능.
  2. ps -ef | grep <컨테이너명>
  3. 컨테이너 로그 관리
    • Docker 로그는 Host OS에 저장되며, 용량 관리를 위해 주기적으로 정리 필요.
    • docker logs -f로 실시간 로그 확인 가능.
  4. 컨테이너 종료 코드
    • 정상 종료: 0
    • 명령 실행 실패: 126, 127
    • 강제 종료: 137, 143 등

도움이 될 추가 자료

 

'Docker > Docker' 카테고리의 다른 글

[Docker] Docker+CI/CD  (0) 2025.01.30