이번엔 DB를 도커로 올리는것 말고, 내가 개발한 소스코드를 도커 이미지로 만들고 실행해보자.
여태까지는 IDE에 들어가서 run을 했다면, IDE가 아닌 도커로 서버를 올려보는 작업을 해볼것.
DB와 다르게 백엔드서버에서는 일련의 빌드 과정이 필요한데, pip 패키지를 다운받는 다던지 등등의 작업들
이걸 Dockerfile에 정의하면 빌드 프로세스를 정의할 수 있다.
우선 내 백엔드 서버에 필요한 의존성 pip 패키지를 requirements.txt에 기록하자.
(백엔드 터미널에서 하기 명령어 실행)
pip freeze > requirements.txt
그리고 이제 Dockerfile을 만들어준다.
# Base image
FROM python:3.12.3
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Set working directory
WORKDIR /app
# Install dependencies
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Copy project files
COPY . /app/
# Expose the port that the Flask app runs on
EXPOSE 5000
# Command to run the application
CMD ["python", "app.py"]
Dockerfile을 만들었다면 이 파일을 기반으로 도커 이미지 파일을 만들수 있다.
Dockerfile이 있는 백엔드 터미널 위치로 가서 해당 명령어를 실행한다.
docker build -t {내가 정의할 image 이름} .
나는 이미지 이름을 backend로 했다.
빌드가 끝나면 이미지가 잘 생성 됐는지 확인해보자.
오 이미지가 잘 만들어졌네 신기방기하다.
자 그럼 이제 도커파일을 실행해보자.
이미지는 있으니, 이 이미지를 기반으로 컨테이너를 올리면 된다.
docker run -d -p 8080:5000 --name backend-container backend
우선 플라스크를 실행하면 localhost:5000 포트로 실행이 돼서 컨테이너 내부에서는 5000번 포트를 쓰게 할 것이고
외부에서 접근 할 떄는 8080으로 접근하도록 설정해보았다.
컨테이너의 이름은 backend-container라고 했고 제일 뒤에 backend는 실행할 이미지의 이름이다.
위의 사진처럼 컨테이너가 실행 됐다.
컨테이너 내부로 들어가서 curl 명령어를 날려보자...
부푼 마음으로 localhost:8080으로 들어가보자 두근두근....
안된다!!!!!!!!!!!!!!!!!
뭐가 잘못된것일까....
컨테이너 내부로 들어가서 curl명령어를 날리니까 잘된다.
그럼 이미지는 정상적으로 만들어진 것인데 .... GPT형님에게 물어보자.
- 기본적으로 Flask는 127.0.0.1(로컬 호스트)에서만 실행됩니다.
- 이 경우 로컬 머신 내부에서만 접근할 수 있습니다.
- host="0.0.0.0"으로 설정하면:
- 모든 네트워크 인터페이스에서 들어오는 요청을 수락합니다.
- 즉, 같은 네트워크에 있는 다른 컴퓨터나 컨테이너 외부에서도 접근 가능합니다.
Flask 숙련도이슈가 여기서 터졌다.
이게 원래 기존 코드가
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8080, debug=True)
# app.run(debug=True)
주석처리 해논 부분으로 되어있는데, 위를 바꿔주었다.
별도로 host설정을 안하면 컨테이너 내부에 있는 localhost에서만 접근 가능하고 컨테이너 외부에서는 접근을 못한다고 한다.
이왕 이렇게 된 거 port도 5000에서 국룰 포트 8080으로 바꿔보자.
기존에 만들어져있던 container와 image를 삭제하고 다시 만들자.
다시 container를 실행하고 두근두근 실행해보니....
오예쓰 !!!!
근데 Dockerfile에 EXPOSE쪽 port를 5000으로 해뒀는데 컨테이너 내부/외부를 8080으로 설정하고 만들었더니
5000 포트로 접근이 아닌 8080으로 했을 때 되어서 궁금해서 찾아보았다.
즉, EXPOSE 5000으로 했을 때 "설명"일 뿐 실제 그 포트로 접근하도록 설정하는 것이 아니라 한다.
단순히 도커파일을 보는 개발자들이 이걸 보고 아 컨테이너 내부포트는 5000을 쓰겠구나 라고 아는것이라고 한다...
이번시간엔 Dockerfile을 만들고, 이 만든 도커파일로 이미지를 만들고 , 컨테이너로 만들어 실행하는 과정을 진행했다.
Dockerfile이 도커 이미지를 만드는데 필요한 파일이라는 것을 배울수 있었고 IDE가 아니라 컨테이너로 실행할 수 있는 재밌는 경험이였다.
'Docker' 카테고리의 다른 글
06. Docker Volume (2) | 2025.01.01 |
---|---|
05. DB 백엔드 연동하기 (0) | 2024.12.31 |
04. DB 도커에 올리기 (1) | 2024.12.31 |
03. 백엔드 서버 세팅 (3) | 2024.12.31 |
02. Docker로 nginx 서버 올려보기 (0) | 2024.12.31 |