쓰레기 응용 프로그램을 컨테이너에 올려 보았습니다.

소개



아무래도 연말 여가의 신인 SE입니다. 몇 달 전에 너무 여유롭게 장고 응용 프로그램을 공부로 만들었는데, 그것을 기사로 만들기 위해서는 재료가 너무 많다고 생각했기 때문에 Docker를 사용하여 컨테이너를 타고 움직여 보았습니다. 만든 응용 프로그램이 생기는 것은 자각하고 있으므로 만지지 마십시오!

환경


  • Mac OS Catalina 10.15.1
  • Docker 19.03.5

  • 장고 애플리케이션 정보



    먼저 응용 프로그램에 대해 설명합니다. 이번 제목으로 사용하는 것은 이전에 내가 만든 구독 서비스 관리 응용 프로그램입니다. 이용하고 있는 서비스와 월액 금액을 등록하면 그 시점부터 현재까지의 누계 과금액을 계산할 수 있게 되어 있습니다. (할 수 있는 것은 그것뿐입니다...)



    얼마나 쓰레기인지 보고 싶어! 라고 하는 분은 이하의 링크로부터 봐 주세요. README.md라든지는 쓰지 않기 때문에 열심히 움직여! 웃음

    장고 응용

    이 기사에서는 이미 작성된 Django 애플리케이션을 컨테이너 환경에 이식한다고 합니다.

    컨테이너 구성



    컨테이너의 구성은 다음과 같습니다. AP용과 DB용으로 2개의 컨테이너를 작성합니다.



    디렉토리 구성



    디렉토리 구성은 다음과 같습니다.
    .
    ├── Dockerfile_db
    ├── Dockerfile_django
    ├── README.md
    ├── app
    │   ├── Pipfile
    │   ├── Pipfile.lock
    │   ├── env
    │   │   ├── bin
    │   │   ├── include
    │   │   ├── lib
    │   │   ├── pyvenv.cfg
    │   │   └── src
    │   ├── manage.py
    │   ├── management
    │   │   ├── __init__.py
    │   │   ├── __init__.pyc
    │   │   ├── __pycache__
    │   │   ├── admin.py
    │   │   ├── apps.py
    │   │   ├── apps.pyc
    │   │   ├── forms.py
    │   │   ├── migrations
    │   │   ├── models.py
    │   │   ├── models.pyc
    │   │   ├── templates
    │   │   ├── tests.py
    │   │   ├── urls.py
    │   │   └── views.py
    │   ├── static
    │   │   ├── addService_style.css
    │   │   ├── detail_style.css
    │   │   ├── header_style.css
    │   │   ├── login_style.css
    │   │   ├── logout_style.css
    │   │   ├── management_style.css
    │   │   ├── password_change_done_style.css
    │   │   ├── password_change_style.css
    │   │   └── signup_style.css
    │   ├── subscManagement
    │   │   ├── __init__.py
    │   │   ├── __init__.pyc
    │   │   ├── __pycache__
    │   │   ├── settings.py
    │   │   ├── settings.pyc
    │   │   ├── urls.py
    │   │   └── wsgi.py
    │   └── templates
    │       └── registration
    ├── docker-compose.yml
    └── requirements.txt
    

    AP 용 컨테이너 Dockerfile



    AP용 컨테이너를 만들기 위한 Dockerfile을 만듭니다.

    Dockerfile_django
    FROM python:3
    ENV LANG en_US.utf8
    WORKDIR /app
    ADD requirements.txt /app
    RUN apt-get update
    RUN pip install -r requirements.txt
    

    requirements.txt
    Django==2.2.5
    mysqlclient==1.4.4
    

    이번은 MySQL에의 접속 드라이버로서 mysqlclient를 사용하고 있습니다만, 후술의 MySQL 이미지의 버젼(Tag)이 mysql:8이라고 잘 동작하지 않았습니다. 이번에는 다운 그레이드하고 mysql : 5.7을 사용하고 있습니다.

    DB 용 컨테이너 Dockerfile



    DB용 컨테이너를 작성하기 위한 Dockerfile을 작성합니다.

    Dockerfile_db
    FROM mysql:5.7
    RUN apt-get clean && apt-get update && apt-get install -y locales locales-all
    RUN locale-gen ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LANGUAGE ja_JP:en
    ENV LC_ALL ja_JP.UTF-8
    RUN ln -sf /usr/share/zoneinfo/Japan /etc/localtime
    

    문자 코드 설정은 적합합니다.

    docker-compose.yml 만들기



    docker-compose.yml을 만듭니다.

    docker-compose.yml
    version: '3'
    
    services:
        db:
            build:
                context: .
                dockerfile: Dockerfile_db
            restart: always
            environment:
                MYSQL_ROOT_PASSWORD: password
                MYSQL_USER: apuser
                MYSQL_PASSWORD: password
                MYSQL_DATABASE: subscManagement
                TZ: "Asia/Tokyo"
                BIND-ADDRESS: 0.0.0.0
            ports:
                - 3306:3306
            volumes:
                - db_data:/var/lib/mysql
            tty: true
    
        django:
            build:
                context: .
                dockerfile: Dockerfile_django
            command: python3 manage.py runserver 0.0.0.0:8000
            ports:
                - "8000:8000"
            volumes:
                - ./app:/app
            tty: true
            depends_on:
                - db
    
    volumes:
        db-data:
    

    컨테이너를 삭제해도 DB내의 데이터가 사라지지 않도록 volumes:로 볼륨을 작성하고 있습니다.

    컨테이너 실행



    다음 명령으로 docker-compose.yml을 기반으로 컨테이너를 실행합니다.
    $ docker-compose up --build -d
    

    컨테이너가 제대로 움직이고 있는지 확인!
    $ docker-compose ps
              Name                        Command               State                 Ports              
    -----------------------------------------------------------------------------------------------------
    subscmanagement_db_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
    subscmanagement_django_1   python3 manage.py runserve ...   Up      0.0.0.0:8000->8000/tcp 
    

    첫 번째 런타임에만 DB에 테이블을 만들려면 Django 측 컨테이너 내에서 다음 명령을 실행해야 합니다.
    # "docker exec -it コンテナ名 /bin/bash"等でコンテナ内に入ってから実行
    $ python manage.py migrate
    

    웹페이지 방문



    브라우저에서 웹 페이지에 액세스할 수 있는지 확인합니다.
    h tp://0.0.0.0:8000/아코응 ts/㎉/
    에 액세스!



    액세스에 성공했습니다! 계정을 만들고 로그인하고 데이터를 입력하면 제대로 저장되었으므로 DB에 저장 잘 작동하는 것 같습니다!



    덧붙여서 한번 컨테이너를 삭제하고 나서 다시 만들어도 데이터는 남아 있었기 때문에, 영속적인 데이터의 보존에도 성공했습니다!

    마지막으로



    이번에 처음 컨테이너를 만졌습니다만 컨테이너간(Django측에서 MySQL측)의 접속에 고생했습니다. DB에 연결 드라이버와 MySQL 이미지 버전 (Tag)의 조합에 따라 잘 연결할 수없는 것 같습니다. 이것은 MySQL:8에서 도입된 새로운 인증 기능에 접속 드라이버가 대응하고 있지 않는 경우가 있기 때문에 일어나고 있는 것 같습니다. 컨테이너 2개라도 상당히 고생했기 때문에 복잡한 시스템의 컨테이너화는 상당히 어려울 것 같다. . .

    좋은 웹페이지 즐겨찾기