학습주제
학습내용
행맨 서비스에 도커파일을 추가해서 도커이미지로 만들어보자.
어떤 웹서비스를
도커 컨테이너 안에서 실행한다.
특정 포트를 오픈해야함.
행맨 프로그램은 포트 4000
앞서 리눅스로 해봤다.
도커 컨테이너 안에 실행하는경우
컨텡이너 바깥에서 포트 4000을 열어놔야한다
docker run keeyong/hangman
호스트 운영체제에 엑세스 하려고 해보면 사이트 찾을 수 없다는 에러가 뜸
컨테이너는 완전히 별개의 공간이기 때문에 내가 컨테이너에서 포트번호 4000을 오픈했다고 해서 이게 바깥에서 보이진 않음
이를 해결하기 위해
포트 매핑이라는 걸 해야함
도커 컨테이너 안에 플라스크 앱에 4000 포트를 오픈했지만 컨테이너 밖에선 안보이는 상황임.
호스트 운영체제에서 브라우저를 띄우고 4000번 포트를 엑세스 하려고 해도 안보임.
컨테이너 실행할 때, 포트 4000을 바깥에서 4000으로 보이게 포워딩을 해야함
-p
라는 포트 매핑 옵션
4000을 바깥의 4000과 매핑을 하겠다.
따라서 호스트에서 4000번으로 접속시도하면 컨테이너 안의 4000번으로 포워딩 해주겠다.
도커 안에서 포트 4000번에 대한 엑세스를 직접하진 못하지만 도커가 대신 해줌. 4000번으로 오는 모든 요청은 도커 컨테이너 안의 4000으로 매핑해줌. 포트번호를 바꿀수도 있음.
내부에선 4000, 외부에선 80번으로 오픈한다면
80:4000 이렇게 하면 됨. 4000은 내부 컨테이너의 포트
이에 -p 4000:4000
이걸 추가로 넣어주면 정상적으로 나옴. 도커 엔진이 해준다.
외부 포트 번호를 바꿀수도 있음 80:4000. 80은 http의 기본 포트번호임.
node로 hello 관련 만들었었음.
FROM python:3.8-slim-buster
RUN pip3 install -r requirements.txt
플랫폼 --platform=linux/amd64 잊지 말기 (맥 M1)
이 이미지를 가지고 컨테이너를 실행해보기.
우선 git을 클론해와서 들어간다
docker build -t kjw9684k/hangman_web .
.은 현재의 위치의 도커파일로 만들겠다는 뜻. 실패함.
도커파일을 만들지 않았음.
docker login --username kjw9684k
허브에 리포 만들어둠
나중에
docker push kjw9684k/hangman_web
COPY, WORKDIR 생각이 안나서 복습해봄
COPY - . /app -> 이미지에 포함이 될 코드를 복사. 현재 디렉토리 모든내용이 /app 폴더로 모두 복사가 됨. 컨테이너 안에 app 폴더 생성. 우리가 나중에 실행시킬 파일중 하나 들어있음.
WORKDIR /app 이미지실행을 위해 복사된 위치를 입력하면 패스를 입력할 필요 없음.
cmd 도커 컨테이너 실행할 때 실행할 명령어. 엔트리 포인트도있지만 이걸 선호.
FROM python:3.8-slim-buster
RUN pip3 install requirements.txt
COPY . /app
WORKDIR /app
CMD app.py
일단 이렇게 만들어본다
에러남
-r
안써줘서 requirements.txt를 인식 못함
Dockerfile과 같은 위치에 requirements.txt가 있는지 확인합니다.
requirements.txt의 내용이 올바른지 확인합니다. 필요하다면 pip install -r requirements.txt를 로컬 환경에서 실행하여 모든 패키지가 정상적으로 설치되는지 확인할 수 있습니다.
Dockerfile에 COPY 명령을 추가하여 requirements.txt를 도커 이미지 안에 넣습니다. 예를 들어, COPY requirements.txt /requirements.txt를 Dockerfile의 RUN pip3 install -r requirements.txt 이전에 추가할 수 있습니다.
얘도 COPY로 넣어주고 나서 실행시켜야 하나보다
순서를 바꿔준다
성공함.
근데 실행 실패함
CMD python app.py
로 바꿔봄 실행할 런타임을 적어주지 않음
다시 이미지 빌드함.
왜 5000에서 돌아간다는거지??
일단 실행 실패함.
파라미터를 받아야하나??
python3 -m flask run --host=0.0.0.0 --port=4000
지난번 수업때 이렇게 쓰면 알아서 app.py를 찾아간다고 했던 것 같음.
-> 이부분이 어떻게 이뤄지는지 잘 모르겠음
app.py는 Flask 웹 애플리케이션을 정의하는 Python 스크립트입니다. Flask 애플리케이션을 실행하려면, 일반적으로 애플리케이션 객체가 app 또는 application으로 정의된 상태에서 flask run을 사용합니다.
python3 -m flask run --host=0.0.0.0 --port=4000은 플라스크 개발 서버를 시작하는 명령입니다. 이 명령은 현재 작업 디렉토리에 있는 app.py 또는 application.py에서 애플리케이션을 찾습니다.
--host=0.0.0.0는 애플리케이션을 퍼블릭 IP 주소에서 사용 가능하게 하고, --port=4000은 애플리케이션을 4000 포트에서 실행하라는 것을 나타냅니다.
다시 말해, python app.py는 애플리케이션을 개발 서버에서 직접 실행하고, flask run은 Flask의 개발 서버를 사용하여 애플리케이션을 실행합니다. 두 방법 모두 개발 환경에서 애플리케이션을 실행하는 데 유용하지만, 실제 운영 환경에서는 보다 견고한 WSGI 서버를 사용하는 것이 좋습니다.
도커 파일 수정하고 다시 이미지 빌드해본다
이미 포트가 점유하고 있다고 한다 삭제해야 한다
docker image rm -f 이미지ID
삭제했다
저번에 이렇게 이미지 여러번 확인 안하게
--name=mysql_container 을 써서 컨테이너를 실행시켰었다
뭐지 이미지 록록이 없나
아 삭제하고 이미지 빌드를 안했다 다시한다
0.0.0.0 포트가 이미 할당되어 안된다는 에러가 뜸
에어플로우 문제인거 같다 일단 다 내려보자
에어플로우로 이동해서 docker compose down
이미 컨테이너에서 사용하고 있다고 한다
docker stop로 내려본다
깔끔해짐
다시 이미지로 컨테이너 실행해본다
성공함
이걸 이제 도커 허브에 push 한다
docker push kjw9684k/hangman_web
순로롭게 성공
각자 만들었던 이미지를
labs에서 실행
여기선 바로 flask app을 오픈해볼 수 있음
잘 열림
어카운트에 엑세스만 되어 있으면
docker push 할때 이미지로 바로 리포가 생김.
터미널에서 바로 push 하면 가능함.