DevOps/Docker

Docker Container 와 Image

devdubu 2024. 7. 18. 22:50

Docker 구성요소

이미지와 컨테이너는 도커에서 사용하는 가장 기본적인 단위
이미지와 컨테이너는 1:N 관계

Image

  • 이미지는 컨테이너를 생성할 때 필요한 요소로 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어있다.
  • Docker Image는 여러 말들이 많지만, 결국은 하나의 어플리케이션 혹은 하나의 OS(Ubuntu Image)를 구동를 구동할 시에, 최소한의 조건으로 만드는 ISO 파일 이라고 생각하면 쉽습니다.
    • 보통은 자유롭게 이미지를 만들고 배포하기 보다는 사용하는 편들이 많이 있기 때문에, 쉬운

Container

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

Docker Image & Container

Docker Image 이름 구성

의미 작성 방법
저장소 이름(Repository Name)/ 이미지 이름(Image Name) devdubu/nginx
저장소 이름(Repository Name)/ 이미지 이름(Image Name):이미지 태그(Image Tag) devdubu/nginx:1.21
이미지 이름(Image Name):이미지 태그(Image Tag) nginx:latst
이미지 이름(Image Name) nginx
docker image Pull/Push시에 저장소 이름은 생략하면 기본 저장소인 도커 허브로 인식  

Docker Image Layer

Docker Image Registry

  • 이미지 저장소(Image Registry)
  • 도커 이미지를 관리하고 공유하기 위한 서버 어플리케이션

Docker Image Registry 에 관해서는 다른 포스팅에서 자세히 다루겠습니다.

Docker Image Build

앞서 설명 드렸듯이, 도커는 이미지를 생성하고 생성한 이미지를 바탕으로 컨테이너를 만들게 됩니다.
그렇다면, 우선 컨테이너를 실행하기 전에, 이미지 빌드가 먼저 선행으로 이루어져야지 컨테이너를 생성 및 실행이 가능합니다.

Docker Image Structure

  • Nginx는 Ubuntu를 기반으로, web app은 Nginx를 기반으로 만들어진 Image로 예시를 들어보자
  • 그림과 같이 docker의 Image 는 layer가 쌓이는 구조로 진행된다.
  • 아래의 사진에서는 Layers가 sha256의 형태로 Layer가 나뉘어진 모습을 알 수 있다.

Dockerfile 없이 이미지 생성

  • 기존의 컨테이너를 기반으로 새 이미지를 생성할 수 있다.
# docker commit [OPTION] CONTAINER [REPOSITORY[:TAG]] 
# ubuntu 컨테이너의 현재 상태를 my_ubuntu:v1`

docker commit -a devdubu -m "First Commit" ubuntu my ubnutu:v1

실습

docker run -it --name my_ubuntu ubuntu:focal

# Bash 진입 후
cat > my_file
Hello devdubu
^C
  • 후에 ctrl+p+q 를 누르게 된다면 종료 없이 실행 중인 Docker에서 빠져나올 수 있다.
docker commit -a devdubu -m "Add my_file" my_ubuntu my-ubuntu:v1
  • 해당 명령어를 작성하게 된다면, sha256이라는 값을 출력받을 수 있습니다.
  • 해당 명령어를 통해서 docker container를 image로 빌드를 시킬 수 있다.
    • -a : auth를 의미하고, 누가 history를 만드는지에 대한 옵션입니다.
    • -m : commit message
  • docker inspect [container] 명령어를 이용하면 layer에 대한 정보를 알 수 있습니다.

Dockerfile을 이용하여 이미지 생성

  • Dockerfile을 기반으로 새 이미지를 생성할 수 있다.
FROM node:12-alpine 
RUN apk add --no-cache python3 g++ make 
WORKDIR /app COPY . . 
RUN yarn install --production 
CMD ["node", src/index.js]

Dockerfile로 Image build

  • Dockerfile을 기반으로 새 이미지 생성하기
# docker build [OPTIONS] PATH 
# ./ 디렉토리를 빌드 컨텍스트로 my_app:v1 이미지 빌드(Dockerfile 이용) 
docker build -t my_app:v1 ./ 

# ./ 디렉토리를 빌드 컨텍스트로 my\_app:v1 이미지 빌드(example/MyDockerfile 이용) 
docker build -t my\_app:v1 -f example/MyDockerfile ./
  • -t : tag
  • -f : dockerfile의 경로

실습

APP

FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

Dockerfile

  • Dockerfile 실행 방법
  • docker build -t my-app:v1 ./

build context

  • Docker build 명령 수행 시 현재 디렉토리 (Current Working Directory)를 빌드 컨텍스트(Build Context)라고 한다.
  • Dockerfile로부터 image build에 필요한 정보를 Docker Daemon에게 전달하기 위한 목적이다.

.dockerignore

  • .gitignore와 동일한 문법을 가지고 있습니다.
  • 특정 디렉토리 혹은 파일 목록을 빌드 컨텍스트에서 제외하기 위한 목적이다.

Docker image 압축 파일 저장

  • 이미지를 tar 압축 파일로 저장 합니다. 
  • # docker save -o [OUTPUT-FILE] IMAGE # ubuntu:focal 이미지를 ubnutu_focal.tar 압축 파일로 저장 docker save -o ubuntu_focal.tar ubuntu:focal

Docker image 압축 불러오기

  • 이미지를 tar 압축 파일로 부터 불러오기
    # docker load -i [INPUT-FILE]
    # ubuntu_focal.tar 압축 파일에서 ubuntu:focal 이미지 불러오기
    docker load -i ubunut_focal.tar
  • -i : 압출을 풀 .tar 파일을 지정할 수 있다.

실습

# v2 tar 파일 만들기
docker save -o my-app-v2.tar my-app:v2

# my-app:v2 이미지 삭제
docker rmi my-app:v2

# v2 tar 파일 압축 풀기
docker load -i my-app-v2.tar