본문 바로가기

잡다/docker

[docker] 도커파일 예시

오랜만에 도커를 사용하려고 하니 사용법이 잘 기억이 나지 않았다. 일종의 snipset으로 사용했던 코드를 올려둔다.

docker.compose.yml

 : aws을 사용할거라면 postgresql은 따로 포함하지 않아도 알아서 처리해준다.

version: "3"
services:
  client:
    image: "blaxsior/multi-client"
    mem_limit: 128m
    hostname: client
  server:
    image: "blaxsior/multi-server"
    mem_limit: 128m
    hostname: api
    environment:
      - REDIS_HOST=$REDIS_HOST
      - REDIS_PORT=$REDIS_PORT
      - PGUSER=$PGUSER
      - PGHOST=$PGHOST
      - PGDATABASE=$PGDATABASE
      - PGPASSWORD=$PGPASSWORD
      - PGPORT=$PGPORT
  worker:
    image: "blaxsior/multi-worker"
    mem_limit: 128m
    hostname: worker
    environment:
      - REDIS_HOST=$REDIS_HOST
      - REDIS_PORT=$REDIS_PORT
  nginx:
    image: "blaxsior/multi-nginx-"
    mem_limit: 128m
    hostname: nginx
    ports:
      - "80:80"

docker-compose.dev.yml

version: '3.9'
services:
  postgres: #service name
    image: 'postgres:latest'
    environment:
      - POSTGRES_PASSWORD=postgres_password
  redis:
    image: 'redis:latest'
  nginx:
    restart: always
    build:
      dockerfile: Dockerfile.dev
      context: ./nginx
    ports:
      - '8080:80'
    depends_on:
      - api
      - client
  api:
    depends_on:
      - postgres
      - redis
    build:
      dockerfile: Dockerfile.dev
      context: ./server
    volumes:
      - /home/node/app/node_modules
      - ./server:/home/node/app
    env_file:
      - ./postgres.env
      - ./redis.env
  client:
    build:
      dockerfile: Dockerfile.dev
      context: ./client
    volumes:
      - /app/node_modules
      - ./client:/app
  worker:
    build:
      dockerfile: Dockerfile.dev
      context: ./worker
    env_file:
      - ./redis.env
    volumes:
      - /home/node/app/node_modules
      - ./worker:/home/node/app
    depends_on:
      - redis

Dockerfile.dev

FROM node:alpine

ARG START_DIR=/home/node/app

USER node
# 설정에 에러 발생하는 경우
RUN mkdir ${START_DIR}
RUN chown -R node:node ${START_DIR}
WORKDIR ${START_DIR}
COPY ./package.json ./

RUN npm install

COPY . .
CMD ["npm", "run", "dev"]
FROM node:alpine

WORKDIR /app

COPY ./package.json ./
RUN npm install

COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]

Dockerfile

FROM node:alpine

ARG START_DIR=/home/node/app

USER node
RUN mkdir ${START_DIR}
RUN chown -R node:node ${START_DIR}
WORKDIR ${START_DIR}
COPY ./package.json ./

RUN npm install

COPY . .
CMD ["npm", "start"]
FROM node:alpine as builder

WORKDIR /app

COPY ./package.json ./
RUN npm install
COPY . .

RUN npm run build

FROM nginx
EXPOSE 3000

COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/.next /usr/share/nginx/html

# next js와 함께

nginx

FROM nginx
# COPY ./default.conf /etc/nginx/nginx.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
# nginx 의 경우
FROM nginx
# COPY ./default.conf /etc/nginx/nginx.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
upstream client {
    server client:3000;
}

upstream api {
    server api:5000;
}

server {
    listen 80;

    location / {
        proxy_pass http://client;
    }

    location /_next/webpack-hmr {
        proxy_pass http://client;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    location /api {
        rewrite /api/(.*) /$1 break;
        proxy_pass http://api;
    }
}
// nginx 설정 코드. 좀 더 공부가 필요하다...
server {
    listen 3000;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri.html $uri/ =404;
    }
}