문제상황
해결방법
적용과정
도커파일 작성
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()"]
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()"]
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파일을 복사 및 전체권한 설정
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"
}'
3.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.도커 실행
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.결과확인
결과
개인의 우분투환경의 가상머신에서 gitpull 하여 명령어 하나만 치면 실행환경을 포함하여 서비스를 구동하기 때문에 시간적으로 단축
docker hub의 다양한 기본 이미지들을 사용 할 수 있어 다양한 환경을 쉽게 구축