1. 준비할것
  • github 계정
  • 깃헙계정에 hangman repo 생성
  • docker hub 계정
  • docker 설치
  • 무료서버 사이트 https://labs.play-with-docker.com/  docker hub 계정과 연동

실습과정

  1. 깃허브 레포에 코드 푸쉬, 깃허브 액션을 동작시킴
  2. 테스트 돌려보고,
  3. docker 이미지빌드, 도커 허브에 업로드 수행

 

행맨 레포 구조 설명

  • 전체구조
  • app.py
    브라우저를 통해 지정된 포트로 요청이 들어오면, 행맨 app을 실행시켜줌
  • requirements.txt

 


행맨 다운로드(무료 서버이용)

  1. https://labs.play-with-docker.com/ 접속 후 도커 연동 로그인, add new instance (4시간 무료서버 시작)
  2. 깃에서 컴퓨터로 행맨 다운
    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.

  3. 깃허브 로그인 id, pw 입력(안나올수도 있음)

  4. 행맨 폴더로 이동
    cd hangman_web

  5. 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 버전 업그레이드 요청

  6. 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

  7. 다시 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

  8. 외부 접근시 행맨 실행되게 세팅
    python3 -m flask run --host=0.0.0.0 --port=4000

    + python3 -m flask run: Flask 애플리케이션을 실행합니다
    --host=0.0.0.0: 서버를 모든 네트워크 인터페이스에 바인딩하여 외부에서 접근할 수 있도록 합니다.
    --port=4000: 서버를 4000 포트에서 실행합니다.
  9. 행맨 화면이 나오지 않는다. 왜일까? 
    -> 포트 설정을 안해줬기 때문이다. (open port 버튼 클릭후 4000으로 맞춰줌)

 

로컬에서 그대로 진행해보기(우분투로)

  1. 우분투에서 위의 과정을 그대로 반복하면 실행되지 않는다.
  2. 문제 : 컨테이너 내부앱은 포트번호를 4000으로 맞춰도, 컨테이너 밖에서는 실행되지 않는다. 
  3. 해결 방법 : 컨테이너 실행시 내부 4000포트를 밖에서도 4000으로 보이게 세팅(포트포워딩 -p)
  4. 포트 포워딩을 위해 명령어를 바꿔야 한다. 이번에는 다운받은걸 올리는게 아닌, 직접 도커 이미지를 제작해보자.

 

도커 파일 제작

  1. 우선 도커 이미지를 제작하려면, 도커파일을 제작해야한다.
  2. dockerfile.txt 만들기
    weare@DESKTOP-BE1I4GE:~/hangman_web$ touch dockerfile

  3. 내용 넣기 위해 nano 편집기 오픈
    weare@DESKTOP-BE1I4GE:~/hangman_web$ nano dockerfile

  4. 도커파일 내용 복사 붙여넣기-> 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"]
  5. 도커파일 이미지 제작(빌드) 
    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 를 입력해야함

  6. 위에서 컨테이너 내부 포트를 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 -

  7. 위의 주소 http://127.0.0.1:4000을 인터넷 창에 붙여넣기 하면 , 이제 행맨이 잘 출력된다.
  8. 작동중인 컨테이너 목록 확인
    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

  9. 강제로 중단해보기
    weare@DESKTOP-BE1I4GE:~$ docker stop 9000ad0e7bf3
    9000ad0e7bf3

  10. 다른 작업도 할수있게 백그라운드에서 실행( -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

 

 

+ Recent posts