Chapter02: Docker Image & Container

hahic·2022년 6월 5일
0

Docker

목록 보기
2/7
post-thumbnail

Concept

🔎 Image

  • Container의 템플릿 혹은 청사진
  • Code와 요구하는 Tool / 런타임을 포함

🔎 Container

  • 하나의 소프트웨어를 실행
  • 여러 개의 Container들은 하나의 Image를 기반으로 생성

About Image

🔔 Image를 생성하고 가져올 수 있는 방법

  1. 이미 존재하거나 이미 빌드된 Image를 이용하는 방법
    ex) Docker Hub
  2. 자신만의 Image를 생성하고 이용하는 방법
    ex) Dockerfile 작성 및 Image 빌드

자신만의 Image를 생성하고 이용하는 방법 (예시)

  1. Dockerfile 작성
    이상
FROM node

# Container의 작업 디렉토리 설정
WORKDIR /app

# `COPY source dest`
# soucre: Image에 포함할 resource의 경로
# dest: Image로 복사되어야 할 파일들을 저장할 Container 내부 경로
COPY . /app

RUN npm install

# document 목적으로 포트 번호를 작성한 것
# 설정에 영향을 가지 않음
EXPOSE 80

# `Run node server.js`
# 위 명령어는 틀림. Image가 빌드될 때마다 실행되기 때문
# 아래의 명령어는 Image를 기반으로 컨테이너가 시작될 때, 실행
CMD [ "node", "server.js" ]
  1. Image 빌드
docker build [Dockerfile이 존재하는 경로]
  1. Container 생성 및 실행
docker run -p [노출할 Port Number]:80 [image id | name]

🔔 Image를 공유할 수 있는 방법

  1. 코드와 Dockerfile을 공유
    직접 빌드하여 Image를 생성한 후, Contaniner 생성 및 실행
  2. 빌드된 Image 공유
    • Docker Hub
    • Private Registry

빌드된 Image 공유 (예시)

  1. Docker Hub
    • 공식 도커 이미지 레지스트리
      1. 새로운 Image 생성 후, push
        docker build -t hahic/node-hello-world .
        docker push hahic/node-hello-world
      2. 기존의 Image 이름 변경 후, push
        docker tag nodejs-code:1 hahic/node-hello-world .
        docker push hahic/node-hello-world
    • 공개 혹은 비공개로 이미지 저장 가능
  2. Private Registry
    • 원하는 레지스트리 선택
    • 사용하는 레지스트리에 따라 권한 설정 다름

📙 Image Tags

Image의 Tags은 name과 tag의 조합으로 이루어짐

name과 tag를 결합하면,
이미지에 특정 버전에 대한 고유 식별자를 언제나 가지게 됨

  • name
    특정 이미지들의 그룹을 정의 (ex. "node")
  • tag
    그룹 내의 특정 이미지를 정의 (ex. "14")

📙 Image는 Layer Architecture

모든 명령 결과를 캐시하고 이미지를 다시 빌드할 때,
명령을 다시 실행할 필요가 없으면 이러한 캐시된 결과를 사용

  • 모든 명령은 각각의 Dockerfile의 레이어를 나타냄
  • Image는 여러 레이어로 간단하게 구성
  • 변경된 레이어의 후속 레이어들도 같이 빌드됨

즉, 모든 명령어를 기반으로 하는 이미지 레이어는
레이어를 생성하고, 이러한 레이어는 캐시됨

Layer Architecture

유사한 관심사들을 레이어로 나눠서 수직적으로 배열하는 아키텍처

📙 Image는 읽기 전용

명령이 실행되고 Image가 빌드되면, Image가 잠기고
이 Image를 다시 빌드하지 않는 한 코드를 변경할 수 없음


About Container

📙 Attached Mode VS Detached Mode

Attached Mode

Container에 접속 / Container 로그 출력

  • docker run default
  • docker start -a
  • docker attach
    : 이미 생성된 Container와 연결하는 방법

Detached Mode

Container에 접속되지 않음

  • docker run -d
  • docker start default

📙 Interective Mode

Container에 접속 / Container 입출력
Attached Mode와 다름

  • docker run -it
  • docker start -a -i

Docker 주요 명령어

  • docker --help
    : docker의 명령어 리스트 출력
  • docker build [Dockerfile 경로] or docker build -t [Image tag] [Dockerfile 경로]
    : Custom Image 생성
  • docker images -a
    : image 리스트 출력
  • docker run [Image id|name] / docker run --name [Container name] [Image id|name]
    : container 생성 및 실행
  • docker stop [Container id|name]
    : container 중지
  • docker start [Container id|name]
    : 중지한 Container 시작
  • docker logs [Container id|name] / docker logs -f [Container id|name]
    : 특정 Container의 과거 출력 로그를 확인
  • docker rm [Container id|name]
    : Container 제거
  • docker rmi [Image id|tag]
    : Image 제거
  • docker image prune
    : 사용되지 않는 Image들 제거
  • docker run --rm [Container id|name]
    : Container가 중지되었을때, 자동으로 Container 제거
  • docker image inspect [Image id|name]
    : 해당 Image의 정보를 출력
  • docker inspect [Container id|name]
    : 해당 Container의 정보 출력
  • docker cp [원본 파일|폴더] [복사할 위치]
    ex) docker cp dumpy/. boring_vaughan:/test
    docker cp boring_vaughan:/test dumpy
    : 실행 중인 Container에 파일이나 폴더를 밖이나 안으로 복사
  • docker login
    : Docker Hub에 로그인
  • docker logout
    : Docker Hub에 로그아웃
profile
👩‍💻 Junior Backend Developer

0개의 댓글