Dockerfile (이미지)관리 명령어 정리

0

TIL

목록 보기
187/195


1. FROM : 보통 Docker Hub에서 이미지를 다운받아오는데, 만약 내가 이미지를 만들어보고싶다면?

+ 인텔리제이를 사용해도되는데, 나는 JetBrains에서 지원하는 WebStorm을 사용해보기로했다.
WebStorm은 JavaScript/TypeScript, HTML, CSS 등 프론트엔드 및 풀스택 웹 개발에 사용되는 프로그램으로 VS Code와 비슷하지만 내가 주로 사용하는 JetBrains이기 때문에 선택했고,
무엇보다도 원래는 유료지원이지만 비상업용 목적이라면 1년간 무료로 사용이 가능하다.

WebStorm 프로그램으로 Dockerfile이라는 파일 형식을 생성한다.

# Dockerfile
FROM openjdk:17-jdk

터미널을 이용해 현제 Dockerfile 파일이 위치한 경로로 들어간다.(Dockerfile로 들어가면 안됨)

# my-jdk-server 라는 이름으로 이미지 생성
# beta라는 이름의 tag를 붙인다.(생략하면 latest로 생성)
# 뒤에 붙은 . 은 상대경로를 나타낸다.
docker build -t my-jdk17-server:beta .

Tag를 생략한 것과 beta라고 지정한 것을 빌드하면 다음과 같이 생성된다.


이제 내가 생성한 이미지를 가지고 컨테이너를 띄워보자
docker run -d my-jdk17-server
그다음 docker ps로 확인해보면
컨테이너가 없다?!
-> 이미지로 컨테이너가 실행이 될 때 컨테이너가 해야할 작업이 완료된다면 컨테이너가 자동으로 종료되기 때문에 실행 후 바로 종료된 상태인것이다.

그러면 약간의 꼼수로 컨테이너가 실행되어도 바로 종료되지 않도록 이미지를 수정해보자.

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

이 때 이미지를 수정했으므로 다시 빌드를 진행해야한다.

이제 컨테이너를 실행해도 바로 중지되지 않으므로 내부에 들어갈 수 있다.



2. COPY : 호스트에 있는 이미지를 컨테이너에 복사(이동)하는 방법

테스트를 위해 복사할 app.txt 파일을 깜찍하게 만들어준다.

COPY [호스트에서 복사할 파일의 경로] [컨테이너의 파일이 위치할 경로]
FROM ubuntu

COPY app.txt /app.txt # 상대경로, /절대경로

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

이제 이미지를 빌드
docker build -t my-server .
컨테이너 실행
docker run -d my-server
컨테이너 내부로 접속해서
docker exec -it ~ bash
현재 경로의 파일들을 확인해보면(ls)

컨테이너 내부에 복사가 되어있다.


+ 만약 파일이 아니라 경로를 복사하고 싶다면

COPY my-app /my-app/

이처럼 뒤에 '/'를 붙여줘야 한다.


+ 만약 호스트 경로 내에 모든 .txt 파일들을 폴더 안에 복사하고 싶다면

COPY *.txt /text-files/

+ 만약 파일들을 복사를 할 때 포함되지 않았으면 하는 파일이 있다면
dockerignore 라는 파일을 생성하고 그 안에 포함되지 않았으면 하는 파일의 이름을 작성하기만 하면 된다.



3. ENTRYPOINT : 컨테이너가 생성된 직후에 수행하고싶은 명령어가 있다면

ENTRYPOINT ["리눅스형 명령문", "다른 명령문"]

위에 '500초 동안 시스템을 일시정지 시키는 명령어'와 동일하다.

FROM ubuntu # 우분투 이미지로 컨테이너를 만들고 실행시킬 때

ENTRYPOINT ["/bin/bash", "-c", "echo hello"] # 'hollo' 라는 단어를 입력해달라

이미지 빌드와 컨테이너를 실행시킨 뒤 로그를 확인해보면

로그로 출력되는 것을 확인할 수 있다.



4. RUN : 이미지를 생성 과정에서 수행하고싶은 명령어가 있다면

RUN [명령문]

만약 ubuntu 라는 환경에 git이 다운받아져 있기를 원할 때
-> 내가 원하는 만들어져있는 이미지가 없을 수 있다.

FROM ubuntu # ubuntu 환경에
RUN apt update && apt install -y git # git을 설치하고 이미지를 생성하라
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]


5. WORKDIR : RUN, CMD, ENTRYPOINT 등 명령어들을 지정한 디렉터리 기준으로 실행하고 싶을 경우

Dockerfile을 통해 생성되는 파일들을 특정 폴더에 정리하는 것이 관리하기 용이하기 때문에 사용한다.

WORKDIR [작업 디렉터리로 사용할 절대 경로]

실습을 위해 새로운 경로를 만들고 WebStorm으로 실행 후 테스트 파일들을 만든다.

이미지를 만들기 위해 빌드를 하고
docker build -t my-server .
컨테이너를 실행한다.
docker run -d my-server

컨테이너에 들어가서 파일들의 목록을 확인해보면

이처럼 내가 복사해온 파일이 무엇인지 확인하기가 어렵다.


이제 디렉터리 경로를 지정하고 다시 확인해보자

FROM ubuntu

WORKDIR /my-dir

COPY ./ ./

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]

이미지 빌드와 컨테이너 실행을 하고 컨테이너로 접속을 해보면

접속할 때부터 최초 경로가 my-dir로 들어와져있다.
COPY를 할 때 하나로 묶을 수 있다.



6. EXPOSE : 컨테이너 내부에서 어떤 프로그램이 어떤 포트에서 실행되는지 문서화(기록)하고 싶을 때

EXPOSE [포트 번호]

없더라도 작동하는데에 어떠한 영향이 없다.

0개의 댓글