끄적/Docker

Docker 3 : 실습 2

uvumbu 2024. 12. 16. 15:32

이미지를 다운받아서 사용하는 방법은 이제 알았다.

그렇다면 우리가 Docker Image를 만들어보자.

 

1. Docker 파일 만들기

 

간단한 pytorch example 코드를 실행하는 Docker Image를 만들어보자.

 

새롭게 폴더를 만든 다음, 'poetry init', 'poetry add torch==2.1.0 torchvision==0.16.0'를 해주자.

(단순히 poetry add torch torchvision를 입력하면 버전 문제인지 오류가 생기더라.)

 

그리고 이제 Dockerfile파일을 만들어서 다음 양식에 맞게 작성하자.

 

FROM "이미지 이름: 태그"

이미지 빌드에 사용할 베이스 이미지를 지정하는 것이다.

이미지 빌드에는 항상 특정 이미지가 필요하다.

그래서 베이스 이미지를 지정해주는 것이다.

누가 만들어준 이미지를 기반으로 쌓아올린다고 생각하면 된다.

(처음부터 만들지 않고, 공개된 이미지를 기반으로 새로운 설정을 추가하는 것이다.)

 

COPY "로컬 디렉토일(파일)" "컨테이너 내 디렉토리(파일)"

로컬 디렉토리 파일을 컨테이너 내 디렉토리 파일에 복사하겠다는 것을 의미한다.

컨테이너도 자체적인 파일 시스템과 디렉토리를 가진다.

로컬 컴퓨터가 있고, 그 안에 컨테이너가 있는데, 각자 저장되는 파일 시스템이 다르게 있고, 그걸 맞추는게  Volume mount다.

 

그런데 도커 파일에서는 Copy를 할 수 있다. 

예시 : 'COPY . /app'

도커 파일을 실행하는 현재 폴더를 컨테이너에 앱으로 복사하겠다는 의미다.

파일을 컨테이너 안에서 사용하려면 Copy 명령어로 반드시 복사를 해야 한다.

그래야 컨테이너 안에도 파일이 있으니까.

 

현재 우리가 실행하는 위치는 로컬 디렉토리 호스트고 그걸 컨테이너 내부로 보낼 때 Copy를 사용하는거다.

 

WORKDIR "컨테이너 내 디렉토리"

예시: WORKDIR /app

Dockerfile의 RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 컨테이너의 경로를 지정하는 것이다.

때문에 이 다음에 나올 RUN, CMD는 컨테이너 내부의 /app에서 실행하는 것이다.

 

ENV "환경변수 이름 = 설정값"

예시 : ENV PYTHONPATH = /app

컨테이너 안에서 환경변수를 사용할 수 있다.

파이썬 애플리케이션에서는 다음의 두 값을 설정해두곤 한다.

ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1

 

 

RUN "실행할 리눅스 명령어"

컨테이너 내에서 리눅스 명령어를 실행하는 것이다.

(만약 명령어가 여러 개라면 '&& \' 로 연결해주자.)

명령어 하나하나를 레이어라고 부르며, 여러 레이어보다 하나에서 같이 처리하는게 도커 이미지 최적화에 더 좋다.

따라서 pip install의 경우 다음과 같이 처리하는 편이다.

RUN pip install AAA == n.n.n && \
    pip install BBB == m.n.m && \
    pip install CCC == m.m.m && \

 

CMD ["실행할 명령어", "인자"]

커맨드의 약자이다.

docker run으로 이미지를 기반으로 컨테이너 실행할 떄, 띄울 때, 어떤 명령어를 같이 실행할지를 의미한다.

예시 : 'CMD ["python", "main.py"]'

컨테이너 만들어짐과 동시에 python main.py를 실행하달라는 의미다.

 

 

2. Docker 빌드

Docker 파일을 만들었으니 빌드를 해야 한다.

 

docker build -t "빌드할 이미지 이름:태그 이름" "Dockerfile의 경로"

위 코드를 통해 빌드를 할 수 있다.

 

예시는 다음과 같다.

docker build -t docker-test:latest .

 

위 예시는 docker-test라는 이미지와 latest라는 태그, 그리고 현재 폴더에 있다는 의미의 '.'가 있다.

이렇게 하면 이미지가 빌드된다.

('.' : 현재 폴더를 의미한다.)

(태그를 지정하지 않을 경우 "latest"로 채워진다.)

 

 

 

3. 빌드를 마치고

빌드를 마치면 docker images 명령어로 방금 빌드한 이미지를 확인할 수 있다.

만든 이미지로 'docker run "이미지 이름:태그"'를 하면 띄워진다.

 

 

docker image 만들기 정리

  • 파이썬 환경 등에서 코드 작성
  • dockfile 작성
    • FROM으로 베이스 이미지 설정
    • COPY로 로컬 디렉토리 혹은 파일을 컨테이너 내부로 복사
    • WORKDIR로 RUN이나 CMD를 실행할 컨테이너 내 디렉토리 지정
    • RUN으로 애플리케이션 실행에 필요한 리눅스 명령어들 설정
    • CMD로 이미지 실행해서 컨테이너 만들 때 바로 실행할 명령어를 지정
  • docker build 로 이미지 빌드
  • docker run으로 이미지 실행

 

* 추가로 알아둘 dockerfile에서 사용하는 것!

 

EXPOSE

컨테이너 외부에 노출할 포트를 지정하는 것이다.

통신할 때, 로컬 호스트와 컨테이너가 있다고 하자.

docker run할 때 포트 3306:3306 했던 것들이 EXPOSE 명령어로 하는 것이다.

즉, 컨테이너 외부에 로컬과 통신할 수 있도록 지정해주는 것이다.

 

ENTRYPOINT 

이미지를 컨테이너로 띄울 떄 항상 실행하는 커맨드다.

 


EXTRYPOINT와 CMD의 차이는?

EXTRYPOINT ["python", "app.py"] -> 오버라이딩 불가능

CMD ["python", "app.py"] -> 오버라이딩 가능


 

 

 

 

 

 

 

'끄적 > Docker' 카테고리의 다른 글

Docker 2 : 실습  (2) 2024.12.16
Docker 1. 이론  (0) 2024.12.16