【DynamoDB】【Docker】docker-compose로 DynamoDB와 Django의 개발 환경을 구축한다

docker-compose로 DynamoDB와 Django 개발 환경 구축



소개



DynamoDB는 싸고 빠르고 좋네요. 그런 DynamoDB를 로컬로 개발하기 위한 DockerImage가 있다는 것을 아십니까? 그런 DockerImage를 이용한 개발 환경 구축의 일례를 조회합니다.

환경



프로덕션 환경에 맞게 사용하는 이미지 버전은 다음과 같습니다.
DynamoDB GUI 작업에 dynamodb-admin 을 사용합니다. Node는 그 환경을 함께 구축할 때에 이용합니다.


환경
버전


파이썬
3.7.4

MySQL
5.7

Node
10.16.3-알핀


환경 구축



장고와 MySQL



완전히 처음부터 빌드하므로 먼저 장고 프로젝트를 시작합니다.
공식 Django 이미지는 버전이 오래되었으므로 스스로 만듭니다.
$ django-admin startproject dynamodb_example
$ cd dynamodb_example/
$ touch docker-compose.yml
$ touch Dockerfile
FROM python:3.7.4

RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils gettext
RUN mkdir /app; mkdir /app/dynamodb_example

WORKDIR /app
COPY dynamodb_example /app/dynamodb_example
COPY requirements.txt /app/
COPY manage.py /app/

RUN pip install -r requirements.txt

EXPOSE 8080
CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]

docker-compose.yml
version: "3"
services:
  mysql:
    container_name: example-mysql
    ports:
      - 53306:3306
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./persist/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_USER: example
      MYSQL_PASSWORD: example
      MYSQL_DATABASE: example
      MYSQL_ROOT_PASSWORD: example

  django:
    container_name: example-django
    build: .
    volumes:
      - .:/app
    working_dir: /app
    command: sh -c "./wait-for-it.sh db:3306; python3 manage.py runserver 0.0.0.0:8000"
    env_file: .env
    ports:
      - 58080:8000
    depends_on:
      - mysql

포트가 50000대인 것은 절대 쓰고 싶지 않기 때문입니다. 특히 의미가 없습니다.
DynamoDB와 연결하기위한 라이브러리는 boto3과 그것을 Wrap하고있는 pynamodb를 넣어 둡니다.

requirements.txt
boto3
pynamodb
Django==2.2.4
djangorestframework==3.10.3
django-filter
mysqlclient==1.3.13

환경 변수의 의미를 그다지 하지는 않지만 일단…
DB_ENGINE=django.db.backends.mysql
DB_HOST=mysql
DB_DATABASE=example
DB_USERNAME=root
DB_PASSWORD=example
DB_PORT=3306

우선 Django와 MySQL의 소통을 확인하고 싶으므로 Django의 DATABASES를 다시 씁니다.

setting.py
DATABASES = {
    'default': {
        'ENGINE': os.getenv('DB_ENGINE'),
        'NAME': os.getenv('DB_DATABASE'),
        'USER': os.getenv('DB_USERNAME'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'OPTIONS': {
            'init_command': 'SET foreign_key_checks = 0;',
            'charset': 'utf8mb4',
        },
    }
}

여기까지 오면 우선 기동할지 확인합니다.
$ docker-compose up -d
$ docker-compose exec django bash
$ python manage.py migrate

문제가 없으면 DynamoDB Local과 dynamodb-admin을 넣습니다.

DynamoDB 로컬



docker-compose.yml에 dynamodb를 나열합니다.
영구적으로 명령 끝에 dbPath를 지정합니다.

docker-compose.yml
  dynamodb:
    container_name: example-dynamodb
    image: amazon/dynamodb-local
    command: -jar DynamoDBLocal.jar -dbPath /home/dynamodblocal/data
    volumes:
      - ./persist/dynamodb:/home/dynamodblocal/data
    ports:
      - 50706:8000

dynamodb-admin



공식 이미지가 있었습니다만, 만들어 버렸으므로 그쪽을 이용합니다.
$ mkdir dynamodb-admin
$ touch dynamodb-admin/Dockerfile
$ touch dynamodb-admin/.env
FROM node:10.16.3-alpine

RUN ["apk", "update"]
RUN ["npm", "install", "dynamodb-admin", "-g"]

EXPOSE 50727
CMD ["dynamodb-admin", "-p", "50727"]

환경 변수 DYNAMO_ENDPOINT는 dynamodb의 컨테이너 서비스 이름과 컨테이너 측 포트를 지정합니다.
DYNAMO_ENDPOINT=http://dynamodb:8000
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=ACCESS_ID
AWS_SECRET_ACCESS_KEY=ACCESS_KEY

이 dyanamodb-admin을 추가한 최종 docker-compose.yml 파일은 다음과 같습니다.

docker-compose.yml
version: "3"
services:
  dynamodb:
    container_name: example-dynamodb
    image: amazon/dynamodb-local
    command: -jar DynamoDBLocal.jar -dbPath /home/dynamodblocal/data
    volumes:
      - ./persist/dynamodb:/home/dynamodblocal/data
    ports:
      - 50706:8000
  dynamodb-admin:
    container_name: example-dynamodb-admin
    build: dynamodb-admin/
    command: dynamodb-admin -p 8000
    env_file: dynamodb-admin/.env
    ports:
      - 50727:8000
    depends_on:
      - dynamodb
  mysql:
    container_name: example-mysql
    ports:
      - 53306:3306
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./persist/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_USER: example
      MYSQL_PASSWORD: example
      MYSQL_DATABASE: example
      MYSQL_ROOT_PASSWORD: example
  django:
    container_name: example-django
    build: .
    volumes:
      - .:/app
    working_dir: /app
    command: sh -c "./wait-for-it.sh db:3306; python3 manage.py runserver 0.0.0.0:8000"
    env_file: .env
    ports:
      - 58080:8000
    depends_on:
      - mysql
      - dynamodb

http://localhost:50727 를 브라우저로 표시해 이하와 같이 표시되고 있으면 성공입니다.

Create Table등 하고 싶은 무제한입니다.

지속성 확인



적당히 테이블을 만들어 보겠습니다.

만들어졌습니다.


컨테이너를 삭제하고 다시 시작합니다.
$ docker-compose down
$ docker-compose up -d

http://localhost:50727 을 열고 앞의 테이블이 남아 있으면 영속화 잘 하고 있습니다.

마지막으로



이 리포지토리는 아래에 게시됩니다. 향후 갱신할지도 모르기 때문에 tag는 1.0.0입니다.
htps : // 기주 b. 코 m / 코헤이 y0727 / 에어 mpぇ_dy 나모 db
그렇다면 사용하십시오.

좋은 웹페이지 즐겨찾기