Docker File 사용하여 Docker image 만들기

2022. 7. 12. 14:28ETC/Server


Docker file 이해하기


내용출처 

https://velog.io/@ckstn0777/%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BCDockerfile

https://blog.d0ngd0nge.xyz/docker-dockerfile-write/

https://wooono.tistory.com/123

 

1. 도커파일 이해하기

01 Docker file

  • Docker image를 만들기 위한 설정 파일
  • 여러가지 명령어를 토대로 Docker file을 작성하면 설정된 내용대로 이미지 생성
  • Dockfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미

 

02 Dockerfile을 이용한 컨테이너 생성과 커밋

도커파일을 통한 이미지 빌드 과정을 보면 Removing~container가 있다.
그 이유는 ADD, RUN 등의 명령어 실행할때마다 새로운 컨테이너가 생성되며

이를 이미지로 커밋하기 때문.

 

[ 컨테이너생성 → 명령어 실행 → 레이어생성 → 이미지로 커밋 ] * 반복

 

한번 이미지 빌드를 마치고 난뒤 다시 같은 빌드를 진행할시 

같은 명령어를 만나게되므로, 이전의 이미지빌드에서 사용했던 캐시를 들고와 사용한다.

아래 사진을 보면, Using Cache 라는 출력내용이 나타나고 Removing~container 는 나타나지않았다.

이는 이전에 생성되었던 이미지 레이어를 활용해 이미지를 생성하는것이다.

 

단 캐시기능이 문제가 되는 경우가 있는데, git 처럼 소스코드가 변경되어있을수도 있는데

명령어문장이 같기 때문에 이전에 생성된 캐시값을 들고와서 최신버전이 반영안될수가 있다. 

이럴때는 --no-cache 옵션을 추가하여 캐시기능을 끄고 빌드가능하다.

$ docker build --no-cache -f Dockerfile2 -t mycahe:0.0 ./

 

 

03 Docker file 작성

  • Dockerfile을 작성할 땐 실제 파일의 이름을 Dockerfile로 해야함

05 Docker file 로 이미지 빌드하기

  • 이미지 빌드 명령어는 아래와 같음
# 기본 사용법
# -t 옵션은 [이미지이름:태그]를 부여하기 위함
docker build -t 이미지이름:태그 도커파일경로
--> 태그는 보통 버전관리를 위한 숫자를 사용한다.

# 예1
docker build -t test_script:v1 workspace/ 
--> 도커파일이 workspace 경로에 존재

# 예2
docker build -t test_script:0.1 .
--> 도커파일이 현재경로에 존재

 

 

05 Docker file 구문 및 옵션

  • FROM : 생성할 이미지의 베이스가 될 이미지를 지정 / 반드시 한번 이상 입력 필요
# <이미지 이름>:<태그>
FROM ubuntu:20.04
  • RUN : FROM 명령에서 설정한 베이스 이미지에 대해 실행하며, 패키지 설치 및 명령 실행에 사용
RUN apt-get update
RUN apt-get -y install python3-pip python3-dev
  • COPY / ADD : 호스트의 파일 또는 폴더를 이미지에 가져오는 것
    - ADD : 일반 파일 뿐만 아니라 압축파일이나 네트워크 상의 파일도 사용할 수 있다.
    - COPY : 일반적인 파일복사만 가능하다
COPY index.html /home/workspace # index 파일 복사
COPY . /home/workspace # 현재경로에 있는 파일 전부 복사
  • LABEL : 이미지에 메타데이터를 추가 (Key-Value 형태)
LABEL maintainer "changwoo <changwoo@gmail.com>"
LABEL title="TEST DOCKER"
LABEL version="0.1"
LABEL description="Docker Test Label"
# 생성된 컨테이너의 이미지 정보 확인

docker inspect --format="{{ .Config.Labels }}" 컨테이너명
  • WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성 
    - 작업디렉토리를 지정하면 이후 명령어는 해당 디렉토리를 기준으로 동작
WORKDIR /home/workspace
  • EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트를 의미
    - 호스트 머신과 컨테이너의 포트 매핑시 사용된다.
  • CMD/ENTRYPOINT : 빌드된 이미지로 만들어진 컨테이너를 생성, 실행할때 실행되는 명령어
    - docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 컨테이너를 시작할때 실행된다.
    - 보통 컨테이너 내부에서 항상 돌아가야하는 서버를 띄울때 사용한다.
    • CMD : docker run 실행 시, 추가적인 명령어에 따라 설정한 명령어를 수정하고자 할때 사용된다.
      CMD는 dockerfile에서 하나만 쓸수있다. (중복될경우 맨마지막꺼만 유효)
      • 사용 형태는 CMD command param1 param2
    • ENTRYPOINT : docker run 실행 시, 추가적인 명령어의 존재여부와 상관없이 무조건 실행된다.
      • 사용 형태는 ENTRYPOINT command param1 param2
# 사용 예
FROM ubuntu
ENTRYPOINT echo hello
CMD echo world

# 실행
docker run --name <컨테이너 명> <이미지 명>
>> hello world

docker run --name <컨테이너 명> <이미지 명> echo changwoo
>> hello changwoo

 

  • ENV : 이미지에서 사용할 환경변수값을 지정 (예: path)

2. 에러 다루기

01 도커 빌드시 발생하는 에러

  • error checking context: 'can't stat
    → 해결 : 새폴더 생성하여 도커파일과 사용할폴더(파일)를 넣고 다시빌드하기

 

 

'ETC > Server' 카테고리의 다른 글

Docker 부수기  (0) 2022.06.13