반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 컨테이너
- 리눅스
- 클라우드
- boj
- Python
- ios
- centOS
- k8s
- swift 클로저
- 운영체제
- devops
- 도커 이미지
- 네트워크
- C++
- AWS
- NGINX
- os
- 부스트코스
- 도커
- 데브옵스
- 프로세스
- centOS7
- 쿠버네티스
- 인프라
- docker
- 도커 명령어
- Swift
- 도커 컨테이너
- linux
- kubernetes
Archives
- Today
- Total
귀염둥이의 메모
[Docker] Dockerfile 작성, build, 이미지 레이어 본문
반응형
Dockerfile 이란?
- Docker에서는 인프라 구성을 기술한 파일을 Dockerfile이라고 한다.
- Docker 이미지를 작성하기 위해서는 다음과 같은 내용들이 필요하다.
- 베이스가 될 Docker 이미지
- Docker 컨테이너 안에서 수행한 조작(명령)
- 환경변수 등의 설정
- Docker 컨테이너 안에서 작동시켜둘 데몬 실행
- docker build 명령으로 Dockerfile에 기술된 구성 정보를 바탕으로 Docker 이미지를 작성한다.
Dockerfile 기본 구문
Dockerfile은 텍스트 형식의 파일로, 에디터 등을 사용하여 작성한다. 확장자는 필요 없고, 'Dockerfile' 이라는 이름의 파일에 인프라 구성 정보를 작성한다. Dockerfile 이외의 파일로 이미지를 작성할 시 이미지를 빌드할 때 파일명을 명시적으로 지정해야 함.
주요 명령
명령 | 설명 |
FROM | 베이스 이미지 지정 |
RUN | 명령 실행 (이미지 생성할 때 실행) |
CMD | 컨테이너 실행 명령 (생성된 컨테이너 안에서 명령을 실행) |
LABEL | 라벨 설정 |
EXPOSE | 포트 익스포트 |
ENV | 환경변수 |
ADD | 파일/디렉토리 추가 |
COPY | 파일 복사 |
ENTRYPOINT | 컨테이너 실행 명령 |
VOLUME | 볼륨 마운트 |
USER | 사용자 지정 |
WORKDIR | 작업 디렉토리 |
ARG | Dockerfile 안의 변수 |
ONBUILD | 빌드 완료 후 실행되는 명령 |
STOPSIGNAL | 시스템 콜 시그널 설정 |
HEALTHCHECK | 컨테이너의 헬스체크 |
SHELL | 기본 쉘 설정 |
Dockerfile로부터 Docker 이미지 생성 (docker build)
docker build -t [생성할 이미지명]:[태그명] [Dockerfile의 위치]
예시
- Dockerfile 작성
vi Dockerfile
# 베이스 이미지 설정
FROM centos:latest
- 작성한 Dockerfile로부터 myimage이라는 이미지 작성하기
cd [Dockerfile 위치]
docker build -t myimage .
- build 실행 결과, 이미지 확인
- centos와 myimage의 IMAGE ID가 똑같음
- 각각 다른 이름이지만 실체는 모두 동일한 이미지
Dockerfile 이미지의 레이어 구조
- Dockerfile을 빌드하여 Docker 이미지를 작성하면 Dockerfile 명령 별로 이미지를 작성한다.
- 작성된 여러 개의 이미지는 레이어 구조로 되어 있다.
- Dockerfile 작성 & index.html 생성
$ vi Dockerfile
# STEP: 1 Ubuntu (베이스 이미지)
FROM ubuntu:latest
# STEP: 2 Nginx 설치
RUN apt-get update && apt-get intstall -y -q nginx
# STEP: 3 파일복사
COPY index.html /usr/share/nginx/html/
# STEP: 4 Nginx 시작
CMD ["nginx", "-g", "daemon off;"]
----------------------------------------------------
$ cat > index.html
Hello World Dockerfile!
- 빌드하기
docker build -t webap .
만든 이미지와 베이스 이미지 비교
- ubuntu:latest
- webap
Dockerfile 내용 수정 후 다시 빌드하기
$ vi Dockerfile
# STEP: 1 Ubuntu (베이스 이미지)
FROM ubuntu:latest
# STEP: 2 Nginx 설치
RUN apt-get update && apt-get intstall -y -q nginx
# STEP: 3 파일복사
COPY index.html /usr/share/nginx/html/
# STEP: 3.1 파일 복사 2 ✅ 추가한 내용
COPY index2.html /usr/share/nginx/html/
# STEP: 4 Nginx 시작
CMD ["nginx", "-g", "daemon off;"]
----------------------------------------------------
$ cat > index.html
Hello World Dockerfile!
$ docker build -t webap2 . ✅ 빌드하기
- Using cache : 이미지를 재이용하고 있음
- webap2
- webap에서 레이어 1개가 더 늘어났음
docker build 시 로그를 보면 Dockerfile 명령어 한 줄마다 이미지(Layer)가 작성되는 것을 알 수 있다. (Step 1/5 ~ 5/5)
또한 중간에 컨테이너가 생성되었다가 삭제되는 것을 확인할 수 있는데, 이는 Docker에서 이미지 레이어를 생성할 때 컨테이너를 임시로 생성하고, 명령어를 실행한 뒤 해당 컨테이너를 통하여 이미지를 작성 후 컨테이너를 삭제하는 것을 알 수 있다.
또한, 작성한 이미지는 다른 이미지와도 공유된다. 예를 들어 공통의 베이스 이미지를 바탕으로 여러 개의 이미지를 작성한 경우, 베이스 이미지의 레이어가 공유된다. 이와 같이 이미지를 겹침으로써 Docker에서는 디스크의 용량을 효율적으로 이용한다.
<참고자료>
'완벽한 IT 인프라 구축을 위한 Docker 2판'
https://kimjingo.tistory.com/62
반응형
'Infra & Devops > Docker' 카테고리의 다른 글
[Docker] 도커 이미지 생성 (commit, export/import, save/load) (0) | 2021.09.18 |
---|---|
[Docker] 컨테이너 시작 환경을 지정하기 (0) | 2021.09.17 |
[Docker] bind mount, volume, tmpfs 적용하기 (0) | 2021.09.17 |
[Docker] 도커의 볼륨 유형 (bind mount, volume, tmpfs) (0) | 2021.09.17 |
[Docker] 자원을 지정하여 컨테이너 생성 및 실행 (0) | 2021.09.17 |
Comments