docker는 할때마다 참 애를 먹였던 녀석입니다.
물론 실제로 도커하나로 앱서버와 데이터베이스를 한번에 구성하는 일은 없어야 하지만,
심플하게 구성해보고 싶은 마음에 만들어보았습니다.
언제나 잔가지는 필요할 때 추가하고, 기능이 돌아가기 위한 최소한을 구성하였습니다.
NodeJS App
FROM node:alpine
WORKDIR /app
COPY package*.json ./
COPY yarn.lock ./
RUN yarn
COPY . .
CMD ["yarn","start:docker"]
가장 간단하게 노드를 돌리는 컨테이너를 만드는 방법입니다.
도커를 빌드할 때 캐싱을 활용해서 빌드시간을 줄이기 위해서, 그냥 복사하지 않고,
package.json 을 별도로 복사합니다(이것은 국룰!)
Docker-compose ( + MySQL )
version: "3.9"
services:
slack-db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
ports:
- '3306:3306'
volumes:
- db-volume:/var/lib/mysql
networks:
- slack_network
slack-node-server:
build: .
ports:
- "3000:3000"
networks:
- slack_network
depends_on:
- slack-db
volumes:
db-volume:
networks:
slack_network:
.dockerignore
node_modules
CLI
docker build . -t slack-server
docker-compose --env-file ./.env.development up -d
저는 슬랙을 만들어 보면서 진행했습니다.
여기서 핵심은
1. env
2. volumes
3. networks
입니다.
1. 어떤 플랫폼을 사용하던지 환경변수로 값을 관리하는 것은 유지보수, 보안 측면에서 우수합니다.
docker-compose에서 그대로 날것은 값을 상요하지 않고, .env 파일을 자동으로 인식하기 때문에 ${} 문법을 사용하였습니다.
default 는 .env 이지만 cli에서 저처럼 변경해 줄 수 있습니다.
2. 볼륨을 사용하는 것은 데이터베이스 때문이었습니다.
서버 코드가 업데이트 되면 도커를 다시 패키징 하기 때문에, 디비도 모두 다시 설치되는 문제가 있습니다.
볼륨을 설정해두면 컨테이너가 새로 실행되어도, 지정한 저장소는 유지하게 되는데, mysql의 저장소를 지정하여, 데이터를 유지할 수 있도록 했습니다.
3. 네트워크는 서로다른 컨테이너 간의 통신을 위해 세팅해 주어야합니다.
docker-compose에서 네트워크를 선언하고, 컨테이너별로 묶어주면 alias가 생성됩니다.
alias란 localhost -> 127.0.0.1 과 같은 변수를 말합니다.
이때 컨테이너 이름들이 각각 도커상에서 내부 아이피를 가리키게 됩니다.
예시)
DB_HOST=slack-db
DB_PORT=3306
삽질 포인트
CMD ["yarn","start:docker"]
1. Dockerfile에서 명령어 실행부에 쌍따옴표를 해주어야 인식합니다.
'' single quote 가 손에 익은 저는 30분가량을 해맸습니다..
2. env파일 path는 cli 때 옵션으로 명시해줄 수 있습니다.
compose 파일에 env_file 속성을 명시해봤으나.. 인식되지 않습니다 (버근가..??)
'Dev-ops > docker' 카테고리의 다른 글
Docker 간단 정리 (0) | 2023.02.03 |
---|