ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] 파이썬(Python3.8) 개발 환경 구축하기
    오픈소스 2022. 8. 29. 13:49

    개요

    IT업계에서 일하지 않는 사람은 인터넷을 사용할 수 없다는 것이 무슨 말인가 싶을 것이다. 2022년에 인터넷을 사용할 수 없다는 것이 말이 되지는 않으니까.. 하지만 의외로 IDC나 회사 내부적으로는 인터넷을 사용할 수 없는 경우가 대부분이다. 한명의 실수로 악성코드가 사내 네트워크로 유입되면 이는 겉잡을 수 없이 커질 수 있기 때문에 아예 차단하는 것이라고 보면 된다.
    그러나, 우리가 업무를 하거나 시스템 관리자로써 일할 때 인터넷은 반드시 필요한 요소이다. 패치파일을 다운로드하는 것부터 시스템 분석을 위한 프로그램, 그리고 개발을 할 때 프로그래밍 언어의 모듈 하나를 다운받기 위해서도 인터넷은 반드시 필요하다. 필자는 이번에 폐쇄망에서 파이썬으로 개발을 해야하는 상황이었는데 개발을 해본 경험이 없다보니 문제가 발생하면 이를 조치하는 식으로 진행하였다. 그러다보니 진행률이 올라갈 때 마다 필요 모듈이 계속해서 추가되었고, 필요 모듈을 파일로 받아서 폐쇄망으로 옮기고 설치하다보면 다른 모듈에 의존성이 걸리고... 계속 반복하다 보니 3일 동안 설치 환경 구축도 진행하지 못하였다. 계속 시도하다가 Docker라는 오픈소스를 기반으로 하면 보다 쉽게 가능하다는 내용을 보았고, 결과적으로는 아주 손쉽게 개발 환경을 구축할 수 있었다.



    Docker 설치하기

    이번에 사용했던 환경은 2종류였다. 하나는 인터넷이 가능한 CentOS8이 환경이었고, 다른 하나는 폐쇄망의 CentOS7 환경이었다. 인터넷이 가능한 환경에서 개발에 필요한 파이썬/모듈 등을 설치한 이미지를 생성하고, 이를 폐쇄망 환경의 Docker로 이관하여 기동시키는 방식으로 진행하고자 하였으며, 각 서버에 Docker는 공식 URL(CentOS) 을 참고하여 무리없이 설치할 수 있었다.

    DockerFile 작성하기

    IaC의 일환으로 Docker도 스크립트 기반으로 컨테이너를 실행시킬 수 있다. 이 때 사용하는 파일을 DockerFIle이라고 칭하며 기본으로 사용할 이미지는 무엇인지, 어떤 패키지를 설치할지 등을 기술하여 제 3자가 보더라도 어떤 식으로 이미지가 기동되었겠구나를 파악할 수 있도록 해준다. 이 때 기본으로 사용할 이미지를 docker.hub에서 찾아야 하기 때문에 초기 이미지는 인터넷이 가능한 환경에서 구성해야만 한다. 결과적으로 필자가 사용한 DockerFile은 아래와 같다.

    FROM python:3.8                   // 기본 이미지 (아래부터는 Python3.8로 지칭)
    
    COPY . .                          // 기본 코드를 비롯한 필요 파일 컨테이너 내부로 복사
    
    RUN pip install --upgrade pip     // Python3.8 PIP 업그레이드
    RUN pip install requests          // Python3.8 모듈 추가 설치 (Requests)
    RUN pip list                      // Python3.8 설치된 모듈 목록 확인
    
    CMD ["python", "./test.py" ]      // Python3.8을 기반으로 작성한 기본 코드 실행

    그냥 모듈을 폐쇄망으로 옮겨서 설치할 수도 있지만, 이 방법을 채택한 이유는 의존성 때문이다. 보기에는 하나의 모듈만 설치하면 되지만 이를 위하여 추가 모듈이 얼마나 필요할지는 환경마다 다르기 때문에 사전에 준비할 수도 없다. 인터넷이 연결된 환경이라면 의존성에 걸리는 패키지도 자동으로 설치해주기 때문에 가능하다면 초기 이미지는 인터넷이 가능한 환경에서 해주는 것이 좋다.

    Docker 이미지 생성/실행하기

    DockerFile 작성이 완료되었다면 이제 이미지를 생성하고 컨테이너로 실행시킨 뒤, 결과적으로 파이썬 코드를 실행시켜 보도록 하자. 먼저 이미지를 생성해보도록 하자. 이 때 기본 이미지가 없다면 인터넷에서 다운로드를 받고 받은 내역이 있다면 바로 생성되기 때문에 두번째부터는 생성하는데 그리 오랜 시간이 걸리지 않는다.

    # docker build --tag Image_Name DockerFile_Path

    그림-1. Python3.8 이미지 기반으로 새로운 이미지 생성하기

    이미지를 생성한 뒤, 확인하는 명령어는 2가지가 있는데 같은 의미이므로 어떤 것을 쓰든 상관은 없다.

    # docker image ls or # docker images

    그림-2. 생성된 Docker 이미지 확인

    이제 마지막으로 생성된 이미지를 컨테이너로 실행시키고 파이썬 코드를 실행시키면 되는데, 이 때 컨테이너의 장점이 드러난다. 예를 들어, 다수의 프로젝트를 개발해야 하는 상황인데 각각에 따라 사용해야 하는 프로그래밍 언어의 버전이 모두 달라야한다고 가정해보자. 어떤거는 V2.7.5의 라이브러리가 필요하고 어떤거는 V3.2의 라이브러리가 필요하고 심지어 테스트는 WINDOW 환경에서 진행을 해야 한다. 기존의 방식으로 한다면 각각의 버전과 OS가 맞는 서버가 모두 있어야 하지만, Docker 환경에서는 OS종류에 상관없이 모두 실행시킬 수 있다. 예시 환경에서 사용한다고 가정하면 각 OS에 맞는 서버 2개만 구성하고 각 프로그래밍 버전에 맞는 Docker Image만 구성하면 손쉽게 개발을 시작할 수 있을 것이다.
    그렇다면 실제 컨테이너를 실행시키면 어떻게 되는지 보도록 하자. 필자는 단순히 문자열만 출력하도록 했다.

    그림-3. Docker 이미지 실행하기

    전체적인 순서는 '이미지 실행 → 컨테이너 생성 → 파이썬 환경 기동 → 코드 실행' 순서로 이루어진다. 이미지를 실행한다는 것이 곧 컨테이너를 실행시킴을 의미하기에 별도에 작업이 필요하지는 않다. 파이썬 환경도 상시 기동되있는 것이 아니라 필요 시에 기동되었다가 코드를 수행하고 자동으로 종료되기에 종료 절차도 필요치 않다. 실행 명령어도 간단하다.

    # docker run Image_Name

    로컬 파일로 Docker 실행하기

    여기까지해서 Docker 환경으로 파이썬을 구축하고 코드를 실행하는 것까지는 가능하지만, 기존 방법보다 편해졌다고 하여 수시로 바뀌는 코드를 계속해서 이미지로 생성하고 기동시킬 수는 없는 노릇이다. 실행된 컨테이너는 OS와는 독립된 환경이기 때문에 추가 옵션을 사용하여 이미지를 실행시켜야 한다. 사용하는 옵션은 "-v" 이며, 해석해보자면

    로컬 소스 경로에 있는 소스 파일컨테이너 내부의 소스 파일로 매핑시켜서 사용하겠다.
    # docker run -v 로컬 소스 경로:컨테이너 내부의 소스 경로 Image_Name

    위와 같은 방식으로 하면 계속해서 이미지를 생성할 필요 없이, 생성된 이미지에 업데이트된 소스 코드를 실행시킬 수 있다. 명령어를 통해서 수행되기 때문에 로컬 소스의 파일명이 정해져있을 필요는 없고, 컨테이너 내부의 파일명만 매핑시켜주면 된다.

    Docker 이미지 추출하기

    마지막으로 생성한 이미지를 추출하여 폐쇄망으로 옮겨서 기동시키면 동일한 환경에서 개발을 시작할 수 있게 된다. 추출하기 위하여 사용하는 명령어는 2가지가 있는데 save/export 이다. 정확한 차이는 확인하지 못했지만 save가 필요한 모든 파일을 추출하는 즉, 더 포괄적인 개념으로 생각되어서 save/load 명령어를 사용하였다.

    # docker save Image_Name -o 추출한 이미지.tar

    필자가 생성한 이미지는 Python3.8 + 추가 모듈로 구성되어 있었는데, 모듈의 크기가 크지 않았기 때문에 사용한 기본 이미지와 기껏해야 10MB의 용량 차이 밖에는 나지 않았다. 추출된 파일을 Docker 환경이 구축된 폐쇄망 서버에 업로드하고 다음 명령어를 통하여 이미지를 생성시킬 수 있다.

    # docker load -i 추출한 이미지.tar





    마무리

    개발이 주 업무가 아니다 보니 실제 개발하는 환경에서는 더 효율적인 방법이 있을 것이라고 생각한다. 하여 본 포스팅의 방법이 최선은 아니겠지만 경력이 쌓여가면서 느끼는 게 여러 방법을 익혀두면 언젠가는 조금씩 도움이 된다는 것이다. 하여 필자와 같은 환경이 아닐지라도 Docker라는 새로운 오픈소스를 익힐 수 있다는 점에 누구든 한번씩은 수행해보면 좋을 것이라고 생각한다.
    궁금하신 내용은 댓글로 남겨주시고, 많은 블로그 방문은 저에게 큰 힘이 됩니다. ・ᴥ・

    댓글

Designed by Tistory.