- 준비할것
- github 계정
- 깃헙계정에 hangman repo 생성
- docker hub 계정
- docker 설치
- 무료서버 사이트 https://labs.play-with-docker.com/ docker hub 계정과 연동
실습과정
- 깃허브 레포에 코드 푸쉬, 깃허브 액션을 동작시킴
- 테스트 돌려보고,
- docker 이미지빌드, 도커 허브에 업로드 수행
행맨 레포 구조 설명
- 전체구조
- app.py
브라우저를 통해 지정된 포트로 요청이 들어오면, 행맨 app을 실행시켜줌 - requirements.txt
행맨 다운로드(무료 서버이용)
- https://labs.play-with-docker.com/ 접속 후 도커 연동 로그인, add new instance (4시간 무료서버 시작)
- 깃에서 컴퓨터로 행맨 다운
git clone https://github.com/learndataeng/hangman_web.git
Cloning into 'hangman_web'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 25 (delta 7), reused 4 (delta 4), pack-reused 15
Receiving objects: 100% (25/25), 8.52 KiB | 8.52 MiB/s, done.
Resolving deltas: 100% (10/10), done. - 깃허브 로그인 id, pw 입력(안나올수도 있음)
- 행맨 폴더로 이동
cd hangman_web - requirements.txt 내부 모듈들 설치 명령
pip3 install -r requirements.txt
ERROR: Could not find a version that satisfies the requirement requirements.txt (from versions: none)
HINT: You are attempting to install a package literally named "requirements.txt" (which cannot exist). Consider using the '-r' flag to install the packages listed in requirements.txt
ERROR: No matching distribution found for requirements.txt
[notice] A new release of pip is available: 23.2.1 -> 23.3.2
[notice] To update, run: python.exe -m pip install --upgrade pip
pip 버전 업그레이드 요청 - pip 버전 업그레이드
python.exe -m pip install --upgrade pip
Requirement already satisfied: pip in c:\users\weare\appdata\local\programs\python\python312\lib\site-packages (23.2.1)
Collecting pip
Obtaining dependency information for pip from https://files.pythonhosted.org/packages/15/aa/3f4c7bcee2057a76562a5b33ecbd199be08cdb4443a02e26bd2c3cf6fc39/pip-23.3.2-py3-none-any.whl.metadata
Downloading pip-23.3.2-py3-none-any.whl.metadata (3.5 kB)
Downloading pip-23.3.2-py3-none-any.whl (2.1 MB)
---------------------------------------- 2.1/2.1 MB 11.2 MB/s eta 0:00:00
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 23.2.1
Uninstalling pip-23.2.1:
Successfully uninstalled pip-23.2.1
Successfully installed pip-23.3.2 - 다시 requirements.txt 내부 모듈들 설치 명령
pip3 install -r requirements.txt
Collecting Flask==2.3.2 (from -r requirements.txt (line 1))
Downloading Flask-2.3.2-py3-none-any.whl (96 kB)
---------------------------------------- 96.9/96.9 kB 308.3 kB/s eta 0:00:00
Collecting Flask-HTTPAuth==4.5.0 (from -r requirements.txt (line 2))
Downloading Flask_HTTPAuth-4.5.0-py3-none-any.whl (6.7 kB)
Collecting Flask-Login==0.6.2 (from -r requirements.txt (line 3))
Downloading Flask_Login-0.6.2-py3-none-any.whl (17 kB)
(중략)
extensions, MarkupSafe, itsdangerous, greenlet, colorama, blinker, Werkzeug, SQLAlchemy, Jinja2, click, Flask, Flask-SQLAlchemy, Flask-Login, Flask-HTTPAuth
Successfully installed Flask-2.3.2 Flask-HTTPAuth-4.5.0 Flask-Login-0.6.2 Flask-SQLAlchemy-3.0.3 Jinja2-3.1.2 MarkupSafe-2.1.3 SQLAlchemy-2.0.23 Werkzeug-3.0.1 blinker-1.7.0 click-8.1.7 colorama-0.4.6 greenlet-3.0.3 itsdangerous-2.1.2 typing-extensions-4.9.0 - 외부 접근시 행맨 실행되게 세팅
python3 -m flask run --host=0.0.0.0 --port=4000
+ python3 -m flask run: Flask 애플리케이션을 실행합니다
--host=0.0.0.0: 서버를 모든 네트워크 인터페이스에 바인딩하여 외부에서 접근할 수 있도록 합니다.
--port=4000: 서버를 4000 포트에서 실행합니다. - 행맨 화면이 나오지 않는다. 왜일까?
-> 포트 설정을 안해줬기 때문이다. (open port 버튼 클릭후 4000으로 맞춰줌)
로컬에서 그대로 진행해보기(우분투로)
- 우분투에서 위의 과정을 그대로 반복하면 실행되지 않는다.
- 문제 : 컨테이너 내부앱은 포트번호를 4000으로 맞춰도, 컨테이너 밖에서는 실행되지 않는다.
- 해결 방법 : 컨테이너 실행시 내부 4000포트를 밖에서도 4000으로 보이게 세팅(포트포워딩 -p)
- 포트 포워딩을 위해 명령어를 바꿔야 한다. 이번에는 다운받은걸 올리는게 아닌, 직접 도커 이미지를 제작해보자.
도커 파일 제작
- 우선 도커 이미지를 제작하려면, 도커파일을 제작해야한다.
- dockerfile.txt 만들기
weare@DESKTOP-BE1I4GE:~/hangman_web$ touch dockerfile - 내용 넣기 위해 nano 편집기 오픈
weare@DESKTOP-BE1I4GE:~/hangman_web$ nano dockerfile - 도커파일 내용 복사 붙여넣기-> ctr+x, y 손떼고 enter(저장완료)
# 베이스 이미지로부터 시작
FROM python:3.8-slim-buster
# 이미지를 유지보수하는 담당자의 정보를 라벨로 추가
LABEL maintainer="wearelego@naver.com"
# 작업 디렉토리를 /app으로 설정
WORKDIR /app
# 현재 디렉토리에 있는 app.py 파일을 이미지의 /app 디렉토리로 복사
COPY app.py ./
# 현재 디렉토리에 있는 requirements.txt 파일을 이미지의 /app 디렉토리로 복사
COPY requirements.txt ./
# requirements.txt 파일에 명시된 의존성 패키지를 설치
RUN pip3 install -r requirements.txt
# 컨테이너 내부에서 사용할 포트를 노출
EXPOSE 4000
# 컨테이너가 시작될 때 실행되는 명령을 설정
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0", "--port=4000"] - 도커파일 이미지 제작(빌드)
weare@DESKTOP-BE1I4GE:~/hangman_web$ docker build -t 도커허브이름/hangman .
[+] Building 17.7s (11/11) FINISHED docker:default
=> [internal] load .dockerignore 0.1s
(중략)
=> [2/5] WORKDIR /app 0.8s
=> [3/5] COPY app.py ./ 0.1s
=> [4/5] COPY requirements.txt ./ 0.1s
=> [5/5] RUN pip3 install -r requirements.txt 6.3s
=> exporting to image 0.4s
=> => exporting layers 0.4s
=> => writing image sha256:f63deabbaf881311d0ba660aed5ab2f313fabdfc10b23603750518663ab7538c 0.0s
=> => naming to docker.io/legoking/hangman
+ 만약 맥북 m1칩을 쓰고 있다면 : docker build --platform=linux/amd64 -t 도커허브이름/hangman 를 입력해야함 - 위에서 컨테이너 내부 포트를 4000으로 설정했었지만 (EXPOSE 4000) 외부와도 4000으로 포트포워딩(-p)을 해야함
weare@DESKTOP-BE1I4GE:~/hangman_web$ docker run -p 4000:4000 legoking/hangman
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:4000
* Running on http://172.17.0.2:4000
Press CTRL+C to quit
172.17.0.1 - - [24/Dec/2023 08:49:32] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [24/Dec/2023 08:49:32] "GET /favicon.ico HTTP/1.1" 404 - - 위의 주소 http://127.0.0.1:4000을 인터넷 창에 붙여넣기 하면 , 이제 행맨이 잘 출력된다.
- 작동중인 컨테이너 목록 확인
weare@DESKTOP-BE1I4GE:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9000ad0e7bf3 legoking/hangman "python3 -m flask ru…" 8 seconds ago Up 7 seconds 0.0.0.0:4000->4000/tcp stupefied_lalande - 강제로 중단해보기
weare@DESKTOP-BE1I4GE:~$ docker stop 9000ad0e7bf3
9000ad0e7bf3 - 다른 작업도 할수있게 백그라운드에서 실행( -d )해보기
weare@DESKTOP-BE1I4GE:~/hangman_web$ docker run -p 4000:4000 -d legoking/hangman
96d86dd5c59aa891418c36c568813131c94f9c24168a2a8e6b0b70948d515ba4
weare@DESKTOP-BE1I4GE:~/hangman_web$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96d86dd5c59a legoking/hangman "python3 -m flask ru…" 6 seconds ago Up 4 seconds 0.0.0.0:4000->4000/tcp gifted_blackburn
제작한 도커파일 도커허브에 업로드
- weare@DESKTOP-BE1I4GE:~$ docker push legoking/hangman
Using default tag: latest
The push refers to repository [docker.io/legoking/hangman]
dc98c5bce72d: Pushed
4d02b9d087c0: Pushed
b3a0754f0b99: Pushed
b9318d6e19ee: Pushed
e6c5004ee77f: Mounted from library/python
997b8e79e84f: Mounted from library/python
3054512b6f71: Mounted from library/python
ae2d55769c5e: Mounted from library/python
e2ef8a51359d: Mounted from library/python
latest: digest: sha256:5423af489767acf74d147fd86b81d6683b8c0c1b057f86b9007fa5115a916d29 size: 2203
'docker(도커) 및 쿠버네티스' 카테고리의 다른 글
docker volume (1) | 2023.12.27 |
---|---|
docker 명령어 모음 (0) | 2023.12.27 |
docker 컨테이너 에서 MySQL 서버 실행하기 (0) | 2023.12.24 |
docker 컨테이너 실습(ubuntu를 docker 컨테이너에서 실행) (1) | 2023.12.24 |
dockerhub 연동 실행, 수정 실습 (1) | 2023.12.24 |