사용할 예제 : voting application

https://github.com/dockersamples/example-voting-app

 

GitHub - dockersamples/example-voting-app: Example distributed app composed of multiple containers for Docker, Compose, Swarm, a

Example distributed app composed of multiple containers for Docker, Compose, Swarm, and Kubernetes - GitHub - dockersamples/example-voting-app: Example distributed app composed of multiple containe...

github.com

 

실습 예제 파일을 깃 클론으로 받아옴

 

빌드 후 실행(하나하나 실행)

 

-> vote 시 정상 동작을 못한다. 아래 순서도를 보면 vote와 redis의 연결 부분에 문제가 있는것으로 보인다.

 


디테일한 문제점 분석

  1. vote에 로그인해서 redis로 신호(핑)을 날려보고 정상적으로 가는지 확인하면 된다.
    $ ping redis
    ping :cannot resolve redis: unknown host
    핑이 제대로 날라가지 않는다. (실제 연결이 안됨을 확인)
  2. db도 정상적인 값을 못받는듯 하다.
  3. db와 redis 의 연결에도 문제가 있어 보인다.

결론 : 컨테이너간 변수들이 전부 연결성에 문제가 있음을 추론할수있음.

 

해결방법 : 모든 컨테이너들을 --network mynetwork 로 묶어 연결

● 컨테이너를 다시 올리기 위해 초기화
docker container rm -f $(docker container ls -aq) 
● 네트워크 mynetwork 생성(존재한다면 지우고 다시 설치할것)
docker network create mynetwork
● docker run -d --name=redis --network mynetwork redis
● docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
● docker run -d --name=vote -p 5001:80 --network mynetwork vote 
● docker run -d --name=result -p 5002:80 --network mynetwork result 
● docker run -d --name=worker --network mynetwork worker

 


vote에서 redis 연결이 문제였으니 테스트 위해 vote쉘  접속(ping 모듈 설치위해 root로 접속)
+위에 순서도 참조 vote 다음이 redis이니까. vote에 접속해서 redis로 신호를 날려보는거임

  • weare@DESKTOP-BE1I4GE:~/example-voting-app$ docker exec -it --user root vote sh
    # apt update
  • # apt install iputils-ping
  • # ping redis (redis로 핑 날려봄)

 

정상 연결된 모습이다. 

'docker(도커) 및 쿠버네티스' 카테고리의 다른 글

docker-compose(명령어, yaml파일구조)  (0) 2023.12.29
.dockerignore 파일은 뭘까?  (1) 2023.12.28
docker 초기화(클린업)  (0) 2023.12.27
docker volume  (1) 2023.12.27
docker 명령어 모음  (0) 2023.12.27
  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

 

 

내가 만든 프로그램이 다른 컴퓨터에서는 안돌아간다면?

  1. 설치 과정에서 중요한 파일이 빠질수 있음
  2. 운영체제가 다르고, 다른 버전이 설치되면 라이브러리 버전간 호환이슈 발생

일정하게 똑같은 환경에서 만들어 주는법 (like 밀키트)

  1. 도커 이미지(모듈 버전등 환경변수)와, 도커 컨테이너(도커이미지+운영시스템) 필요
    예) 중화요리 밀키트(도커이미지)를 웍(도커 컨테이너) 에서 센불로 요리해야 제맛!

 

Virtual Machine(docker 등장 이전의 강자) 

  • 예 ) EC2가 대표적인 VM, 맥 컴퓨터 위에서 윈도우, 리눅스들 가상 운영체제를 돌리는 경우
  • VM 구조 : 호스트 os(macitosh) 위에 VM 관리 툴( hypervisors) 가 필요하고, 그 위에 운영체제
  • VM 장단점
    장점 : 독립적이고 분리된 공간 제공, 다수의 소프트를 각 VM에서 독립적으로 실행가능
    단점 : 각 os 별로 비용, VM끼리 cpu,램, 용량들을 나눠야 해서 성능이 떨어짐

 

 

docker container

  • docker의 운영체제는 일반 운영체제에 비해서 경량화 됌(필요한 만큼만 사용)

  • Docker 제작시 사용한 호스트 OS와, 그 컨테이너 가 호환되는 OS 
    맥 : 경량화 리눅스 / 윈도우 : 윈도우, 리눅스 / 리눅스 : 리눅스 only
    +리눅스는 어디서 만들든 다 사용할수 있음

  • 장점
    1) 각 컨테이너 별로 독립적이고 분리된 공간, 소프트 각각 실행도 가능
    2) 수십 수백 컨테이너 사용시 , 각각 따로 구현에 비해 자원소비가 적음
    3) 별도의 os 라이센스 비용 필요없고, 경량화 os라 빠르게 실행됨
  • 단점
    1) 많은 컨테이너 관리 쉽지 않음
    2) 컨테이너 제작 os, 동작 os 간의 호환성 이슈
    3) GUI 소프트 개발에 적합치 않음(VM이 더 적합)

건물에 월세 세입자를 구하는것 vs 에어비엔비로 호스트를 자주 유치하는것

 

+ Recent posts