320x100
320x100

도커 파일

: 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경 변수 설정 등을 기록한 파일

: 공식 허브에서 이미지를 받아서 컨테이너에서 작업 후 이미지로 커밋하는 것 보다 더 안정적

=> 명확한 패키지 설치

=> 이미지 생성의 자동화

=> 쉬운 배포

 

 

 

도커 파일 작성

: VSCode에서 Docker 확장도구 설치

: 파일명은 Dockerfile

# 1. CentOS 설치
FROM CentOS

# 2. 메타데이터 표시
LABEL "purpose"="practice"

# 3. 명령어 실행
RUN apt-get update

# 4. 호스트OS에 있는 파일을 이미지에 추가
ADD test.html /var/www/html

# 5. 작업 디렉터리 이동(=cd)
WORKDIR /var/www/html

# 6. 작업 디렉터리에서 test2.html 파일생성
RUN ["/bin/bash", "-c", "echo hello > test2.html"]

# 7. 포트 80번 노출 지정
EXPOSE 80

# 8. 컨테이너 생성시 실행되는 시작 명령어
CMD apachectl -DFOREGROUND

 

 

 

도커파일 속성 

ㆍFROM

: 생성할 이미지 파일의 베이스가 될 이미지 파일 (주로 OS이미지 파일을 지정 / 때에 따라 다른 이미지도 지정)

: 반드시 한 번 이상 작성

 

ㆍLABEL

: key-value 형식의 레이블 지정

: docker inspect 명령어에서 확인 가능

 

ㆍRUN

: 실행할 명령어 (쉘 커맨드)를 설정

: 별도의 입력이 불가하기 때문에 -y 옵션을 반드시 설정

 

ㆍCMD

: 컨테이너가 실행될 때마다 실행할 명령어

: 도커 파일에서 한 번만 실행 가능

 

ㆍADD

: 도커 파일이 존재하는 디렉터리에 있는 파일을 이미지 내부의 디렉터리에 추가

: 디렉터리 추가의 경우 끝에 /을 추가해야함

: 추가하려는 파일이 tar 파일이면 도커가 자동으로 압축을 풀어서 추가함

: 이미지에 추가하려는 파일이 이미 이미지 안에 추가되있는 상태의 경우 덮어쓰기 하지 않음

: 호스트OS에 /home/ec2/doc 디렉터리에 test.html과 도커 파일이 존재할경우 

 도커파일에 ADD test.html /var/www/html/ 라고 작성하면

 test.html 파일이 이미지 내 /var/www/html/ 디렉터리에 복사 됨

  

ㆍWORKDIR

: 명령어를 실행할 디렉터리 (cd 명령어와 동일)

 

ㆍEXPOSE

: 컨테이너 실행 시 외부에 노출시킬 포트 번호 지정

 

ㆍENV

: 환경 변수 지정

 

ㆍCOPY 

: ADD와 기본적으로 동일하나 URL지정이 불가하며 압축파일을 자동으로 풀어주지 않음

 

ㆍENTRYPOINT

: 도커 이미지가 실행될 때 실행할 명령어 지정

: 오버라이드가 가능한 CMD와 달리 오버라이드가 불가

: docker run으로 추가하는 명령어들이 실행되는 방식

 

ㆍVOLUME

: 호스트os의 디렉터리를 컨테이너에 연결

: 컨테이너에서 호스트os의 디렉터리의 파일을 읽거나 쓸 수 있음

: 보통 로그 기록에 쓰임

 

ㆍUSER

: 도커 이미지를 실행할 사용자 설정 (uid / gid도 설정 가능)

 

ㆍARG

: docker build 명령어로 이미지를 빌드할때 설정할 수 있는 옵션 지정

: 도커 이미지에 그대로 내용이 남기 때문에 민감한 정보는 저장하지 않는 것을 권장

 

ㆍSHELL

: 디폴트로 지정되어 있는 쉘 타입 변경 

: 디폴트 쉘은 ["/bin/sh," "-c"]

 

ㆍONBUILD

: 이미지 다른 빌드(이미지)의 기반으로 사용될때 나중에 실행될 트리거 명령어를 도커 이미지에 추가

: 이 도커파일이 이미지로 빌드되고 나서 다른 이미지의 기반 이미지가 되었을때 실행되는 명령어

 

ㆍSTOPSIGNAL

: docker container stop 명령어 실행시 컨테이너 전송할 signal을 설정

: docker container stop 실행시 기본적으로 컨테이너에 SIGTERM signal이 전송됨

 

ㆍHEALTHCHECK

: 컨테이너의 프로세스 상태 체크

: HEALTHCHECK [옵션] 명령어 를 입력하면 컨테이너 내부에서 명령어를 실행하여 컨테이너 상태를 확인

 

 

 

 

도커 파일 빌드

: docker build -t 이미지_파일명 도커파일이_저장된_경로

: -t = 생성될 이미지 파일의 이름 

: 빌드 컨텍스트를 읽기 때문에 루트 디렉터리에서 빌드하지 않도록 주의

ex) docker build -t mohaemookji:0.0 ./

: 현재 디렉터리에 있는 도커파일을 mohaemookji:0.0 라는 이름으로 빌드

 

 

 

도커 파일의 빌드 과정

: 컨테이너 생성 > 명령어 실행 > 레이어 생성 > 이미지로 커밋 과정을 반복

: ADD 혹은 RUN 등의 명령이 실행될 때마다 새로운 컨테이너가 하나씩 생성되며 이를 이미지로 커밋

 (Removing ~ Container 과정이 뜨는 이유)

 

 

 

캐시를 이용한 빌드

: 한 번 이미지 빌드를 마치고 난 뒤, 다시 같은 빌드를 진행하면 이전 빌드에서 사용했던 캐시를 사용하여 빌드 진행 

: Using Cache라는 내용이 출력되면서 빌드 과정이 진행되지 않고 이미지 생성

: git clone과 같이 내용변화에 대한 기록이 필요한 경우 캐시기능이 방해가 될 수 있어

 --no-cache 옵션을 사용할 것

 

 

 

멀티 스테이지를 이용한 빌드

: 애플리케이션을 빌드할 때 의존성을 해소하고 이미지 자체 용량을 줄이기  위한 빌드 방법

: 여러개의 FROM 명령어를 사용하여 모듈식으로 빌드

# go 파일을 열기 위해 공식 이미지인 golang을 포함
FROM golang

# /root 디렉터리에 있는 go파일을 이미지에 추가
ADD main.go /root

# 작업 디렉터리를 /root로 변경
WORKDIR /root

# main.go 파일을 mainApp이라는 이름으로 빌드
RUN go build -o /root/mainApp /root/main.go


# alpine = 컨테이너용 운영체제
# :latest = 최신버전
FROM alpine:latest

# 작업 디렉터리를 /root으로 변경
WORKDIR /root

# --from=0 => 1번~11번 라인에서 만든 mainApp파일을 alpine:latest 이미지에 복사
COPY --from=0 /root/mainApp .

# 컨테이너 실행시 마다 mainApp 실행
CMD ["./mainApp"]

 

 

※ alpine linux

: 보안성을 목적으로 개발한 가볍고 간단한 리눅스 배포판

: 용량을 줄이기 위해 시스템의 기본 C런타임을 glibc 대신 musl libc를 채택

: 쉘 명령어는 GNU util 대신 busybox 탑재

: 80MB 용량의 경량화된 배포판으로 임베디드나 네트웍 서버 등 특정 용도에 적합

: 특히 도커에 채택되어 5M 크기의 리눅스 이미지로 유명함

=> docker pull alpine 필요

 

 

 

 

 

 

 

 

Refference

 

[Docker] 처음하는 사람도 쉽게 Docker file 만들고 build 해보기

최근에 docker로 image를 만들 일이 있어서 해보고 있는 중이다. docker에 대한 기초적인 것도 모르기 때문에 경험 위주로 하였으니, 다른 글도 참고 바람. build  options --no-cache : 이전에 했던 캐쉬를

data-newbie.tistory.com

 

10장. 도커파일(Dockerfile)

이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)이미지 출처 : https://data-newbie.tistory.com/516지

velog.io

 

도커 파일 가이드라인

도커 파일을 생성함에 있어서 가이드라인이 필요하다고 생각하여 작성하여 공유를 합니다.

danawalab.github.io

 

알파인 리눅스(Alpine Linux)

 

www.lesstif.com

 

300x250
728x90

'Container > Docker' 카테고리의 다른 글

리눅스 Docker 설치부터 컨테이너 생성 및 실행까지  (0) 2021.09.02
도커 데몬  (0) 2021.08.30
도커 이미지 생성  (0) 2021.08.27
[도커] 컨테이너와 자원  (0) 2021.08.24
도커 컨테이너 로깅  (0) 2021.08.24