도커 파일
: 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경 변수 설정 등을 기록한 파일
: 공식 허브에서 이미지를 받아서 컨테이너에서 작업 후 이미지로 커밋하는 것 보다 더 안정적
=> 명확한 패키지 설치
=> 이미지 생성의 자동화
=> 쉬운 배포
도커 파일 작성
: 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
'Container > Docker' 카테고리의 다른 글
리눅스 Docker 설치부터 컨테이너 생성 및 실행까지 (0) | 2021.09.02 |
---|---|
도커 데몬 (0) | 2021.08.30 |
도커 이미지 생성 (0) | 2021.08.27 |
[도커] 컨테이너와 자원 (0) | 2021.08.24 |
도커 컨테이너 로깅 (0) | 2021.08.24 |