Docker

도커(Docker) 이미지 만들기

하카데미 2023. 12. 7. 18:21

ch03 도커 이미지 만들기

1. 도커 허브에 공유된 이미지 사용하기

docker image pull diamol/ch03-web-ping
  • docker image pull : 이미지 내려받는 명령어
    # 이미지 내려받으면 나오는 내용
    Using default tag: latest
    해시값: Already exists
    해시값: Pull complete
    해시값: Pull complete
    해시값: Pull complete
    해시값: Pull complete
    해시값: Pull complete
    Digest: sha 어쩌고저쩌고
    Status: Downloaded newer image for diamol/ch03-web-ping:latest
  • 이미지 레이어 : 이미지 각각의 파일
    도커 이미지는 물리적으로는 여러 개의 작은 파일로 구성되어 있다.
    도커가 이들 파일을 조립해 컨테이너의 내부 파일 시스템을 만든다.
    docker container run -d --name web-ping diamol/ch03-web-ping
  • -d 플래그 : --detach의 축약형
  • --name 플래그 : 컨테이너에 원하는 이름을 붙인다.
docker container logs web-ping
  • 도커를 통해 수집된 애플리케이션의 로그 확인
  • 로그내용 : 애플리케이션이 blog.sixeyed.com으로 HTTP 요청을 반복적으로 보내고 있다는 내용
  • 현재는 특정 블로그 주소로 고정되어 있으나 애플리케이션에서 대상 URL과 요청 간격, 요청 타입 등을 설정할 수 있다.
  • 시스템의 환경 변수 값에서 설정값을 읽어 온다.
  • 도커 컨테이너도 별도의 환경 변수를 가질 수 있다. 이때 이 환경 변수는 호스트 운영체제의 것이 아니라 도커가 부여해줌.
    docker rm -r web-ping
    docker container run --env TARGET=google.com diamol/ch03-web-ping
  • --env TARGET=google.com : 애플리케이션에서 사용할 환경 변수 값을 지정한 부분
  • ctrl + c 를 눌러 종료할 수 있다.

2. Dockerfile 작성하기

  • Dockerfile : 애플리케이션을 패키징하기 위한 간단한 스크립트로 일련의 인스트럭션으로 구성됨.
    # web-ping 애플리케이션의 Dockerfile 스크립트
    FROM diamol/node
    ENV TARGET="blog.sixeyed.com"
    ENV METHOD="HEAD"
    ENV INTERVAL="3000"
    
    WORKDIR /web-ping
    COPY app.js .
    
    CMD ["node", "/web-ping/app.js"]

- FROM : 어떤 이미지를 시작점으로 할지 지정
- ENV : 환경 변수 값을 지정하기 위한 인스트럭션. key="value" 형식을 따름.
- WORKDIR : 컨테이너 이미지 파일 시스템에 디렉터리를 만들고, 해당 디렉터리를 작업 디렉터리로 지정
- COPY : 로컬 파일 시스템의 파일 혹은 디렉터리를 컨테이너 이미지로 복사. [원본 경로] [복사 경로] 형식을 따름.
- CMD : 도커가 이미지로부터 컨테이너를 실행했을 때 실행할 명령을 지정

cd ch03/exercise/web-ping
ls


# 존재하는 파일 확인
- Dockerfile
- app.js
- README.md

3. 컨테이너 이미지 빌드하기

이미지를 빌드하려면 이미지의 이름, 패키징에 필요한 파일의 경로를 추가로 지정해 주어야 한다.

docker image build --tag web-ping .
  • --tag 플래그 : 이미지 이름
  • . : Dockerfile 및 이미지에 포함 시킬 파일이 위치한 경로

[참고] build 중 오류 발생 시

  • 먼저 도커 엔진이 정상적으로 동작 중인지 확인!
  • 그 다음 현재 작업 디렉토리가 정확한지 확인!
  • 마지막으로 build 명령을 정확하테 입력했는지 확인!
  • 빌드된 이미지는 로컬 이미지 캐시에 저장됨.
docker image ls 'w*'
  • 도커 명령으로 이미지 목록 확인.
docker container run -e TARGET=docker.com -e INTERVAL=5000 web-ping
  • 도커 웹사이트에 5초마다 요청 보내게 됨.

4. 도커 이미지와 이미지 레이어 이해하기

docker image history web-ping
  • Dockerfile 인스트럭션과 이미지 레이어는 1:1 관계
  • 도커 이미지 : 이미지 레이어가 모인 논리적 대상
    docker image ls
  • 이미지 목록과 용량 확인
  • 여기에 나오는 용량은 논리적인 용량이며 해당 이미지가 실제로 차지하는 디스크 용량을 나타내는 것이 아님.
    docker system df
  • 이미지 저장에 실제 사용된 디스크 용량 확인

5. 이미지 레이어 캐시를 이용한 Dockerfile 스크립트 최적화

5.1. 실습

ch03-web-ping 디렉터리에 있는 app.js 파일을 수정. 끝에 빈 줄 추가하는 정도도 OK. 그 다음 새로운 버전의 도커 이미지 빌드하기

git clone https://github.com/gilbutITbook/080258.git
cd 080258/ch03/exercise/web-ping
  • 3개 파일 : Dockerfile, app.js, README.md
    vim app.js
    # 맨 마지막 줄로 가는 vim 명령어
    shift + G
    # 맨 오른쪽으로 가는 vim 명령어
    shift + 4
    키보드 영어 o
    빈 한 줄 입력
    ESC 키
    :wq
docker image build -t web-ping:v2 .
  • 도커는 캐시에 일치하는 레이어가 있는지 확인하기 위해 해시값을 사용
  • Dockerfile 스크립트의 인스트럭션은 잘 수정하지 않는 인스트럭션이 앞으로 오고 자주 수정되는 인스트럭션이 뒤에 오도록 배치돼야 한다. 이렇게 해야 캐시에 저장된 이미지 레이어를 되도록 많이 재사용할 수 있다. 이미지를 공유하는 과정에서 시간은 물론이고 디스크 용량, 네트워크 대역폭을 모두 절약할 수 있는 방법이다.

5.2. web-ping-optimized 디렉터리로 이동하여 새로우 스크립트로 이미지를 다시 빌드

cd ../web-ping-optimized
docker image build -t web-ping:v3 .

6. 연습문제

6.1. 문제

Dockerfile 스크립트 없이 도커 이미지 생성하기.
Dockerfile의 목적은 애플리케이션 배포를 자동화하는 것!
diamol/ch03-lab 이미지가 있고, 이 이미지 안에는 /diamol/ch03.txt 파일 존재
이 파일 뒤에 자기 이름을 추가한 다음, 수정된 파일을 포함하는 새로운 이미지를 빌드하기.
Dockerfile 스크립트 사용 불가!

6.2. 힌트

  • -it 플래그를 사용하면 컨테이너를 대화식으로 실행할 수 있다.
  • 파일 시스템의 컨테이너는 컨테이너가 종료된 후에도 남아 있다.
  • docker container --help 명령 활용

6.3. 풀이

docker image pull diamol/ch03-lab
docker container run -it --name lab diamol/ch03-lab
echo Ssongmi >> ch03.txt
cat ch03.txt
exit
docker container commit lab ch03-lab-ssong
docker container run ch03-lab-ssong cat ch03.txt