2022. 7. 12. 14:28ㆍETC/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
- CMD : docker run 실행 시, 추가적인 명령어에 따라 설정한 명령어를 수정하고자 할때 사용된다.
# 사용 예
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 |
---|