5 minute read

일지

교재도 좀읽어야겠따

주요 키워드

오늘의 할일

  • 220511 TIL 작성
  • AWS 스터디준비
  • [ ]

추가로 정리해야할 부분

수업 정리


Dockerfile

Dockerfile에서 사용하는 예약어(계속)

실행할 명령어 (이미지를 사용하여 빌드할 때 실행): ONBUILD 실행되는 시점

  • RUN : 현재 Dockerfile에 따라 빌드 시 수행
  • CMD, ENTRYPOINT : 빌드 된 이미지로 컨테이너 구동 시 수행
  • ONBUILD : 현재 Dockerfile로 빌드된 이미지를 Base이미지로 사용하여 빌드할 때 실행

ONBUILD 예시 : Dockerfile.1 FROM nginx:latest ONBUILD COPY index.html /usr/share/nginx/html

빌드: # docker image build -t nginx-base -f Dockerfile.1 . 테스트: # docker run -d –name web -p 80:80 nginx-base # curl localhost # docker rm -f web

ONBULID 예시 : Dockerfile.2 FROM nginx-base:latest

빌드: # docker image build -t nginx-new -f Dockerfile.2 . 테스트: # docker run -d –name web -p 80:80 nginx-new # curl localhost # docker rm -f web 컨테이너의 상태 확인 기능 설정 : HEALTHCHECK 사용법 HEALTHCHECK [옵션] CMD <체크하기 위해="" 실행할="" 명령=""> 옵션 --interval : 상태확인 간격 --timeout : 일정 시간 응답없을 경우 timeout 기간 지정 --retires : 재시도 회수 예시 Dockerfile FROM ubuntu HEALTHCHECK --interval=10s --timeout=3s --retries=5 CMD test -f /tmp/test CMD ["sleep", "infinity"]

환경변수 설정 : ENV 사용법 ENV [변수이름] [변수값] ENV [변수이름]=[변수값] 예시 Dockerfile FROM ubuntu ENV VAR1 Hello ENV VAR2 World ENV VAR3=merong
VAR4=test
VAR5=docker

빌드: # docker build -t ubuntu-env . 테스트: # docker run –rm -it ubuntu-env # echo $VAR1 # env 참고 ARG: Dockerfile 내에서 사용되는 변수를 지정 Dockerfile 내에서만 유효하고, 실제 컨테이너 내에서는 사용되지 않음 –build-args 옵션으로 빌드 시 지정 가능

명령어를 실행하는 위치 : WORKDIR 별도로 위치를 지정하지 않을 경우 기본위치 : / 사용법: WORKDIR [경로] WORKDIR /tmp WORKDIR tmp WORKDIR의 적용을 받는 Dockerfile 예약어: RUN, CMD, ENTRYPOINT, COPY, ADD WORKDIR 예시 Dockerfile FROM ubuntu WORKDIR /tmp RUN touch test1 WORKDIR /etc

빌드 전 /etc/hosts 파일을 Dockerfile 위치로 복사

cp /etc/hosts .

COPY hosts ./hosts.test WORKDIR / WORKDIR tmp RUN touch test2

사용자변경 : USER 명령어 등을 실행할 사용자 계정 지정 사용할 사용자는 미리 생성되어 있어야 함 FROM ubuntu RUN id RUN useradd testuser USER testuser RUN id

이미지에 대한 부가적인 정보 추가: LABEL 이미지에 대한 어떠한 정보라도 추가 가능. 항목이름=값 FROM ubuntu LABEL maintainer “Seol KH” LABEL image_name “ubuntu test” LABEL image_ver=”1.0” LABEL description=”This is test image using ubuntu”

컨테이너에서 노출시키는 네트워크 포트 정보: EXPOSE FROM ubuntu EXPOSE 80 EXPOSE 8080-8081

명령어 실행 시 자동으로 지정되는 쉘 설정 : SHELL FROM ubuntu SHELL [“/bin/bash”, “-c”] CMD sleep infinity

빌드 후 확인: # docker image inspect <이미지명>

파일 복사 : COPY, ADD ADD와 COPY의 차이

  • ADD는 tar, tar.gz, tgz, tar.bz2, tar.xz 파일 복사 시 자동 해제
  • ADD는 네트워크 위치의 파일을 사용할 수 있음
  • 네트워크 위치의 파일 지정 시 제한: https 사용불가, 압축해제 미지원 FROM ubuntu RUN mkdir /add RUN mkdir /copy ADD test.tar.gz /add COPY test.tar.gz /copy

볼륨 사용: VOLUME 주의사항: Docker Volume만 사용가능, 특정 볼륨 선택 불가 사용법: VOLUME <마운트포인트> FROM ubuntu VOLUME /tmp/test

이미지 업로드

기본 이미지 업로드 위치: Docker Hub Docker hub 가입을 통해 업로드 권한 사용 이미지 업로드 시 이미지의 태그 정보 수정 필요

/[:태그] Docker hub는 무료 계정의 경우 1개의 Private Repository 생성 가능 Private Repository는 권한을 가지고 로그인된 사용자가 아닐 경우 접근 불가 Private Registry 다른 사람은 접근할 수 없는 위치에 Registry 생성 Private Registry 종류 registry Docker에서 제공하는 컨테이너 기반의 Registry 인증 개념이 존재하지 않음 실행 # docker run -d -p 5000:5000 --name myregistry registry 이미지 push 시 이름 규칙 [:포트]/[:tag] registry에 저장된 이미지 목록 확인 # curl -X GET http://localhost:5000/v2/_catalog 특정 repository의 tag 정보 확인 # curl -X GET http://localhost:5000/v2//tags/list 이미지 pull도 동일: [:포트]/[:tag] Harbor Registry --- #### 실습 ``` Dockerfile 실습 1. 다음과 같이 이미지를 빌드할 수 있는 Dockerfile을 작성하시오. 이미지에 포함될 파일은 Dockerfile과 같은 디렉토리에 저장하여야 함. 1) 기본 이미지: centos:7 2) 이미지 빌드 시 수행할 작업 - 사용자 추가: testuser - 패키지 설치: httpd - 파일 생성: /tmp/testfile (testuser 사용자의 소유로 생성) - 파일 복사: default.tar.gz 파일을 /var/www/html 위치로 복사 및 해제 3) 빌드된 이미지로 컨테이너 구동 시 실행할 명령 - httpd -D FOREGROUND (httpd를 foreground로 실행하기 위한 명령) 4) 컨테이너 구동시 사용할 환경변수 설정 - WEB_SERVER=httpd - PLATFORM=docker - CONTENTS_VERSION=0.1 5) 현재 이미지를 Base Image로 사용하여 이미지 빌드 시 실행할 명령 - newcontents.tar.gz 파일을 /var/www/html 위치로 복사 및 해제 default.tar.gz 내 파일 목록 1. index.html: docker 로고를 화면에 출력하는 html 페이지 2. docker.jpg: 대충 docker 로고 이미지 아무거나 index.html 파일 내용 Default Page

Default Web contents

newcontents.tar.gz 파일 내용 1. index.html: 변경한 이미지를 출력하는 html 페이지 2. img.jpg: 대충 아무 이미지 index.html 파일 내용 New Page

New Web contents

A) 1. mkdir 0511 && cd 0511 1. vi index.html - 내용 붙여넣기 2. 로고는 알아서 준비하고 3. tar cvf default.tar.gz index.html docker.png 1. vi Dockerfile 2. 본문작성 FROM centos:7 RUN useradd testuser RUN yum install httpd -y USER testuser RUN touch /tmp/testfile ADD default.tar.gz /var/www/html ONBUILD RUN http -D FOREGROUND ENV WEB_SERVER=httpd PLATFORM=docker CONTENTS_VERSION=0.1 <이미지 빌드=""> docker image build -t prac1:1.0 . <컨테이너 구동=""> docker run prac1:1.0 아니머지 뉴컨텐츠는 언제넣는거지 이게아닌가 강사님답안 # 기본 이미지 FROM centos:7 # 빌드 시 수행할 작업 # 1.사용자 추가 RUN useradd testuser # 2.패키지 설치 RUN yum -y install httpd # 3. testuser로 파일 생성 USER testuser RUN touch /tmp/testfile USER root # 4. 파일 복사 ADD default.tar.gz /var/www/html # 컨테이너 구동 시 실행할 명령 CMD ["httpd", "-D", "FOREGROUND"] # 사용할 환경변수 지정 ENV WEB_SERVER=httpd\ PLATFORM=docker\ CONTENTS_VERSION=0.1 # 현재 이미지를 BASE IMAGE로 빌드를 수행할 때 컨텐츠 파일 추가 ONBUILD ADD newcontents.tar.gz /var/www/html # 기본 이미지로부터 컨텐츠 추가를 위한 Dockerfile FROM web-base 2. 다음과 같이 이미지를 빌드할 수 있는 Dockerfile을 작성하시오. 이미지에 포함될 파일은 Dockerfile과 같은 디렉토리에 저장하여야 함. 1) 기본 이미지: golang 2) 이미지 빌드 시 실행할 작업 - 파일 복사: main.go 파일을 /root로 - 빌드 시 main.go 파일 컴파일 실행: go build -o /root/mainapp /root/main.go - 이미지 실행 시 수행할 명령: /root/mainapp main.go 파일 내용 package main import "fmt" func main() { fmt.Println("hello world") } A: 1. mkdir 0511-2 && cd 0511-2 2. vi main.go 내용 붙여넣기 3. vi Dockerfile FROM golang COPY main.go /root RUN go build -o /root/mainapp /root/main.go CMD ["/root/mainapp"] 4. 이미지 빌드 docker image build -t prac2:1.0 . 5. 결과 확인 docker run prac2:1.0 강사님답안 FROM golang WORKDIR /root COPY main.go . RUN go build -o mainapp main.go CMD ["./mainapp"] > golang 이미지 때문에 용량이 너무커짐 (964MB) FROM golang WORKDIR /root COPY main.go . RUN go build -o mainapp main.go FROM alpine WORKDIR /root COPY --from=0 /root/mainapp . CMD ["./mainapp"] > --from=0 도커파일내 가장윗부분에서(0번째 from) 가져와라 FROM golang as builder WORKDIR /root COPY main.go . RUN go build -o mainapp main.go FROM alpine WORKDIR /root COPY --from=builder /root/mainapp . CMD ["./mainapp"] > 명칭만 통일하면 굳이 builder라고 안쓰고 막 as abbbbbb로 해도 작동가능 ``` 멀티스테이지 빌드(Multi-Stage Build) 이미지 작성 중 바이너리 파일을 빌드하는 등의 과정이 필요할 때, 최종 결과물로 필요한 것은 컴파일 된 바이너리 파일만 필요한 경우가 많으므로, 빌드에 사용되는 컨테이너를 임시로 생성하여 컴파일을 수행하고, 최종 빌드할 이미지는 컨테이너로부터 컴파일 된 파일만을 가져와서 실행하도록 빌드

Categories:

Updated:

Leave a comment