✅ Dockerfile
Docker 이미지는 DockerHub을 통해 다운 받을 수 있다
하지만 이 Docker 이미지들은 누군가가 만들어서 DockerHub에 올려놓은 것이다
Docker 이미지를 만드는 방법으로 Dockerfile
이 있다
✅ FROM : 베이스 이미지 생성
쉽게 이야기하면 윈도우 컴퓨터를 새로 구매하면 기본 프로그램들(인터넷, 그림판, 메모장) 등이 설치되있는데, 컨테이너도 미니 컴퓨팅 환경을 구성할 때 기본 프로그램이 어떤게 깔려있으면 좋겠는지 선택하는 옵션
이라고 생각하면 된다
EX) JDK 가 깔려있는 환경, Node가 깔려있는 환경 -> 필요에 따라 베이스 이미지를 고르기
사용 방법
FROM [이미지명]
FROM [이미지명]:[태그명]
EX) FROM openjdk:17-jdk
✅ Dockerfile
을 기반으로 이미지 만들기
docker build -t 이미지명:tag이름 경로
docker run -d my-jdk17-server .
-> .
은 현재경로를 나타냄Docketfile을 기반으로 이미지를 만들었으면 컨테이너를 뛰운다 -> docker run -d my-jdk-server
그 후 컨테이너를 조회했을때, 만약 컨테이너가 종료되어있으면 내부적으로 필요한
명령을 다 수행하면 컨테이너가 자동으로 종료되었다는 의미이다
✅ 종료된 컨테이너에 들어가서 디버깅하는 방법
기존에 컨테이너를 디버깅하기 위해서는 두개의 방법이 있다
docker logs
를 활용해 컨테이너 로그를 확인하는 방법과
docker exec -it
를 활용해 컨테이너 내부에 직접 들어가는 방법이 있다
하지만 로그에 문제가 따로 없거나, 컨테이너가 실행되지 않는 상태에서는 내부에 들어갈 수 없다
그럴 때는 Dockerfile
에 명령어를 추가해서 컨테이너가 바로 죵로되는것을 막을 수 있다
FROM openjdk:17-jdk
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어
결국 500초동안 시스템을 일시정지 시키는 작업이 있기때문에 컨테이너는 종료되지 않는다
그 후 docker exec -it
명령어로 컨테이너 내부에 접속할 수 있다
✅ ENTRYPOINT
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
✅ RUN
RUN npm install
✅ COPY
: 파일복사
COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [ [컨테이너에서 파일이 위치할 경로]
COPY app.txt /app.txt
: 호스트 컴퓨터 안의 app.txt 파일을 컨테이너에 app.txt 명칭으로 복사COPY *.txt /text-files/
: 모든 파일들을 컨테이너의 text-files 폴더를 만들고 그 안에 복사폴더를 의미할 경우 항상 /로 시작해서 /로 끝나야함
만약 특정 파일이나 폴더를 COPY
하고 싶지 않을 경우 .dockerignore
파일을 만든 후
그 파일안에 제외할 파일이나 폴더명을 적는다 -> ex) readme.txt
✅ WORKDIR
WORKDIR
를 설정하면, 이후 명령어는 모두 해당 디렉토리 기준으로 실행됨WORKDIR [작업 디렉토리로 사용할 절대 경로]
WORKDIR /usr/src/app
WORKDIR 경로 입력 후 COPY 명령어로 복사를 해주면
만들어진 컨테이너에서 보면 my-dird 폴더 안에 복사한 파일들이 일괄 들어가 있는것을 볼 수 있다
!! 순서 중요 -> COPY 후 WORKDIR 하면 복사를 먼저해서 my-dird 안에 복사가 되지 않음
✅ EXPOSE
docker run -p 8080:8080
과 같이 실제 포트를 바인딩하는 역할이 아님EXPOSE [포트 번호]
EXPOSE 3000