๐Ÿณ Dockerfile, docker-compose.yml

Hongยท2023๋…„ 5์›” 1์ผ
0

ํšŒ์‚ฌ์—์„œ ๊ฐœ๋ฐœํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ AWS EC2์—์„œ ๋ฐฐํฌํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๋ถ„๊ป˜ nginx์™€ WAS๋ฅผ ์ผ๋ƒ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ฒŒ๋˜๊ณ ..(์ง„์งœ ๋ฌด์‹ํ•ด์„œ ์šฉ๊ฐํ–ˆ๋„ค..) ํ”ผ๋“œ๋ฐฑ์„ ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ง€๋‚œ ์ฃผ์—
dockerize, pm2 ๋“ฑ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ๋“ค์ด๋‹ค.
ํŠนํžˆ ์ด ํฌ์ŠคํŠธ๋Š” Dockerfile, docker-compose.yml์„ ๋งŒ๋“œ๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.



๐ŸšจDocker container๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ง€์†์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  exited๋œ๋‹ค.

[Docker] container์„ run, start ํ–ˆ์„ ๋•Œ, ๋ฐ”๋กœ ๊บผ์ง€๋Š”(Exitted) ์ด์œ 

**๊ฐœ๋ฐœ์ž๊ฐ€ ์ฒ˜์Œ Docker ์ ‘ํ• ๋•Œ ์˜ค๋Š” ๋ฉ˜๋ถ• ๋ช‡๊ฐ€์ง€**

โ†’ ๊ทผ๋ฐ ๊ทธ๋ƒฅ ๋‹ค ํ•„์š”์—†๊ณ .. CMD [โ€™nodeโ€™, โ€˜controller.jsโ€™]๋ฅผ โ€˜โ€™๋กœ ์ ์–ด์„œ ๊ทธ๋žฌ๋‹ค.. โ€œโ€์•ˆ์— ์ ์–ด์ฃผ๋ฉด ์ž˜๋จ..


  • ๐Ÿ–ฅ๏ธย ์‚ฌ์šฉํ•œ Docker ๋ช…๋ น์–ด ์ •๋ฆฌ

    /*
    app/backend/Dockerfile
    */
    
    # backendํด๋” ์•ˆ์— ๋“ค์–ด์žˆ๋Š” Dockerfile์„ buildํ•ด์„œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ฌ 
    docker build -t backend .
    
    # docker imageํŒŒ์ผ์„ run(create + start)ํ• ๊ฑฐ๋‹ค my_backcontainer๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค๊ฒƒ์ด๋ฉฐ backend๋ผ๋Š” image๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค
    # -d: detached mode (๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ID๋ฅผ ์ถœ๋ ฅ)
    # -it: interactive mode with a pseudo-TTY (ํ„ฐ๋ฏธ๋„ ์ ‘์†์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์˜ต์…˜)
    # -p: port mapping (ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํฌํŠธ ๋งคํ•‘)
    docker run -d -it -p 8080:4982 --name my_backcontainer backend
    
    # ๋งŒ๋“ค์–ด์ง„ docker container์•ˆ์— ์ ‘์†ํ•ด์„œ ""์•ˆ์— ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค
    docker exec -it my_backcontainer "ls"
    
    /*
    app/client/Dockerfile
    */
    
    # clientํด๋” ์•ˆ์— ๋“ค์–ด์žˆ๋Š” Dockerfile์„ buildํ•ด์„œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ฌ
    docker build -t client .
    
    # docker imageํŒŒ์ผ์„ run(create + start)ํ• ๊ฑฐ๋‹ค my_clientcontainer๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค๊ฒƒ์ด๋ฉฐ backend๋ผ๋Š” image๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค
    # react app build๋งŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— -p ์˜ต์…˜์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
    docker run -d -it --name my_clientcontainer client
    
    /*
    app/nginx/Dockerfile
    */
    
    # nginxํด๋” ์•ˆ์— ๋“ค์–ด์žˆ๋Š” Dockerfile์„ buildํ•ด์„œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ฌ
    docker build -t nginx .
    
    # docker imageํŒŒ์ผ์„ run(create + start)ํ• ๊ฑฐ๋‹ค my_nginxcontainer๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค๊ฒƒ์ด๋ฉฐ backend๋ผ๋Š” image๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค
    docker run -d -it -p 80:80 --name my_nginxcontainer nginx
    
    /*
    Docerk Terminal ๋ช…๋ น์–ด
    */
    
    # ์‹คํ–‰ ์ค‘ container ํ™•์ธ
    docker ps
    
    # ์‹คํ–‰ ์ค‘ ๋ชจ๋“  container ํ™•์ธ
    docker ps -a 
    
    # ์ด๋ฏธ์ง€ ์ œ๊ฑฐ
    docker rmi -f backend
    or
    docker rmi ์ด๋ฏธ์ง€๋„˜๋ฒ„
    
    # ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ
    docker rm my_backendcontainer
    
    # ์ด๋ฏธ์ง€ ์ œ๊ฑฐ
    docker rmi -f backend
    
    # ์‹คํ–‰์ค‘ ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€
    docker stop my_backendcontainer
    
    # docker-compose.ymlํŒŒ์ผ ์‹คํ–‰
    docker compose up -d
    
    # docker-compose.ymlํŒŒ์ผ ์ค‘๋‹จ
    docker compose down
    




  • ๐Ÿ“‚์‚ฌ์šฉํ•œ Dockerfile ์ •๋ฆฌ

    /*
    app/backend/Dockerfile
    */
    
    # nodejs ์„ค์น˜
    FROM node:16.17.0-alpine
    
    # ์ด๋ฏธ์ง€ ์•ˆ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ์œ„์น˜๋ฅผ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•  ์žฅ์†Œ๋กœ ์„ค์ •ํ•œ๋‹ค
    WORKDIR /usr/backend
    
    # ์•ฑ์˜์กด์„ฑ ์ €์žฅ
    COPY  package*.json ./
    
    # ํ”„๋กœ๋•์…˜์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰๋  ๋ช…๋ น์–ด (npm ci์ปค๋งจ๋“œ๋Š” ์˜์กด์„ฑ ํŒŒ์ผ์„ ์„ค์น˜ํ•ด์ค€๋‹ค, omit์˜ต์…˜=dev๋Š” ์˜์กด์„ฑ ์ค‘ ์ œ์™ธํ•  ํŒŒ์ผ์„ ์„ค์ •ํ•œ๋‹ค ๊ฐœ๋ฐœ ์˜์กด์„ฑ์„ ์ œ์™ธํ–ˆ๋‹ค.)
    # pm2์ตœ์‹  ๋ฒ„์ „๋„ ๊ฐ™์ด ์„ค์น˜ํ•ด์ค€๋‹ค
    RUN npm install
    RUN npm install -g pm2@latest
    
    # ์ด๋ฏธ์ง€ ์•ˆ์— ์•ฑ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค
    COPY . .
    
    # nodejs ๋Ÿฐํƒ€์ž„ ์‹คํ–‰์„ ์œ„ํ•ด ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ ์–ด์ค€๋‹ค(WORKDIR ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋œ๋‹ค), ์‹คํ–‰ ๋ช…๋ น์–ด๋ฅผ ์ ˆ๋Œ€ ''๋กœ ์ ์œผ๋ฉด ์•ˆ๋œ๋‹ค..
    CMD ["node", "controller.js"]
    /*
    app/client/Dockerfile
    */
    
    # nodejs ์„ค์น˜
    FROM node:16.17.0-alpine
    
    # ์ด๋ฏธ์ง€ ์•ˆ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ์œ„์น˜๋ฅผ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•  ์žฅ์†Œ๋กœ ์„ค์ •ํ•œ๋‹ค
    WORKDIR /usr/client
    
    # ์•ฑ์˜์กด์„ฑ ์ €์žฅ
    COPY  package*.json ./
    
    # ์•ฑ์˜์กด์„ฑ ์„ค์น˜
    RUN npm install
    RUN npm install react-cookie
    RUN npm install react-js-pagination
    RUN npm install axios
    
    # ์ด๋ฏธ์ง€ ์•ˆ์— ์•ฑ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค
    COPY . .
    
    # build the application
    RUN npm run build
    /*
    app/nginx/Dockerfile
    */
    
    # nginx ์„ค์น˜
    FROM nginx:latest
    
    # Dockerfile script๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์œ„์น˜๋ฅผ ์„ค์ •ํ•œ๋‹ค
    WORKDIR /
    
    # docker-compose๋กœ๋ถ€ํ„ฐ ๋„˜์–ด์˜ค๋Š” client์˜ react build app volumes๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค 
    RUN mkdir /build
    
    # nginx ์„ค์ • ํŒŒ์ผ ๋ณต์‚ฌ
    COPY nginx.conf /etc/nginx/nginx.conf
    
    # start nginx
    CMD ["nginx" ,"-g", "daemon off;"]
      /
      app/docker-compose.yml
      /
    
      version: '3.8'
    
      services:
        nginx:
          container_name: my_nginxcontainer
          # dockerfile์„ buildํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค context์—๋Š” ๋นŒ๋“œํ•˜๊ณ ์žํ•˜๋Š” dockerfile์ด ์กด์žฌํ•˜๋Š” ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ค€๋‹ค 
          build:
            context: ./nginx
          # ":"๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ host OS์—์„œ ๊ฐ€์ ธ์™€์„œ container์— ์ฃผ์ž…์‹œํ‚ฌ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ ๋Š”๋‹ค
              # ":"๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ์€ host OS์—์„œ ๊ฐ€์ ธ์˜จ ํŒŒ์ผ์„ container์–ด๋””์— ๋„ฃ์„์ง€ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ ๋Š”๋‹ค
          volumes: 
            - ./nginx/nginx.conf:/etc/nginx/nginx.conf
                  - ./client/build:/build
                  - /etc/letsencrypt:/letsencrypt
          # depend_on์— ์ ์–ด์ฃผ๋Š” image๋Š” ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผํ•  image๊ฐ€ ๋ฌด์—‡์ด ๋˜์–ด์•ผํ• ์ง€ ์ ์–ด์ค€๋‹ค(client์˜ ์ด๋ฏธ์ง€๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  nginx๋ฅผ ์ ์–ด์ค˜์•ผ ํ•จ)
          depends_on:
            - client
              # ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ณต๊ฐœํ•˜๋Š” ports๋ฅผ ์ง€์ •ํ•œ๋‹ค. 'ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ํฌํŠธ ๋ฒˆํ˜ธ : ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ ๋ฒˆํ˜ธ'
              expose:
            - "80"    
              ports: 
            - "80:80"
          # networks๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
          networks:
            - backend
          restart: always
    
          client:
          container_name: my_clientcontainer
          build:
            context: ./client
          depends_on:
            - backend
    
        backend:
          container_name: my_backendcontainer
          build:
            context: ./backend
              # backend์—์„œ api์š”์ฒญ์— ๋”ฐ๋ฅธ ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ databaseํด๋”๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— backend container์•ˆ์— volumes๋กœ ๋„ฃ์–ด์ค€๋‹ค
              volumes:
            - ./database:/usr/database
              expose:
            - "4298"
          ports:
            - "4298:4298"
          networks:
            - nginx
    
      networks:
        nginx:
        backend:
profile
Notorious

0๊ฐœ์˜ ๋Œ“๊ธ€