본문 바로가기
Docker

6. 도커 파일 -(1)

by shulk 2024. 11. 15.

1.도커 파일이란?

도커 이미지는 도커허브를 통해 다운 받는건데,이 이미지도 누군가 말들어서 도커 허브에 올려둔거다.

그래서 도커파일을 이용해서 이미지를 만들 수 있다.

이거를 사용하는 이유는 도커 허브에 있는 이미지를 말고 나만의 이미지를 만들고 싶을때 있다. 예를들어 도커파일로 스프링 부트 프로젝트 자체를 이미지로 만들고 이미지를 만들 수 있다.

 

2.FROM: 베이스 이미지 생성

(1) 개념

FROM은 베이스 이미지를 생성하는 역활을 하는데,도커 컨테이너에 특정 초기 이미지 셋팅 할 수 있는걸 말한다.

쉽게 말하자면 컴퓨터 새로 사면 인터넷,그림판,메모장등 많이 깔려있는데 이거랑 같다. 즉 누구는 스프링 프로젝트때문에 JDK 깔려있는 셋팅 바랄수도 있고 누구는 노드프로젝트 때문에 Node가 깔려있는 셋팅 바랄수도 있으니 필요에 따라 베이스 이미지 선택하면 된다.

# 사용 방법 명령어
FROM [이미지명]
FROM [이미지명]:[버전]:[태그명]  # 버전 생략하면 최신버전이고,태그명은 사용하던 말던 맘대로

 

(2) 베이스 이미지 생성하기

먼저 베이스 이미지 전용 폴더 원하는곳에 생성후 원하는 IDE로 해당 폴더 들어가서 이름을 꼭 Dockerfile 파일 생성한다.

그리고 예시로 JDK  17버전 베이스 이미지 만들어보려한다

FROM openjdk:17-jdk

 

이제 도커파일로 이미지를 만들어볼건데 -t는 내가 설정할 이미지 이름이고, 무조건 베이스 이미지 만드는 경로 들어와서 하고, ' . ' 상대 경로를 적어준다.

# docker build -t [생성할 이미지 이름] .
docker build -t my-jdk17-serber .

 

이렇게 태그명을 적고 확인해보면 정상적으로 나온다.

 

(3) 종료된 컨테이너 내부 접속하고 싶을때

방금 만든거로 이렇게 실행 해봤는데 종료되어 있다. 이유는 도커 컨테이너 내부에 자기가 해야할일 끝나고 이제 할일이 없으면 자동으로 종료시켜서 그렇다.

그러니 저건 DB서버처럼 계속 실행시키는게 아닌 오직 다운만 받고 끝나서 그런듯.

 

근데 이게 잘 설치됬나 확인하고 싶은데 컨테이너가 종료되어 있으니 내부 접속도 못하는데 어떻게 확인할까?

ENTRYPOINT ["/bin/bash","-c","sleep 원하는시간"]

이렇게 도커파일에 이거를 추가하면 sleep 에 적힌 시간동안 시스템을 일시 정지 시켜서 컨이너가 종료되는걸 막을 수 있다. 종료되는걸 막으니 내부 접속도 가능한거다.(이거에 대한건 밑에 최상위 3번 설명 참고)

저거를 추가하고 다시 빌드후 런 을 해줘야한다!! 이후 확인해보니 내부 접속도 되고,잘 깔려있다.

 

2.COPY : 파일복사(이동)

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

예시 부분에 첫번째 app.txt에는 슬래시가 없다. 이유는 현재 호스트 컴퓨터에 있는 파일인데 지금 이 경로에 있으니 상대경로로 적어준거다. 슬래시가 있냐 없냐에 따라 상대경로,절대경로

두번째 app.txt에는 슬래시가 있는데 컨테이너에는 절대경로로 적어야한다!

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

# 예시
COPY app.txt /app.txt

 

(1) 파일 복사

이번엔 우분투 베이스 이미지 생성 하고 호스트 컴퓨터 app.txt에 있는거를 컨테이너에 복사하는데 내부 접속해서 확인해보면 있다. 

 

(2) 폴더 복사

강의에 나온대로 이번엔 파일이 아닌 폴더일때는 컨테이너 경로적을땐 마지막에 슬래시 추가해줘야한다! 

 

(3) 여러 파일 동시에 복사 하면서 컨터네이너에 원하는 경로에 복사

호스트 컴퓨터에 txt 파일을 다 선택하고 싶을땐 저렇게 *.확장자  적고 컨테이너에 txt-files 라는 폴더에 저장하고 싶다할때 저렇게 한다. ( 컨테이너에 txt-files 폴더가 생성되면서 그안에 모든 txt 파일 복사된다)

 

(4) 원하지 않는 복사 안되도록 하기

특정 파일 또는 폴더만 COPY를 하고 싶지 않을 수 있다. 그럴 때 .dockerignore를 활용한다. 

Copy에 적힌부분 보면 현재 디렉토리(./)에 있는 모든 파일과 폴더를 Docker 컨테이너의 루트 디렉토리(/)로 복사한다는 의미이다.

이렇게 하고 확인해보면 컨테이너에는 readme.txt 파일이 복사 안되어 있다.

 

3. ENTRYPOINT

ENTRYPOINT란 컨테이너가 생성되고 제일 먼저 수행되는 명령어를 뜻한다.

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

# 예시
ENTRYPOINT ["node", "dist/main.js"]

 

밑에 사진은 이거를 예시로한 결과다. 이거는 리눅스 명령어에 출력하라는거라서 my-server2 생성되고 실행순간 저거를 출력하고 이제 종료됬는데,로그를 확인해보니 정상 출력한게 보인다.

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

'Docker' 카테고리의 다른 글

8. 도커 컴포즈 -(1)  (0) 2024.11.18
7. 도커파일 -(2)  (0) 2024.11.15
5. 도커 볼륨 -(2)  (0) 2024.11.14
4. 도커 볼륨 -(1)  (0) 2024.11.14
3. 도커의 명령어 -(2)  (0) 2024.11.13