#wannabeeeeeee the best DataScientist

Docker File 본문

Data scientist/Docker

Docker File

맨사설 2025. 5. 7. 22:13
728x90

Dockerfile이란?

Docker 이미지는 Dockerhub을 통해 다운받아서 사용할 수 있다. 이 Docker 이미지들도 누군가 만들어서 Dockerhub에 올려놓은 것이다. Dcoker 이미지는 어떻게 만드는 걸까?

 

  Dockerfile이란는 걸 활용해서 Docker 이미지를 자체적으로 만들 수 있다.

베이스 이미지 생성(FROM)

FROM은 베이스 이미지를 생성하는 역할을 한다. Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 셋팅을 할 수 있다. 여기서 얘기한 ‘특정 초기 이미지’가 곧 베이스 이미지이다.

 

컨테이너를 새로 띄워서 미니 컴퓨터 환경을 구축할 때 기본 프로그램이 어떤게 깔려있으면 좋겠는 지 선택하는 옵션이라고 생각하면 된다.

 

1. Dockerfile 만들기

# 사용법(문법)
FROM [이미지명]
FROM [이미지명]:[태그명]

예시 이미지

2. Dockerfile을 기반으로 이미지 만들기

# Dockerfile로 이미지(Image) 생성하는 문법
docker build -t my-jdk17-server .

# 이미지를 기반으로 컨테이너 띄우기
docker run -d my-jdk17-server

docker ps -a # 확인해보니 컨테이너가 종료되어 있다.

 Docker의 컨테이너는 내부적으로 필요한 명령을 다 수행하면 컨테이너가 저절로 종료된다.

 

3. 컨테이너 내부로 들어가서 jdk가 잘 깔렸는지 확인해보기

  • docker logs를 활용해 컨테이너 로그 확인하기
  • docker exec -it를 활용해 컨테이너 내부에 직접 들어가보기

docker exec -it은 실행 중인 컨테이너에만 쓸 수 있는 명령어이다. 종료된 컨테이너는 아래와 같은 에러가 발생한다.

 

해결 방법

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어

위 명령어를 추가함으로써 컨테이너가 바로 종료되는 걸 막을 수 있다. 그런 뒤에 docker exec -it를 활용해 컨테이너 내부에 직접 들어가서 디버깅을 하면 된다.

COPY : 파일 복사(이동)

COPY호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달한다.

# (문법)COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너에서 파일이 위치할 경로]
FROM ubuntu

# 파일 복사해보기
COPY app.txt /app.txt

# 폴더 안에 있는 모든 파일들 복사
COPY my-app /my-app/ # 파일 복사 시 "/" 추가 필요

# 와일드 카드 사용해보기
COPY *.txt /text-files/

# 모든 파일 복사
COPY ./ /

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드

✔ 특정 파일 또는 폴더만 COPY를 하고 싶지 않을 수 있다. 그럴 때 .dockerignore를 활용하여 내부에 제외 파일 작성

.dockerignore 예시

 

💡COPY 실습

이미지 생성
이미지 리스트 확인 > 도커 실행 > app.txt 복사 확인

ENTRYPOINT : 컨테이너가 시작할 때 실행되는 명령어

ENTRYPOINT는 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 뜻한다.

쉽게 설명하자면 ENTRYPOINT에는 미니 컴퓨터의 전원을 키고나서 실행시키고 싶은 명령어를 적으면 된다.

# 문법
ENTRYPOINT [명령문...]

# 예시(리눅스 명령어 사용)
FROM ubuntu

ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행

RUN은 이미지 생성 과정에서 명령어를 실행시켜야 할 때 사용한다.

# 문법
RUN [명령문]

# 예시
RUN npm install # 예시 1
RUN apt update && apt install -y git # 예시 2

💡 RUN vs ENTRYPOINT

RUN 명령어와 ENTRYPOINT 명령어가 헷갈릴 때가 있다. 둘 다 같이 명령어를 실행시키기 때문이다. 하지만 엄연히 둘의 사용 용도는 다르다.

RUN은 ‘이미지 생성 과정’에서 필요한 명령어를 실행시킬 때 사용하고, ENTRYPOINT는 생성된 이미지를 기반으로 컨테이너를 생성한 직후에 명령어를 실행시킬 때 사용한다.

✅ WORKDIR : 작업 디렉토리를 지정

WORKDIR이후의 RUN, CMD, ENTRYPOINT, COPY, ADD 명령의 기준 경로를 설정한다. 컨테이너 내부 폴더를 정리해 관리하기 쉽게 하며, 사용하지 않으면 파일들이 루트 경로에 뒤섞여 복잡해질 있다.

# 문법
WORKDIR [작업 디렉토리로 사용할 절대 경로]

# 예시
WORKDIR /usr/src/app

my-file이라는 경로에 복사 파일 모두 저장(기존 존재 파일과 섞이지 않는다)

EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기

EXPOSE는 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는 지를 문서화하는 역할만 한다. docker -p 8080:8080 … 와 같은 명령어의 -p 옵션과 같은 역할은 일체 하지 않는다. 쉽게 표현하자면 EXPOSE 명령어는 쓰나 안 쓰나 작동하는 방식에는 영향을 미치지 않는다.

# 문법
EXPOSE [포트 번호]

# 예시
EXPOSE 3000

 

728x90

'Data scientist > Docker' 카테고리의 다른 글

Docker Compose  (0) 2025.05.11
Docker 실습(2)  (1) 2025.05.06
Docker 실습(1)  (0) 2025.05.04
Docker 기본 개념  (0) 2025.05.04