ImageUs-docker

codakcodak·2023년 3월 8일
0

ImageUs

목록 보기
15/17
post-thumbnail

문제상황

  • 프로젝트를 모두 개발한 상태에서 배포를 하려면 먼저 EC2나 개인의 컴퓨터에 가상머신을 까는 방법등 여러가지가 있다.하지만 깃허브에 올라온 파일을 다운받고 코드를 구동시키기 위한 프로그램들이 필요하다.ImageUs에서는 elasticsearch,mysql,nginx,python 등의 실행환경을 세팅환경을 필요로 하는데 이모든 것을 다운하고 세팅하는 것은 상당한 시간과 노력이 필요하다.

해결방법

  • 실행환경 자체를 저장하고 구동하는 도커를 이용함으로서 도커프로그램이 있는 어떤 컴퓨터든 빠른시간에 배포를 완료하여 시간적,노력적 단축

적용과정

  1. 도커파일 작성

    • back>Dckerfile
    FROM python:3.10
    
    ADD requirements.txt /env/app/requirements.txt
    
    WORKDIR /env/app
    
    RUN pip install -r requirements.txt
    
    ADD . /app
    
    WORKDIR /app
    
    CMD [ "gunicorn","--worker-class","gevent","--worker-connections","500","--workers","9","--bind","0.0.0.0:4000","--log-level","debug","--capture-output","--access-logfile","access.log","--error-logfile","error.log","--max-requests","500","--max-requests-jitter","500","--timeout","5","-m","007","app:create_app()"]
    • image_back>Dockerfile
    FROM python:3.10
    
    ADD requirements.txt /env/app/requirements.txt
    
    WORKDIR /env/app
    
    RUN pip install -r requirements.txt
    
    ADD . /app
    
    WORKDIR /app
    
    CMD [ "gunicorn","--worker-class","gevent","--worker-connections","500","--workers","4","--bind","0.0.0.0:4001","--log-level","debug","--capture-output","--access-logfile","access.log","--error-logfile","error.log","--max-requests","500","--max-requests-jitter","500","--timeout","5","-m","007","app:create_app()"]
    • nginx>Dockerfile
    FROM nginx:1.21.3
    
    RUN rm /etc/nginx/nginx.conf
    
    COPY nginx.conf /etc/nginx
    
    RUN rm /etc/nginx/conf.d/default.conf
    
    COPY default.conf /etc/nginx/conf.d/

2.elasticsearch index초기화

  • elasticsearch를 docker로 구동할 순 있지만 컨테이너가 돌아가는 시점에 이미 원하는 인덱스로 초기화된 elasticsearch를 이용하기 위해 초기화를 하는 컨테이너 서비스를 생성

  • elasticsearch_config>Dockerfile

FROM ubuntu:18.04

RUN apt-get -y update
RUN apt-get -y install curl

ADD init_index.sh /init_index.sh

RUN ["chmod", "+x", "/init_index.sh"]

*베이스 레이어를 우분투로 시작하는데 http요청을 보내기 위해 curl을 설치하고 http요청 명령이 적힌 sh파일을 복사 및 전체권한 설정

  • elasticsearch_config>init_index.sh
curl --location --request PUT 'http://host.docker.internal:9200/image_us' \
--header 'Content-Type: application/json' \
--data-raw '{
  "settings": {
    "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "my_tokenizer"
                }
            },
            "tokenizer": {
                "my_tokenizer": {
                    "type": "ngram",
                    "min_gram": 1,
                    "max_gram": 30,
                    "token_chars": [
                        "letter",
                        "digit",
                        "punctuation"
                    ]
                }
            }
        },
        "max_ngram_diff":30
    }
}'

curl --location --request PUT 'http://host.docker.internal:9200/image_us/_mapping' \
--header 'Content-Type: application/json' \
--data-raw '{
    "properties": {
        "email": {
            "type": "text",
            "analyzer": "my_analyzer",
            "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
        },
        "name": {
                    "type": "keyword"
        }
    }
}'

curl --location --request PUT 'http://host.docker.internal:9200/image_us/_doc/1' \
--header 'Content-Type: application/json' \
--data-raw '{
  "email": "test1@test.com",
  "id": 1,
  "name":"test1"
}'

curl --location --request PUT 'http://host.docker.internal:9200/image_us/_doc/2' \
--header 'Content-Type: application/json' \
--data-raw '{
  "email": "test2@test.com",
  "id": 2,
  "name":"test2"
}'

curl --location --request PUT 'http://host.docker.internal:9200/image_us/_doc/3' \
--header 'Content-Type: application/json' \
--data-raw '{
  "email": "test3@test.com",
  "id": 3,
  "name":"test3"
}'
  • elasticsearch의 url에 put 요청을 보내 인덱스를 초기화하는 명령어

3.docker-compose.yml 작성

  • 현재 back_server,image_server,nginx는
    설정값들을 적용하여 빌드해야 하기 때문에 직접 docker파일을 작성하고 elasticsearch는 기본적인 이미지를 사용하기 때문에 docker-compose.yml에 작성
version: "3.7"
services:
  db:
    build: ./mysql
    container_name: imageus_back_mysql
    restart: always
    ports:
      - '3333:3306'
  
  imageus_back:
    build:  ./back
    container_name:  imageus_back
    depends_on:
      - db
    restart:  always
    expose:
      - "4000"

  imageus_image:
    build:  ./image_back
    container_name:  imageus_image
    depends_on:
      - db
    restart:  always
    expose:
      - "4001"
  
  nginx:
    build:  ./nginx
    container_name: nginx_imageus
    restart:  always
    ports:
      - "0.0.0.0:80:80"
    depends_on:
      - imageus_back
      - imageus_image
    platform: linux/amd64
  
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
    container_name: elasticsearch
    environment:
      - cluster.name=es-docker
      - node.name=node1
      - bootstrap.memory_lock=true
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
    ports:
      - 9200:9200
    restart: always
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    platform: linux/amd64
    healthcheck:
      test: curl -u elastic:elastic -s -f elasticsearch:9200/_cat/health >/dev/null || exit 1
      interval: 20s
      timeout: 5s
      retries: 100
    mem_limit: 4g

  elasticsearch_config:
    build:  ./elasticsearch_config
    container_name: elastic_init_index
    restart: "no"
    depends_on:
      elasticsearch: 
        condition: service_healthy
    extra_hosts:
        - host.docker.internal:host-gateway 
    entrypoint: [ "bash","init_index.sh"]     

*구동환경이 m1이기 때문에 추후 우분투 환경에서 돌리기 위해서는 platform에 linux/amd64를 명시

*컨테이너 구동시에 elasticsearch의 index를 초기화 하기 위해 elasticsearch_config라는 서비스를 만들어줬고 해당 서비스의 순서를 elasticsearch->elsticsearch_config순으로 가동해야 정상적으로 인덱스가 생성 되기 때문에 elasticsearch에 healthcheck와 test라는 옵션을 생성하여 순차적 컨테이너 실행

4.도커 실행

  • run-docker.sh
echo killing old docker processes
docker-compose rm -fs

echo building docker containers
docker-compose up --build -d

*docker-compose를 실행 할 때 전의 서비스들을 모두 삭제하고 시작해야하므로 명령어를 한번에 기술한 sh파일을 작성하여 sh파일을 실행

bash run-docker.sh

5.결과확인

  • url접속

결과

  • 개인의 우분투환경의 가상머신에서 gitpull 하여 명령어 하나만 치면 실행환경을 포함하여 서비스를 구동하기 때문에 시간적으로 단축

  • docker hub의 다양한 기본 이미지들을 사용 할 수 있어 다양한 환경을 쉽게 구축

profile
숲을 보는 코더

0개의 댓글