MS : Docker ์ž์Šต์„œ ์ •๋ฆฌ

    ๋ฐ˜์‘ํ˜•

    1๋ถ€ : ์‹œ์ž‘

    ์ปจํ…Œ์ด๋„ˆ?

    ์ปจํ…Œ์ด๋„ˆ๋Š” ์•ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ „์ฒด ์šด์˜ ์ฒด์ œ์˜ ์ „์ฒด ํฌ๊ธฐ์™€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋Š” VM(๊ฐ€์ƒ ๋จธ์‹ )๊ณผ ๊ฐ™์€ ์†Œ๊ทœ๋ชจ ๊ฐ€์ƒํ™” ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.
    ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด  ์ปจํ…Œ์ด๋„ˆ๋Š” ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌ๋œ, ์‚ฌ์šฉ์ž ๋จธ์‹ ์˜ ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. 

     

    ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€?

    ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฒฉ๋ฆฌ๋œ ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ์ผ์‹œ์Šคํ…œ์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์—๋Š” ์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ(๋ชจ๋“  ์ข…์†์„ฑ, ๊ตฌ์„ฑ, ์Šคํฌ๋ฆฝํŠธ, ์ด์ง„ ํŒŒ์ผ ๋“ฑ)์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ์ง€์—๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ๋ช…๋ น, ๊ธฐํƒ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

     

    docker ์‹คํ–‰๋ช…๋ น

    docker run -d -p 80:80 docker/getting-started
    -d : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ถ„๋ฆฌ ๋ชจ๋“œ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰.
    -p : ํ˜ธ์ŠคํŠธ์˜ ํฌํŠธ 80์„ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ 80์— ์—ฐ๊ฒฐ

    2๋ถ€ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

    ์•ฑ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ, ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด์„  Dockerfile ์ด๋ž€๊ฒŒ ํ•„์š”ํ•˜๋‹ค.

    Dockerfile?

    Dockerfile์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ช…๋ น ์Šคํฌ๋ฆฝํŠธ

     

    FROM node:12-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "/app/src/index.js"]

     

    * Apple M1 ํ™˜๊ฒฝ์—์„œ๋Š” python ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ์•„๋ž˜ ๋‚ด์šฉ์œผ๋กœ ๋นŒ๋“œํ•˜์˜€๋‹ค.

    FROM node:12-alpine
    RUN apk add --no-cache python2 g++ make
    WORKDIR /app
    COPY . .
    RUN apk --no-cache --virtual build-dependencies add \
      python2 \
      make \
      g++
    RUN yarn install --production
    CMD ["node", "src/index.js"]

     

    Docker Image ๋นŒ๋“œ ๋ช…๋ น

    docker build -t getting-started .
    -t : ํƒœ๊ทธ ๋„ค์ž„ ์ง€์ •, ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ตœ์ข… ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.

     

    Docker Image Run ๋ช…๋ น

    docker run -dp 3000:3000 getting-started

    3๋ถ€ : ์•ฑ ์—…๋ฐ์ดํŠธ

    CLI๋ฅผ ์‚ฌ์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ

    Docker ์กฐํšŒ

    docker ps

     

    Docker Stop

    # Swap out <the-container-id> with the ID from docker ps
    docker stop <the-container-id>

     

    Docker ์ œ๊ฑฐ

    docker rm <the-container-id>
    docker rm ๋ช…๋ น์— “force” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์˜ˆ: docker rm -f <the-container-id>

    4๋ถ€ : ์•ฑ ๊ณต์œ 

    ์ด๋ฏธ์ง€ ํ‘ธ์‹œ - Docker Hub

    Docker Hub ์— Docker ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ.

    ๋นˆ ์ƒํƒœ์˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ์ด ๊ณณ์— ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œ ํ•  ์ˆ˜ ์žˆ์Œ. 

    $ docker push docker/getting-started
    The push refers to repository [docker.io/docker/getting-started]
    An image does not exist locally with the tag: docker/getting-started

    ์ฒซ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•˜๊ฒŒ ๋˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋Š”๋ฐ ์ด๋Š” ์ด๋ฏธ์ง€์— ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ. ๋”ฐ๋ผ์„œ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์™€ ๋™์ผํ•˜๊ฒŒ ๋„ค์ด๋ฐ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

     

    CLI - Docker Login

    docker login -u <username>

     

    Image Name ์ง€์ •ํ•˜๊ธฐ

    docker tag getting-started <username>/getting-started:<tagname>

     

    Image Push 

    docker push <username>/getting-started:<tagname>

     

    tagname์€ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด latest ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.

     

     

    ์ƒˆ ์ธ์Šคํ„ด์Šค์—์„œ ์ด๋ฏธ์ง€ ์‹คํ–‰ํ•˜๊ธฐ

     

    ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์—์„œ ์ด๋ฏธ์ง€๋ฅผ pull ๋ฐ›์•„ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.

    Play With Docker ๋ผ๋Š” ์‚ฌ์ดํŠธ์—์„œ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ.

    ์œ„ ์ฒ˜๋Ÿผ 3000๋ฐฐ์ง€๊ฐ€ ๋œจ๋ฉด running์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด ์ง„ ๊ฒƒ. ์ดํ›„ ํ•ด๋‹น ๋ฐฐ์ง€ ํด๋ฆญ์„ ํ†ตํ•ด ๊ตฌ๋™ ์ค‘์ธ ๋ชจ์Šต์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ** Apple M1 ์นฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ, ํ•ด๋‹น ํ˜ธ์ŠคํŠธ์˜ ํ™˜๊ฒฝ์ธ linux/arm64/v8 ๋กœ ๋นŒ๋“œ๋˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์‚ฌ์ดํŠธ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Docker build ๋ช…๋ น ์‹œ "--platform linux/amd64" ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋นŒ๋“œํ•˜๋ฉด ํ•ด๋‹น ํ™˜๊ฒฝ์œผ๋กœ ๋นŒ๋“œ๋œ๋‹ค.


    5๋ถ€ : ๋ฐ์ดํ„ฐ ์œ ์ง€

    ์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ ์‹œ์Šคํ…œ

    ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹คํ–‰ ์‹œ ์ด๋ฏธ์ง€์˜ ๋‹ค์–‘ํ•œ ๊ณ„์ธต์„ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด “์Šคํฌ๋ž˜์น˜ ๊ณต๊ฐ„”์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ‘๊ฒฝ์šฐ์—๋„’ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—๋Š” ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

     

    ์ปจํ…Œ์ด๋„ˆ ๋ณผ๋ฅจ

    ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ.
    ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ํ˜น์€ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๋™์ผํ•œ ๊ฒฝ๋กœ๋กœ ํƒ‘์žฌํ•˜๋ฉด ๋˜‘๊ฐ™์ด ํ‘œ์‹œ๋œ๋‹ค. 

     

    Named Volume(๋ช…๋ช…๋œ ๋ณผ๋ฅจ)

    ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ๋ฒ„ํ‚ท์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    Docker์—์„œ ๋””์Šคํฌ ์ƒ์˜ ์‹ค์ œ ์œ„์น˜๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋ณผ๋ฅจ ์ด๋ฆ„๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

    ๋ณผ๋ฅจ ์ƒ์„ฑ

    docker volume create <volume-name>

     

    ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ, ๋ณผ๋ฅจ ํƒ‘์žฌ

    docker run -dp 3000:3000 -v <volume-name>:<ํƒ‘์žฌํ•  ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ> <image-name>

     

    ์ด๋Ÿฐ ์‹์œผ๋กœ, ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜๊ฒŒ๋” ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    * ๊ธฐ๋ณธ Docker ์—”์ง„ ์„ค์น˜์—์„œ ์ง€์›๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๋ณผ๋ฅจ ์œ ํ˜•์ด์ง€๋งŒ NFS, SFTP, NetApp ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

     

    ๋ณผ๋ฅจ ํ™•์ธํ•˜๊ธฐ

    docker volume inspect <volume-name>

     

     

    Mountpoint๊ฐ€ ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์‹ค์ œ ์œ„์น˜์ž…๋‹ˆ๋‹ค. 

    ** Docker Desktop์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ Docker Desktop์˜ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์•ก์„ธ์Šค ํ•˜๋Š” Docker ๋ช…๋ น์€ ์‹ค์ œ๋กœ ๋จธ์‹ ์˜ ์ž‘์€ VM ๋‚ด์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Mountpoint ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์‹ค์ œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋จผ์ € VM ๋‚ด๋ถ€์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WSL 2์—์„œ๋Š” WSL 2 ๋ฐฐํฌํŒ ๋‚ด์— ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


    6๋ถ€ : ๋ฐ”์ธ๋“œ ํƒ‘์žฌ ์‚ฌ์šฉ

    ๋ฐ”์ธ๋“œ ํƒ‘์žฌ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ŠคํŠธ์˜ ํƒ‘์žฌ ์ง€์ ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ๋ฐ์ดํ„ฐ ์œ ์ง€๋ฟ ์•„๋‹ˆ๋ผ ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์—… ์‹œ ๋ฐ”์ธ๋“œ ํƒ‘์žฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ํƒ‘์žฌํ•˜๋ฉด ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜๊ณ  ์‘๋‹ตํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ๋กœ ํ™•์ธ.

    docker run -dp 3000:3000 -w /app -v ${PWD}:/app node:12-alpine sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
    • -w /app - ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ
    • -v ${PWD}:/app" - ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ํ˜ธ์ŠคํŠธ์˜ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ /app ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ฐ”์ธ๋“œ ํƒ‘์žฌํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐ”์ธ๋“œ ํƒ‘์žฌ ์‚ฌ์šฉ์€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„ค์ •์—์„œ ‘๋งค์šฐ’ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋จธ์‹ ์— ๋ชจ๋“  ๋นŒ๋“œ ๋„๊ตฌ์™€ ํ™˜๊ฒฝ์„ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ด์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ docker run ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํ’€๋˜์–ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

     

    ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ vs ๋ณผ๋ฅจ

    - ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ์˜ ๊ฒฝ์šฐ, ํ˜ธ์ŠคํŠธ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋Ÿฌ๋‹ ์‹œ, ๋งˆ์šดํŠธํ•˜์—ฌ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ํ•จ. ๋”ฐ๋ผ์„œ, ์ˆ˜์ •์ด ์ผ์–ด๋‚˜๋„ ๋ฐ”๋กœ๋ฐ”๋กœ ๋ฐ˜์˜๋จ
    ( ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ”๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅ )

    - ๋ณผ๋ฅจ์˜ ๊ฒฝ์šฐ, ํ˜ธ์ŠคํŠธ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋„์ปค์˜ ๋ณผ๋ฅจ ์˜์—ญ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์™€ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋ณผ๋ฅจ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•œ๋‹ค. 
    ( ๋„์ปค์˜ ๋ณผ๋ฅจ ์˜์—ญ์—์„œ ์ œ์–ด๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ๋ฐ”๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค )
    --> ๊ทธ๋Ÿฌ๋ฉด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ?

     

    ๋ณผ๋ฅจ์ด ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ณด๋‹ค ์ข‹์€ ์žฅ์  From Docker Docs

    1. ๋ฐฑ์—…ํ•˜๊ฑฐ๋‚˜ ์ด๋™์‹œํ‚ค๊ธฐ ์‰ฝ๋‹ค.

    2. docker CLI ๋ช…๋ น์–ด๋กœ ๋ณผ๋ฅจ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    3. ๋ณผ๋ฅจ์€ ๋ฆฌ๋ˆ…์Šค, ์œˆ๋„์šฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ชจ๋‘ ๋™์ž‘ํ•œ๋‹ค.

    4. ์ปจํ…Œ์ด๋„ˆ๊ฐ„์— ๋ณผ๋ฅจ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    5. ๋ณผ๋ฅจ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณผ๋ฅจ์˜ ๋‚ด์šฉ์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    6. ์ƒˆ๋กœ์šด ๋ณผ๋ฅจ์€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค.


    7๋ถ€ : ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์•ฑ

    ์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํ‚น 

    ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์•ฑ ๋ผ๋ฆฌ๋Š” ์ƒํ˜ธ๊ฐ„ ํ†ต์‹  ๊ทœ์•ฝ์— ๋”ฐ๋ผ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    MySQL ์—ฐ๊ฒฐํ•˜๊ธฐ

    Docker Network ์ƒ์„ฑ

    docker network create <network-name>

     

    MySQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ Network ์—ฐ๊ฒฐ

    docker run --platform linux/x86_64 -d \
    --network <network-name> --network-alias mysql \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:5.7

    * ์—ฌ๊ธฐ์„œ๋Š” todo-mysql-data๋ผ๋Š” ๋ณผ๋ฅจ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ , MySQL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์œ„์น˜์ธ /var/lib/mysql์— ๋ณผ๋ฅจ์„ ํƒ‘์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ docker volume create ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค. Docker์—์„œ ๋ช…๋ช…๋œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์˜๋„๋ฅผ ์ธ์‹ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋ณผ๋ฅจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

     

    MySQL ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ

    docker exec -it <mysql-container-id> mysql -p

     

    ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์™€ MySQL์— ์—ฐ๊ฒฐํ•˜๊ธฐ

    ๋„คํŠธ์›Œํ‚น ๋ฌธ์ œ ํ•ด๊ฒฐ ๋˜๋Š” ๋””๋ฒ„๊ทธ์— ์œ ์šฉํ•œ ‘๋งŽ์€’ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋œ nicolaka/netshoot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉ

     

    netshoot ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

    docker run -it --network todo-app nicolaka/netshoot

     

    MySQL ์ปจํ…Œ์ด๋„ˆ ์ฃผ์†Œ ํ™•์ธ

    dig mysql

    “ANSWER SECTION”์—์„œ mysql์— ๋Œ€ํ•ด A ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, 172.23.0.2๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž IP ์ฃผ์†Œ๋Š” ๋‹ค๋ฅธ ๊ฐ’์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ). mysql๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํšจํ•œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด ์•„๋‹ˆ์ง€๋งŒ, Docker์—์„œ ํ•ด๋‹น ๋„คํŠธ์›Œํฌ ๋ณ„์นญ์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ์˜ IP ์ฃผ์†Œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(์•ž์—์„œ ์‚ฌ์šฉํ•œ --network-alias ํ”Œ๋ž˜๊ทธ ์ฐธ์กฐ).

    ๋”ฐ๋ผ์„œ ์•ฑ์ด mysql์ด๋ผ๋Š” ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    MySQL ๊ณผ ์•ฑ ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐ

    ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— MySQL ์ •๋ณด๋ฅผ ์ง€์ •ํ•˜์—ฌ ์—ฐ๊ฒฐ ์‹คํ–‰

    docker run -dp 3000:3000 \
      -w /app -v ${PWD}:/app \
      --network todo-app \
      -e MYSQL_HOST=mysql \
      -e MYSQL_USER=root \
      -e MYSQL_PASSWORD=secret \
      -e MYSQL_DB=todos \
      node:12-alpine \
      sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"

     

    ์•ฑ ๋Ÿฌ๋‹ ํ›„, ์ ‘์†ํ•˜์—ฌ ๋ช‡๊ฐœ์˜ ์•„์ดํ…œ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„, ๋‹ค์‹œ MySQL์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•˜๋ฉด todo์—์„œ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


    8๋ถ€ : Docker Compose ์‚ฌ์šฉ

    Docker Compose๋Š” ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Compose์—์„œ ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•˜๋Š” YAML ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ๋‹จ์ผ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‘ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Compose๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์˜ ‘์ค‘์š”ํ•œ’ ์ด์ ์€ ํŒŒ์ผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์„ ์ •์˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ(์ด์ œ ๋ฒ„์ „ ์ œ์–ด ์‚ฌ์šฉ) ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

     

    * mac์šฉ docker desktop์„ ์„ค์น˜ํ•˜์˜€๋‹ค๋ฉด, ๋ณ„๋„๋กœ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

    docker-compose version

     

    ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฒ„์ „์ด ๋ณด์ธ๋‹ค๋ฉด ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

     

    Docker Compose ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

    ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— docker-compose.yml ์ด๋ผ๋Š” ํŒŒ์ผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •

    # ์Šคํ‚ค๋งˆ ๋ฒ„์ „ ์ •์˜. ์ตœ์‹ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค.
    version: "3.7" 
    
    # ์„œ๋น„์Šค ๋ชฉ๋ก ์ •์˜
    services:
      # ์•ฑ ์„œ๋น„์Šค ์ •์˜
      app:
        # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ์ •์˜ 
        image: node:12-alpine
        # ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ช…๋ น์–ด
        command: sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
        # ํฌํŠธ ์ •์˜ ( host 3000 ์„ container 3000์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ )
        ports:
          - 3000:3000
        # ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์™€ ๋ณผ๋ฅจ ๋งคํ•‘์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
        # ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๊ณณ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
        working_dir: /app
        volumes:
          - ./:/app
        # ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ DB ์„ธํŒ….
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: secret
          MYSQL_DB: todos
      # MySQL ์„œ๋น„์Šค ์ •์˜ 
      mysql:
        # ์ด๋ฏธ์ง€ ์ด๋ฆ„ ์ •์˜
        image : mysql:5.7
        # docker run ์œผ๋กœ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ž๋™์œผ๋กœ volume ์ด ์„ค์ •๋˜์—ˆ์ง€๋งŒ
        # ์—ฌ๊ธฐ์„œ๋Š” ์ž๋™์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. 
        # ์ด๋ฆ„ : ๊ฒฝ๋กœ ๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ง€์ •๋œ ์ด๋ฆ„์„ ๋ฐ”๊นฅ volumes ์—์„œ ํƒ‘์žฌํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
        volumes:
          - todo-mysql-data:/var/lib/mysql
        # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •
        environment: 
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos
    volumes:
      todo-mysql-data:

     

    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ ์‹คํ–‰

    ์œ„์™€ ๊ฐ™์ด ์„ค์ •์„ ๋๋ƒˆ์œผ๋ฉด, ์ด์ œ ์‹คํ–‰์„ ํ•˜๋ฉด ๋œ๋‹ค.

     

    docker-compose.yml ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ ์‹คํ–‰.

    docker-compose up -d

     

    ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋œจ๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

    Creating network "app_default" with the default driver
    Creating volume "app_todo-mysql-data" with default driver
    Creating app_app_1 ... done
    Creating app_mysql_1 ... done

     

    ํ•ด๋‹น ๋Ÿฌ๋‹ ๋กœ๊ทธ๋ฅผ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํ™•์ธ.

    docker-compose logs -f

     

    ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ๊ธฐ๊ฐ€ ๋œ๋‹ค๋ฉด ๋Ÿฌ๋‹์— ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

    mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
    mysql_1  | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
    app_1    | Connected to mysql db at host mysql
    app_1    | Listening on port 3000

     

    ์‹คํ–‰ ์ค‘์ธ ์•ฑ ์Šคํƒ ํ™•์ธ

    vscode์—์„œ docker ํ™•์žฅ์„ ๋ณด๋ฉด ์Šคํƒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    ์ด๋กœ์จ docker compose ๋ฅผ ํ†ตํ•ด mysql๊ณผ ์•ฑ์„ ๋„คํŠธ์›Œํ‚น์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š”๋ฐ ์„ฑ๊ณตํ•˜์˜€๋‹ค.

     

    ์ข…๋ฃŒํ•˜๊ธฐ

    ๋ชจ๋‘ ์ข…๋ฃŒํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋ฉด docker-compose down์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ VS Code Docker ํ™•์žฅ์˜ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋‹จ์ถ”๋กœ ํด๋ฆญํ•˜๊ณ  Compose ์ข…๋ฃŒ ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜๊ณ  ๋„คํŠธ์›Œํฌ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.


    9๋ถ€ : ์ด๋ฏธ์ง€ ๊ณ„์ธตํ™”

    ์ด๋ฏธ์ง€ ๊ณ„์ธต ํ™•์ธ

    docker image history <image-name>

     

    ์ด๋ฏธ์ง€์— ์“ฐ์ธ ๊ณ„์ธต๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งจ ์œ„๊ฐ€ ์ตœ์‹  ๊ณ„์ธต ์ด๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๊ณ„์ธต์˜ ์šฉ๋Ÿ‰ ๋“ฑ์„ ์‰ฝ๊ฒŒ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๊ณ„์ธต ์บ์‹ฑ

    Dockerfile์˜ ๊ฐ ๋ช…๋ น์ด ๊ณ„์ธต์ด ๋˜๋Š”๊ฒƒ ์ž„์„ ํ™•์ธ ํ–ˆ์œผ๋‹ˆ, ๊ณ„์ธต์ด ๋ณ€๊ฒฝ ๋  ๋•Œ ๋งˆ๋‹ค ์ข…์†์„ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ ์ ์ด๋ฏ€๋กœ, ์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด์•ผ ํ•จ.

    ์˜ˆ์ œ์—์„œ๋Š” node์—์„œ ์ข…์†์„ฑ์„ ๊ฐ–๋Š” package.json ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ์„ค์น˜ ํ•œ ํ›„, ๋‚˜๋จธ์ง€๋ฅผ ๊ทธ ์ดํ›„์— ๋ณต์‚ฌํ•˜์—ฌ package.json๋งŒ ๋ณ€๊ฒฝ ์ ์ด ์žˆ์„ ๋•Œ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•จ.

    FROM node:12-alpine
    RUN apk add --no-cache python2 g++ make
    WORKDIR /app
    # ์ข…์†์„ฑ ์นดํ”ผ
    COPY package.json yarn.lock ./
     COPY . .
    RUN apk --no-cache --virtual build-dependencies add \
      python2 \
      make \
      g++
    RUN yarn install --production
    COPY . .
    CMD ["node", "src/index.js"]

     

    ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ

    • ๋Ÿฐํƒ€์ž„ ์ข…์†์„ฑ๊ณผ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ข…์†์„ฑ ๊ตฌ๋ถ„
    • ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ‘ํ•ญ๋ชฉ’๋งŒ ์ œ๊ณตํ•˜์—ฌ ์ „์ฒด ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ถ•์†Œ

     

    Maven/Tomcat ์˜ˆ์ œ

    # ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„. ๋นŒ๋“œ๋‹จ๊ณ„์—์„œ๋งŒ JDK ํ•„์š”, ์—ฌ๊ธฐ์„œ ์ˆ˜ํ–‰.
    FROM maven AS build
    WORKDIR /app
    COPY . .
    RUN mvn package
    
    # ๋‘๋ฒˆ์งธ ๋‹จ๊ณ„. ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ํ†ฐ์บฃ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌ. 
    # ์ด ๋‹จ๊ณ„๊ฐ€ ๋งˆ์ง€๋ง‰์ด๋ฏ€๋กœ, ์ตœ์ข… ๋นŒ๋“œ๋˜๋Š” ์ด๋ฏธ์ง€๋Š” ์ด ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋ฌผ์ž„.
    FROM tomcat
    COPY --from=build /app/target/file.war /usr/local/tomcat/webapps

     

    React ์˜ˆ์ œ

    # ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„. ์ด ๋‹จ๊ณ„์—์„œ ๋นŒ๋“œ ์ˆ˜ํ–‰
    FROM node:12 AS build
    WORKDIR /app
    COPY package* yarn.lock ./
    RUN yarn install
    COPY public ./public
    COPY src ./src
    RUN yarn run build
    
    # ๋‘๋ฒˆ์งธ ๋‹จ๊ณ„. ์ด ๋‹จ๊ณ„์—์„œ nginx์— ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์˜ฎ๊น€.
    FROM nginx:alpine
    COPY --from=build /app/build /usr/share/nginx/html

     

    ์ฆ‰, ๋นŒ๋“œ ๋‹จ๊ณ„์—๋งŒ ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ์ „๋ถ€ ์ด๋ฏธ์ง€์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ , ๋นŒ๋“œ ์ˆ˜ํ–‰ ํ›„ ์ด๋ฏธ์ง€์—๋Š” ํฌํ•จ ์‹œํ‚ค์ง€ ์•Š์•„ ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์œ„ ๋‘๊ฐ€์ง€ ์˜ˆ์ œ๋กœ ๋ณด๋ฉด, ๋นŒ๋“œ ํ›„์˜ ๊ฒฐ๊ณผ๋ฌผ๋งŒ WAS์— ์˜ฎ๊ธฐ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์ค„์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


    10๋ถ€ : ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌ

    ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ผ์šฐ๋“œ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”. ํ˜„์žฌ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ docker ์ปจํ…์ŠคํŠธ์ž„.

    ์˜ˆ์ œ์—์„œ๋Š” Azure(์• ์ €) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ ์• ์ € ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Œ.
    ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ.

    docker context use myacicontext
    docker run  -dp 3000:3000 <username>/getting-started

    ๋.

    728x90
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€