이미지를 빌드하는 동안 명령을 실행합니다. 패키지 설치나 설정 파일 수정 등의 작업에 사용됩니다.
ENV
이미지의 환경변수를 설정하기 위해 사용됩니다.
CMD
컨테이너가 시작될 때 실행할 기본 명령을 설정합니다.CMD는 Dockerfile에 한 번만 존재할 수 있습니다.
EXPOSE
실제로 포트 공개하는 것이 아닌, 어떤 포트를 공개될 예정인지에 대한 정보를 제공합니다.
COPY
로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다.
WORKDIR
작업 디렉토리를 변경합니다.
ENTRYPOINT
추후 작성 예정
Format
# Comment
INTROUCTION arguments
INTRODUCTION은 대문자를 구분하지 않지만, 일반적으로 인수와 쉽게 구별하기 위해 대문자로 작성하는 것이 관례입니다.
FROM
FROM 지시문은 새로운 빌드 단계를 초기화하고 이후 지시문에 대한 베이스 이미지를 설정합니다. 이미지는 유효한 이미지라면 어떤 것이든 사용할 수 있습니다.
FROM [--platform=<platform>] <image> [AS <name>]
## 예시
FROM python:3.12
다음 Dockerfile은 Python 3.12이미지를 빌드합니다.
ARG와 FROM를 이용해서 사용하기
ARG CODE_VERSION=latest
FROM python:${CODE_VERSION}
다음과 같이 작성해서 파이썬을 계속 최근 버전을 사용할 수 있도록 합니다.
RUN
RUN 지시문은 현재 이미지 위에 새로운 레이어를 생성하기 위해 명령을 실행합니다. 추가된 레이어는 Dockerfile의 다음 단계에서 사용됩니다. RUN은 두 가지 형태가 있습니다.
# Shell form:
RUN [OPTIONS] <command> ...
# Exec form:
RUN [OPTIONS] [ "<command>", ... ]
명령어를 여러 개를 사용할 때 다음과 같이 작성할 수 있습니다.
RUN <<EOF
apt-get update
apt-get install -y curl
EOF
## 또는
RUN apt-get update && apt-get install -y curl
ENV
ENV 지시문은 환경 변수 <key>를 <value> 값으로 설정합니다. 이 값은 빌드 단계의 모든 이후 지시문에서 환경에 포함되며, 많은 경우에 인라인으로 대체될 수도 있습니다. 값은 다른 환경 변수들을 위해 해석되므로, 이스케이프 처리되지 않은 경우 인용 부호는 제거됩니다.
ENV <key>=<value>
사용 예시는 다음과 같습니다.
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
CMD
CMD 명령은 이미지에서 컨테이너를 실행할 때 실행할 명령을 설정합니다.
사용 방법은 다음과 같이 2가지가 있습니다.
## exec form
CMD ["executable","param1","param2"] (exec form)
## shell form
CMD command param1 param2 (shell form)
EXPOSE
Dockerfile 안에서 사용되며, 해당 Docker 이미지가 컨테이너 내에서 특정 프로토콜을 사용하여 특정 포트에서 리스닝하고 있음을 문서화합니다. 이 지시문은 컨테이너의 메타데이터에 정보만 추가할 뿐, 실제 포트를 외부에 공개하지 않습니다.
EXPOSE <port> [<port>/<protocol>...]
사용 예시는 다음과 같습니다.
EXPOSE 80/udp
Docker 이미지가 컨테이너 내에서 TCP 프로토콜을 사용하여 80번 포트에서 리스닝을 할 것을 암시합니다.
마지막으로 도커에서 포트를 열어주어야만 가능합니다.
docker run -p 80:80/tcp
COPY
로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다.
COPY [원본경로] [컨테이너 경로]
사용 예시는 다음과 같습니다.
COPY . /src
WORKDIR
WORKDIR 지시문은 그 이후에 오는 Dockerfile의 RUN, CMD, ENTRYPOINT, COPY, ADD 지시문에 대한 작업 디렉토리를 설정합니다. 만약 WORKDIR이 존재하지 않는다면, 이후의 Dockerfile 지시문에서 사용되지 않더라도 생성됩니다.
WORKDIR directory
여러번 사용할 수 있습니다. 상대 경로가 제공되면, 이전 WORKDIR 지시문의 상대 경로로 적용됩니다.
안녕하세요, 오늘은 Docker Container 내부에서 GPU를 간단하게 사용할 수 있는 방법에 대해 소개하려고 합니다.
총 2가지를 진행하면 됩니다. 간단하게 nvidia-docker 설치와 같은 방법을 사용하지 않고 진행합니다.
Dockerfile 환경변수 추가 설정
Docker Container 실행시 매개변수 추가
Dockerfile 환경변수 추가 설정
# Dockerfile
FROM python:3.8
ADD . /workdir
RUN apt-get update && apt-get install vim -y
RUN pip install torch && pip install transformers && pip install gpustat
##### 다음 줄 추가 #####
ENV CUDA_VISIBLE_DEVICES=0
##### 추가 #####
ENV CUDA_VISIBLE_DEVICES=0
다음과 같이 환경변수를 설정합니다.
Docker Container 실행시 매개변수 추가
위의 Dockerfile을 빌드합니다.(docker build -t <이미지 이름> <Dockerfile위치>)
# Container 생성
>>> docker run -dt --name test --gpus all image:latest
# Container 접속
>>> docker exec -it <container id> /bin/bash
여기서 컨테이너를 생성시 --gpus all다음과 같은 매개변수를 추가합니다.
다음과 같이 GPU를 사용할 수 있게 됩니다.
간단하게 로컬 GPU를 사용할 수 있도록 Docker image build 및 Container 생성에 대해 알아봤습니다.
카드를 등록하면, 다음과 같이 무료 체험판 사용을 위해 300$을 제공해줍니다. 그리고 좌하단에 VM 만들기로 들어갑니다.
Compute Engine API를 사용 누릅니다. (1~2분 소요)
Google Cloud VM instance 생성
다음 사이트에 접속을 하면 위의 사진과 같이 나오면서 인스턴스 만들기를 누릅니다
이름은 test-1로 바꾸고, 지역은 서울로 지정했습니다.
액세스 범위에 대해서는 다음과 같이 설정했으며, 방화벽은 HTTP와 HTTPS 트래픽 허용을 체크하고 만들기 버튼을 눌렀습니다. (만들기 버튼 누르고 VM instance 생성까지 1 ~ 2분 소요)
다음과 같이 인스턴스가 만들어진 것을 볼 수 있습니다.
Docker설치, app.py 생성 및 설정
브라우저 창에서 열기를 통해서 인스턴스를 실행합니다.
다음과 같이 창이 나타나면서 이제부터 명령어를 실행합니다.
# docker 설치
sudo apt install docker.io -y
# app.py 생성
touch app.py
# app.py 수정
vi app.py
app.py 파일을 수정합니다.
# app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, Flask"
if __name__ == "__main__":
app.run()
마지막으로 ESC 버튼을 누르고 :wq Enter 누르고 파일을 저장하고 나갑니다.
Docker 파일 생성 및 설정
Dockerfile 생성 및 수정
# Dockerfile 생성
touch Dockerfile
# Dockerfile 수정
vi Dockerfile
Dockerfile 파일 내용
FROM python:3.12
ADD . /app
RUN pip install flask
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]
i 버튼을 눌러서 Insert Mode로 설정한 뒤, 다음과 같은 Text를 입력한 뒤, :wq를 눌러서 저장하고 나갑니다.
Docker 파일 빌드 및 컨테이너 생성
명령어를 통해 생성한 Dockerfile을 빌드하고 컨테이너를 생성합니다.
# 현재 디렉토리에 있는 Dockerfile을 이용해 이름이 test인 이미지 빌드
sudo docker build -t test .
# 빌드된 이미지(test)를 이용해 아룸아 test1이라는 컨테이너 생성 및 5000포트를 이용하여 접속
sudo docker run --name=test1 -d -t -p 5000:5000 test
Conatiner ID 확인
# 현재 실행중인 Container 확인
sudo docker ps
다음과 같이 Container ID와 여러 정보를 알 수 있습니다.
Conatiner에서 Flask가 잘 실행되었는지 확인하기 위해 로그를 확인합니다.(logs 뒤에 Container ID의 앞자리만 입력하면 됨)
sudo docker logs 829
다음과 같이 실행이 잘 되고있는 것을 확인할 수 있습니다.
외부 IP와 5000 포트를 결합하여 입력창에 입력합니다. (여기서 https 가 아닌 http를 이용해서 접속해야 합니다.)
하지만 다음과 같이 무한로딩에 걸리면서 접속이 되지 않는데, 이 때 방화벽을 설정해주어야 합니다.