Docker- 5

박형준·2024년 4월 29일

도커파일 ?

  • Dockerfile은 도커 이미지를 생성하기 위한 지시사항들을 포함하는 텍스트 파일
  • Dockerfile을 사용하면 도커 이미지를 구성하는 과정을 자동화할 수 있다.
  • 이미지가 어떻게 빌드되어야 하는지 세부 사항을 정의할 수 있다.
  • Dockerfile을 사용하면 이미지 빌드를 반복 가능하게 하고,
    버전 관리 시스템을 통해 이미지 구성을 관리하기 편리함.

도커파일 빌드 와 컨테이너 커밋 비교

  • Dockerfile build (도커파일 빌드)

    • 도커파일은 이미지를 빌드하는 데 필요한 모든 단계를 포함하므로,
      이미지 빌드 과정이 완전히 재현 가능.
    • 코드와 마찬가지로 버전 관리 시스템을 통해 관리할 수 있음.
    • 이미지를 빌드하는 데 필요한 모든 설정과 단계를 하나의 파일에 정의하므로,
      이미지의 구성을 쉽게 유지보수할 수 있음
  • Container commit (컨테이너 커밋)

    • 간편하게 빠르게 시작할 수 있지만, 도커 파일에 비해 단점이 많음
    • 컨테이너 커밋으로 생성된 이미지는 해당 컨테이너의 변경 사항만을 포함하므로,
      컨테이너 커밋을 통해 생성된 이미지를 다른 환경에서 재현하기 힘들 수 있음
    • 프로세스가 런타임 중 수행한 변경 사항을 포함할 수 있기에 이미지의 일관성과
      안정성이 보장되지 않을 수 있음
    • 이미 실행 중인 컨테이너의 파일 시스템 변경 사항을 그대로 포함하므로 이미지
      크기가 커질 수 있음

*Dockerfile 작성[ Dockerfile 작성 단계. ] ⇒ FROM / RUN / ENV / CMD

  • 베이스 이미지 선택:
    • 이미지를 구성할 때 기존 이미지를 기반으로 시작하는데,
    • 이 이미지를 '베이스 이미지'라고 한다.
    • 예를 들어, 리눅스 배포판이나 어플리케이션 실행 환경을 기본 이미지로 선택.
  • 필요한 파일 및 명령 추가:
    • 베이스 이미지 위에 필요한 파일과 명령을 추가.
    • 파일 복사, 환경 변수 설정, 응용프로그램 설치 등의 작업을 수행할 수 있음.
  • 작업 디렉토리 설정:
    • 이미지 내에서 작업 디렉토리를 설정하여 파일을 추가하거나 명령을 실행하는 위치를 지정.
  • 명령 실행:
    • 이미지 내에서 실행할 명령을 정의.
    • RUN, CMD, ENTRYPOINT 등의 명령을 사용하여 작업을 수행.
  • 포트 노출:
    • 이미지가 실행될 때 개방할 포트를 지정.
    • EXPOSE 명령을 사용하여 컨테이너 내부에서 개방할 포트를 명시.

-명령은 관례상 대문자를 사용 / 도커파일명은 Docker 또는 docker


*Dockerfile 빌드

  • docker build 명령은 도커 이미지를 빌드하기 위해 사용되는 명령어로, 이 명령을 사용하여 도커파일(Dockerfile)에 정의된 지시사항을 따라 이미지를 구성하고 빌드할 수 있다.
  • 도커 이미지 빌드 과정에서 도커파일에 정의된 단계들이 순차적으로 수행되며, 최종적으로 이미지가 생성된다.

docker build [옵션] <경로>

  • 여기서 <경로>는 도커파일이 위치한 디렉토리의 경로를 나타내고, 옵션은 이미지 빌드 과정을 조정하고 세부 사항을 지정하는 데 사용.

일반적으로 사용되는 옵션들:

  • -t, --tag : 빌드된 이미지에 태그를 지정. 이미지이름:태그 형식으로 사용.
  • -f, --file : 사용할 도커파일의 경로를 지정다. 기본값은 [ ./Dockerfile ]
  • -q, --quiet : 빌드 진행 상황 메시지를 출력하지 않음
  • --build-arg : 도커파일 내에서 ARG 지시문에 전달할 빌드 인자를 지정.

*도커파일은 도커 허브에서 많은 개인이 만들어 놓은 이미지 제공 (hub.docker.com)


*도커 파일

주석도 사용가능
#주석내용 입력

-도커파일로 이미지 생성

  • #mkdir -p ~/docker/sample/ && cd ~/docker/sample
    [root@www sample]#
    • [root@www sample]# ls
      Dockerfile

폴더생성후 진입해서 파일 생성 후 이미지만 다운로드

  • mkdir -p docker/sample && cd ~/docker/sample
    • centos 이미지만 다운로드하는 내용 입력
    • 내용 확인

생성한 도커 파일을 실행해서 이미지 다운로드

  • 도커 파일 실행 ( docker build -t, 태그 생성 )
    • 생성된 이미지 확인

버전을 바꾼 후 이미지 다운로드

  • docker build -t sample:2.0 .
    • 생성된 이미지 확인

*도커 파일과 index.html 압축 후 실행

  • [root@www test]# tar zcf docker.tar.gz index.html Dockerfile
    [root@www test]# tar ztf docker.tar.gz
    [root@www test]# docker build -t webapp - < docker.tar.gz

더미파일을 생성 후

  • touch dummyfile
  • 도커파일과 더미파일 압축하고 압축된 내용 확인
    • tree를 통해 압축된 것 확인
    • 압축한 도커.tar 파일을 실행
    • 생성된 이미지 확인 ( tag: latest )

*이미지 생성 확인

  • #docker image ls
    #docker inspect webapp

Dockerfile 생성 후 우분투 설치

  • 우분투를 통해 nginx를 설치하는 내용 입력 ( index.html 파일을 nginx 하위 폴더에 파일 복사 까지 )
  • index.html 작성

docker 파일을 압축 후에

  • tar zcf docker.tar.gz index.html Dockerfile ( index.html, Dockerfile 압축 )
    • 압축 확인

docker 파일 실행

  • docker build -t webapp - < docker.tar.gz
  • 생성된 이미지 확인과 파일 복사 확인
  • 실행이 원할하지 않다면 재부팅하기

*도커파일 빌드 방법 2가지

  1. 파일 지정 후 실행
  • #docker build -t sample:1.0 .
    #docker build -t sample:1.0 ~/docker/sample
    #docker build -t sample:1.0 /root/docker/sample

2.입력 방식에 의한 빌드 생성 [ 도커파일이 있는 절대경로 지정 ]

  • #docker build - < /root/docker/test/Dockerfile

*멀티 스테이지 : 도커 이미지용량을 줄이기

  • 순서 : 소스코드 작성 ⇒ 도커파일에 등록 실행
    • docker 폴더에 multi 디렉터리 생성 후 이동 후 main.go파일 생성
    • 도커파일 생성

이미지 빌드

  • #docker build webserver .

멀티 스테이지 작성 ( 용량 줄이기 )

  • 폴더 하나 생성 후 진입 ( mkdir multi )
    • 파일 생성 : vi main.go ( 소스 파일 )
    • 코드 작성 ( Go 언어로 작성된 간단한 웹 서버를 생성 )
  • 도커 파일 작성 ( 소스 파일, copy를 통해 경로 지정, 이미지를 배포할 때 사용 )
    • 도커 파일 실행 ( docker build -t webserver . )
    • 실행된 이미지 확인

-컨테이너 가동 및 확인

  • [root@www multi]# docker run -d --name web1 -p 8080:80 webserver
    414a9b7f88eb45246982e1f160107f72b27b800d5f09cfee2857c649fa44dfde

컨테이너 가동

  • 컨테이너 생성
  • 상태 확인

*위에서 생성한 파일을 가지고 용량을 줄이기 [ 도커파일을 수정해서 ]

  • 기존용량 확인

*용량줄이기

-용량 확인

도커파일을 수정해서 용량 줄이기

  • 도커 파일 수정 ( 버전 변경 및, Go로 작성된 애플리케이션을 컨테이너화 )
    • 이미지 확인 ( 용량이 줄어듬 )

*303M의 용량을 추가로 줄이기

-저장 후 빌드 시키고 용량 확인

  • #docker build -t webserver .

303M의 용량 줄이기

  • 도커 파일 수정 ( golang:alpine 이미지를 build 단계로 사용, 작업 디렉터리 추가하고 main.go의 파일 경로를 추가한 /app 경로에 복사 )
    • 이미지 용량 확인

*14.4M의 용량을 한번더 줄이기
#vi Dockerfile ⇒ 아래쪽 alpine 를 scratch 로 수정

*빌드 후 용량 확인하면 7M 로 줄어듬.

14.4M의 용량 줄이기

  • 도커 파일 수정 ( scratch 이미지, 컨테이너에 필요한 파일 및 실행 파일만을 포함 )
    • docker build -t webserver .
    • 이미지 용량 확인

https://docs.docker.com/reference/build
⇒ 도커 관련 전체 명령어 확인

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
⇒도커파일 모범사례


*도커파일?

  • 도커에서 이미지를 생성하기 위한 용도의 파일
  • [ 소스파일생성 ] , 도커파일 생성 ⇒ 빌드 시키기 ⇒ 컨테이너 동작

*도커파일 구조

  • #주석 입력
  • FROM
    • 베이스 이미지 ,
    • ubuntu:22.04
  • COPY
    • 경로
    • ./app /test/index.html
  • RUN
    • make /app
  • ENV
    • 환경 변수
  • EXPOSE
    • 포트 설정
  • CMD
    • [명령어]
    • python /app/app.py

*Dockerfile 명령 및 프로세스 실행 관련 …

  • RUN
  • CMD
  • WORKDIR
  • USER
  • ADD/COPY
  • EXPOSE

*RUN [ 도커에서 제일 많이 사용되는 명령어 ]

run 명령어 사용법 2가지

  • shell 형식으로 기술 방법 ⇒ RUN [ 실행시킬 명령어 ]
    • RUN [“apt-get” , “ -y” , “install” , “nginx” ]
  • Exec 형식으로 기술 하는 방법 ⇒ 많이 사용하는 형식
    • RUN [ “/bin/bash”, “-c “, “apt-get -y install nginx” ]

도커디렉터리 생성 후 그 안에 run디렉터리 생성 후 안으로 이동.

  • #mkdir -p ~/docker/run && cd ~/docker/run
    #vi Dockerfile2.txt
    • [root@www run]# docker build -t test-sample -f Dockerfile2.txt . ⇒ 맨 뒤 .(경로) 중요

도커 파일 RUN을 이용해서 명령어 실행

  • mkdir run && cd run (폴더 생성 후 진입)
  • vi Dockerfile2.txt ( 파일 생성 )
    • RUN을 이용해서 명령어 실행 ( shell 방식과 exec 방식 )
    • Dockerfile2.txt 파일을 이용해서 빌드 (docker build -t test-sample -f Dockerfile2.txt .)
  • 빌드할때 수행된 명령어 내용 확인
  • 생성된 이미지 확인 후 history 확인 ( 명령어 실행 확인 )

*CMD 명령어 [ 데몬 실행 ]

RUN 과 CMD 차이점 : RUN 이미지 빌드 시 사용, CMD 컨테이너 시작시 사용 .

  • -shell 형식 : CMD nginx -g ‘daemon off ; ’
  • -exec 형식 : CMD [ "nginx" , "-g" , "daemon off ;" ]
    • -entrypoint + shell : entrypoint nginx -g ‘daemon off ; ’
    • -entrypoint + exec : entrypoint [ "nginx" , "-g" , "daemon off ;" ]

*CMD 작성

  • [root@www entry]# docker build -t sample .
  • -이미지 실행(web1) 포트(80:80)
    • [root@www entry]# docker run -d --rm --name web1 -p 80:80 sample
    • [root@www entry]# curl http://localhost

CMD 명령어 ( 데몬 실행 )

  • mkdir entry && cd entry
  • vi Dockerfile
  • CMD를 이용해서 도커 파일 작성 ( EXPOSE : 포트 번호 지정 )
  • docker build -t sample .
    • 컨테이너 실행
    • 컨테이너 호출
    • 파이어 폭스에서 확인

*엔트리 포인트 작성

  • [root@www entry]# docker stop web1
  • [root@www entry]# vi Dockerfile2.txt
  • [root@www entry]# docker build -t sample -f Dockerfile2.txt .

ENTRY POINT 명령어 (생성한 컨테이너 중지 후에)

  • docker stop web1 (중지)
  • vi Dockerfile2.txt
    • 도커 파일 작성 ("top" 명령어가 실행 및 "-d 10" 옵션이 전달)
    • docker build -t sample -f Dockerfile2.txt .

*Entrypoint 와 cmd 정보값 확인

  • [root@www entry]# docker run -it --name s1 sample ⇒ top가 실행이 되면 Ctrl + C 로 빠져나옴.
  • [root@www entry]# docker run -it --name s2 sample -d 2 ⇒ top 명령을 2초 단위로 갱신.
    • [root@www entry]# docker rm -f $(docker ps -aq)

생성한 이미지 엔트리 포인트와 CMD 정보 확인

  • 엔트리 포인트 정보 확인
  • CMD 정보 확인
  • docker run -it --name s1 sample
    • 컨테이너 접속 후 "top -d 10" 확인 ("-d 10", 10초에 한번)
    • 컨테이너 정보에서 COMMAND 확인

*문서에 표기 된 사용 법

  • http ⇒ CMD [ “httpd-foreground” ]
  • nginx ⇒ CMD [ “nginx”, “-g”, “ daemon off ;” ]
  • Python ⇒ CMD [ “python”,”mypython.py” ]

*ONBUILD 명령

빌드 완료 후에 실행되는 명령어들을 넣어 놓는것.

-베이스 이미지 다운로드

  • #git clone https://github.com/asashiho/dockertext2 ⇒ onbuild로 이동
  • #cd /root/docker/onbuild/dockertext2/chap05/onbuild
    • [root@www onbuild]# vi Dockerfile.base ⇒ 버전만 수정하고 저장
  • [root@www onbuild]# docker build -t web-base -f Dockerfile.base .
    [root@www onbuild]# docker image ls

Onbuild

  • mkdir onbuild && cd onbuild
  • git clone https://github.com/asashiho/dockertext2 (깃 허브 다운로드)
  • onbuild(chap05)로 이동
  • vi Dockerfile.base
    • Onbuild를 이용해 Dockerfile.base 작성 ( Onbuild, 다음 빌드 단계에서 website.tar 파일을 /var/www/html/로 추가하도록 지정 )
    • docker build -t web-base -f Dockerfile.base .

html로 보낼 압축된 폴더(website.tar) 확인

  • 이미지 생성 확인 후 website 트리 확인
  • 압축된 website.tar 확인( tar tf website.tar )

-[root@www onbuild]# docker build -t photo-view .
[root@www onbuild]# docker run -d --rm --name web1 -p 80:80 photo-view
[root@www onbuild]# docker ps -a

Dockerfile.base를 통해 생성한 이미지로 도커 파일 빌드 ( Onbuild )

  • 도커 파일 확인 후
  • docker build -t photo-view .
  • docker run -d --rm --name web1 -p 80:80 photo-view

*onbuild 내용확인

  • [root@www onbuild]# docker inspect -f "{{ .Config.OnBuild }}" web-base
    [ADD website.tar /var/www/html/]

Onbuild 내용 확인

  • curl을 통해 Onbuild( website.tar가 html 폴더로 추가 )되었는지 확인
  • web-base 이미지 정보의 Onbuild를 inspect를 통해 확인
  • 파이어 폭스로 접속해서 Onbuild 확인
  • [root@www onbuild]# docker rm -f $(docker ps -aq)

*WORKDIR 지정 명령

디렉터리 생성 후 지정 해주지 않으면 기본적인 WORKDIR은 / 가 지정됨.

[root@www workdir]# docker build -t sample-work . ⇒ 빌드 생성시 위 내용의 명령이 실행되는것 확인 가능 함, 또는 history 를 통해서도 확인 가능.
[root@www workdir]# docker history sample-work

Workdir 작성

  • mkdir workdir
  • cd workdir/
  • vi Dockerfile
    • WORKDIR을 확인하는 도커 파일 작성
    • docker build -t sample-work .
    • 이미지의 history를 확인해서 WORKDIR 확인

도커 파일 실행 결과

  • WORKDIR /test1: 현재 작업 디렉토리를 /test1으로 변경
  • WORKDIR test2: 현재 작업 디렉토리에 상대적으로 test2 디렉토리를 생성, 따라서 /test1/test2로 변경
  • WORKDIR test3: 현재 작업 디렉토리에 상대적으로 test3 디렉토리를 생성, 따라서 /test1/test2/test3으로 변경
    • RUN ["pwd"]: 현재 디렉토리를 출력하는 명령어, /test1/test2/test3 출력
  • ENV DIRPATH /test1: 환경 변수 DIRPATH를 /test1로 설정
  • ENV DIRNAME test2: 환경 변수 DIRNAME을 test2로 설정
    • WORKDIR $ DIRPATH/$ DIRNAME: 환경 변수를 사용하여 현재 작업 디렉토리를 변경, 따라서 /test1/test2로 변경
    • RUN ["pwd"]: 현재 디렉토리를 출력하는 명령어, /test1/test2/ 출력

0개의 댓글