#wannabeeeeeee the best DataScientist
Docker File 본문
✅ 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를 활용하여 내부에 제외 파일 작성
💡COPY 실습
✅ 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
✅ EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기
EXPOSE는 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는 지를 문서화하는 역할만 한다. docker -p 8080:8080 … 와 같은 명령어의 -p 옵션과 같은 역할은 일체 하지 않는다. 쉽게 표현하자면 EXPOSE 명령어는 쓰나 안 쓰나 작동하는 방식에는 영향을 미치지 않는다.
# 문법
EXPOSE [포트 번호]
# 예시
EXPOSE 3000
'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 |