공부/docker

도커 교과서 ch03 (도커 이미지 1)

KidAnt 2023. 12. 18. 10:13
실습환경 초기화 명령
docker container rm -f $(docker container ls -aq)

이미지 차지 디스크 용량 회수 명령
docker image rm -f $(docker image ls -f reference='diamol/*' -q)

docker image pull (URL)
#특정 링크의 이미지 받기

docker container run -d --name web-ping diamol/ch03-web-ping
# -d: detach의 축약형 -> 백그라운드 작용 옵션
# --name: 컨테이너에 이름 태그 붙이는 옵션
  • 환경변수: 운영체제에서 제공하는 키-값 쌍
docker container run --env TARGET=google.com diamol/ch03-web-ping
# --env: 내용의 환경 변수값 옵션
  • 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: 도커가 이미지로부터 컨테이너를 실행했을 때 실행할 명령을 지정하는 인스트럭션
DESKTOP-KU8L7UV:~$ cd 080258/ch03/exercises/web-ping
DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping$ ls -al
total 20
drwxr-xr-x 2 root root 4096 Dec 11 13:34 .
drwxr-xr-x 4 root root 4096 Dec 11 13:34 ..
-rw-r--r-- 1 root root  152 Dec 11 13:34 Dockerfile
-rw-r--r-- 1 root root  292 Dec 11 13:34 Jenkinsfile
-rw-r--r-- 1 root root    0 Dec 11 13:34 README.md
-rw-r--r-- 1 root root  846 Dec 11 13:34 app.js

#Dockerfile(확장자X): 스크립트가 담긴 파일
#app.js: web-ping 어플리케이션을 구현한 Node.js 코드가 담긴 파일
#README.md: 이 이미지에 대한 정보가 적힌 문서 파일

docker image build --tag web-ping .
#docker image build --tag (이미지 이름) (파일위치)
#--tag: 세로 빌드되는 이미지의 이름
# . : 이미지에 들어갈 파일이 위치한 디렉토리 기제

DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping$ docker image history web-ping
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
ec313797477a   40 minutes ago   /bin/sh -c #(nop)  CMD ["node" "/web-ping/ap…   0B
67fc32ed049f   40 minutes ago   /bin/sh -c #(nop) COPY file:a2087c9a71052e4e…   846B
5b41ffbaadba   40 minutes ago   /bin/sh -c #(nop) WORKDIR /web-ping             0B
8b0fbcf5aacc   40 minutes ago   /bin/sh -c #(nop)  ENV INTERVAL=3000            0B
687bafa430be   40 minutes ago   /bin/sh -c #(nop)  ENV METHOD=HEAD              0B
fde14227427a   40 minutes ago   /bin/sh -c #(nop)  ENV TARGET=blog.sixeyed.c…   0B
#이미지 레이어 정보 확인
#CREATED BY: 해당 레이어를 구성한 Dockerfile 스크립트의 인스트럭션 (인스트럭션과 이미지레이어는 1:1관계)

도커 이미지

  • 이미지 레이어가 모인 논리적 대상 
  • 레이어는 도커 엔진의 캐시에 물리적으로 저장된 파일
  • 즉 이미지 레이어는 여러 이미지와 컨테이너에서 공유된다
    (캐시에 물리적으로 저장된 데이터니까 서로 같은 한 캐시 주소를 보는 것)
docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          3         1         75.3MB    75.3MB (100%)
Containers      1         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B
#물리적 종류별 용량 확인
  • 사용되는 이미지 레이어에는 look이 걸린다.(읽기 전용)
    • 레이어가 공유되는 이미지들의 일관성, 가용성을 위해서
DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping$ docker image build -t web-ping:v2 .
failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: no such file or directory

DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon   5.12kB
Step 1/7 : FROM diamol/node
 ---> 9dfa73010b19
Step 2/7 : ENV TARGET="blog.sixeyed.com"
 ---> Using cache
 ---> fde14227427a
Step 3/7 : ENV METHOD="HEAD"
 ---> Using cache
 ---> 687bafa430be
Step 4/7 : ENV INTERVAL="3000"
 ---> Using cache
 ---> 8b0fbcf5aacc
Step 5/7 : WORKDIR /web-ping
 ---> Using cache
 ---> 5b41ffbaadba
Step 6/7 : COPY app.js .
 ---> 4634f1e38874
Step 7/7 : CMD ["node", "/web-ping/app.js"]
 ---> Running in 95b95a30792d
Removing intermediate container 95b95a30792d
 ---> 9bdff1152703
Successfully built 9bdff1152703
Successfully tagged web-ping:v2
#임의의 레이어 순서가 있고 그 순서 중간에 잇는 레이어가 변경되면 그위에 오는 레이어는 재사용 불가능 -> 그래서 그밑의 레이어은 재실행 함
#Step 5까지는 기존에 있던 Using cache를 사용했지만 그밑에 app.js가 수정되어 있어 새로 레이어를 구축함 Stap 7또한 Using cache에서 가져올 수 있었지만 위의 Stap가 새로 레이러를 구축해서 본인 또한 재구축을 함
  • 각 레이어는 해시값을 주소로 가지며 Dackerfile 스크립트의 인스트럭션과 인스트럭션에 의해 복사되는 파일의 내용으로부터 계산
  • 기존 이미지 레이어에 해시값이 일치하는 것이 없다면 캐시 미스 발생하고 해당 인스트럭션 실행 -> 한번 실행되면 그다음 인스트럭션은 무조건 모두 실행
  • 그러므로 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 diamol/node

CMD ["node", "/web-ping/app.js"]

ENV     TARGET="blog.sixeyed.com" \
        METHOD="HEAD" \
        INTERVAL="3000"

WORKDIR /web-ping
COPY app.js .

#CMD(컨테이너시 이미지 실행 명령 내용)는 FORM(시작위치)뒤에만 배치하면 된다.
#ENV의 환경변수 선언은 '\'을 통해 한개로 여러 환경변수 선언가능

DESKTOP-KU8L7UV:~/080258/ch03/exercises/web-ping-optimized$ docker image build -t web-ping:v3 .
failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: no such file or directory

DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon   5.12kB
Step 1/5 : FROM diamol/node
 ---> 9dfa73010b19
Step 2/5 : CMD ["node", "/web-ping/app.js"]
 ---> Running in a824b7592db9
Removing intermediate container a824b7592db9
 ---> de689383948e
Step 3/5 : ENV TARGET="blog.sixeyed.com"     METHOD="HEAD"     INTERVAL="3000"
 ---> Running in bcf901c7d2c2
Removing intermediate container bcf901c7d2c2
 ---> 1f1527b96712
Step 4/5 : WORKDIR /web-ping
 ---> Running in ebcd30074464
Removing intermediate container ebcd30074464
 ---> c7aed111f8f1
Step 5/5 : COPY app.js .
 ---> 35a98609b76f
Successfully built 35a98609b76f
Successfully tagged web-ping:v3

#단계가 준것 말고는 차이가 없지만 app.js 파일이 맨밑으로 가게 되어서 추후에 수정해도 다른 레이어에는 영향이 덜가는 최적화가 달성되었다.

연습문제

docker container run -it --tty diamol/ch03-lab
#docker container run명령어의 옵션 -it로 대화형태로 접속

root@DESKTOP-KU8L7UV:/home/user# docker container run -it --tty diamol/ch03-lab
/diamol # vi ch03.txt

Lab solution, by:

->

Lab solution, by: park

#변경

root@DESKTOP-KU8L7UV:/home/user # docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@DESKTOP-KU8L7UV:/home/user# docker container ls -all
CONTAINER ID   IMAGE             COMMAND     CREATED          STATUS                     PORTS     NAMES
f860eddaf9dc   diamol/ch03-lab   "/bin/sh"   26 seconds ago   Exited (0) 9 seconds ago             frosty_kare
#돌아가는 컨테이너 확인
root@DESKTOP-KU8L7UV:/home/user # docker container commit frosty_kare diamol/ch03-lab
sha256:f04491579d5e825a48a8997823a169d1de8867b9a216bd1f18d80333441977f9
#commit을 통해 컨테이너의 변경사항을 이미지에 적용
root@DESKTOP-KU8L7UV:/home/user# docker container run -it --tty diamol/ch03-lab
#변경된 이미지로 새  컨테이너 만들고
/diamol # cat ch03.txt
Lab solution, by: park /diamol #
#변경된거 확인

#정리
#docker container run 옵션
#-it: 컨테이너를 대화식으로 연결
#--tty:연결시 접속

#docker container commit [컨테이너] [이미지]
#컨테이너의 변경된 사항을 이미지에 적용하는 명령어