[๐ŸณDocker] ๋ณต์žกํ•œ ์–ดํ”Œ์„ ์‹ค์ œ๋กœ ๋ฐฐํฌํ•ด๋ณด๊ธฐ(ํ…Œ์ŠคํŠธ & ๋ฐฐํฌ ๋ถ€๋ถ„)

Kimseongeunยท2022๋…„ 7์›” 6์ผ

docker

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail

โœ…๋„์ปค ํ™˜๊ฒฝ์˜ MYSQL๋ถ€๋ถ„ ์ •๋ฆฌํ•˜๊ธฐ

Mysql์ด ์ด์ œ๋Š” ๋„์ปค ์•ˆ์—์„œ ๋Œ์•„๊ฐ€๋Š” ๊ฒŒ ์•„๋‹Œ AWS์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฐ๊ฒฐ๋งŒ ํ•ด์ค„ ๊ฒƒ์ด๋‹ˆ Mysql์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ถ€๋ถ„ ๋นผ๊ณ  ๋‹ค ์ง€์›Œ์ค€๋‹ค.

โœ…Travis CI Steps

๊นƒํ—™์— Master ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์†Œ์Šค๊ฐ€ ์˜ฌ๋ผ์™”๋‹ค๋ฉด์ด์ œ๋Š” ๊ทธ ์†Œ์Šค๋ฅผ Travis CI์—์„œ ๊ฐ€์ ธ์™€์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊นƒํ—ˆ๋ธŒ์— ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œ

โ†’ Travis CI๊ฐ€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ด

โ†’ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰

โ†’ ์„ฑ๊ณตํ•˜๋ฉด ์šด์˜ํ™˜๊ฒฝ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ

โ†’ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋„์ปค ํ—ˆ๋ธŒ๋กœ ์ „์†ก

  • ๋„์ปค ํ—ˆ๋ธŒ์— ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  AWS์—์„œ ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ. ๋”ฐ๋ผ์„œ EB์—์„œ ๋‹ค์‹œ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์ง€ ์•Š์•„๋„ ๋จ. (๋ชจ๋“  ๊ณผ์ • ์ค‘์—์„œ ๋นŒ๋“œ๋Š” ํ•œ ๋ฒˆ๋งŒ ์ด๋ค„์ง)
  • docker hub์—์„œ๋Š” ์œ ๋ช…ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ ์ž์‹ ์ด ๋งŒ๋“  ์ด๋ฏธ์ง€๋„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

โ†’ AWS EB์— DockerHub์— ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ƒˆ๋‹ค๊ณ  ์•Œ๋ฆผ

โ†’ AWS EB์—์„œ DockerHub์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„์— ๋ฐฐํฌ๋ฅผ ํ•œ๋‹ค.

โœ”.Travis.yml ์ฝ”๋“œ

language: generic

sudo: required

services:
  - docker

before_install:
  - docker build -t kkkkmd/react-test-app -f ./frontend/Dockerfile.dev ./frontend

script:
  - docker run -e CI=true kkkkmd/react-test-app npm test

after_success:
	#๊ฐ๊ฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ
  - docker build -t kkkkmd/docker-frontend ./frontend
  - docker build -t kkkkmd/docker-backend ./backend
  - docker build -t kkkkmd/docker-nginx ./nginx

	#๋„์ปค ํ—ˆ๋ธŒ์— ๋กœ๊ทธ์ธ
  - echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_ID" --password-stdin

	#๋นŒ๋“œ ๋œ ์ด๋ฏธ์ง€๋“ค์„ ๋„์ปค ํ—ˆ๋ธŒ์— Push ํ•˜๊ธฐ
  - docker push kkkkmd/docker-frontend
  - docker push kkkkmd/docker-backend
  - docker push kkkkmd/docker-nginx

์ด์ „์— travis ci ์‹ค์Šตํ•  ๋•Œ๋„ ์ ์–ด๋†จ์ง€๋งŒ ํ•œ๋ฒˆ๋” ๊ฐ๊ฐ์˜ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์จ๋ณธ๋‹ค.

  • language : ์–ธ์–ด ํ”Œ๋žซํผ ์„ ํƒ
  • sudo : ๊ด€๋ฆฌ์ž ๊ถŒํ•œ๊ฐ–๊ธฐ
  • services : ๋„์ปค ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • before_install : ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ• ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ๊ตฌ์„ฑ
    before_install:
      - docker build -t kkkkmd/react-test-app -f ./frontend/Dockerfile.dev ./frontend
    โ†’ docker build -t <๋„์ปค ์•„์ด๋””> / <์–ดํ”Œ์ด๋ฆ„> -f <Dockerfile ๊ฒฝ๋กœ> <๋นŒ๋“œํ•ด์•ผํ•  ํŒŒ์ผ๋“ค์ด ์žˆ๋Š” ๊ฒฝ๋กœ>
  • script : ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ(ํ…Œ์ŠคํŠธ ์‹คํ–‰)
  • after_success : ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ํ›„ ํ• ์ผ

Travis CI์—์„œ ๋‚ด๊ฐ€ ์ด travis.yml ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค„ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ settings๋ฅผ ๋“ค์–ด๊ฐ€ Docker hub ์•„์ด๋””์™€ ๋น„๋ฒˆ์„ ๋งŒ๋“ค์–ด์ฃผ์ž, ์ €๋ฒˆ์— ํ–ˆ๋˜ aws secret key ์„ค์ • ๋ฐฉ๋ฒ•๊ณผ ๊ฐ™๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๊นƒํ—ˆ๋ธŒ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— ๋„ฃ์–ด์ค€ ํ›„ Travis ci์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด

log๊ฐ€ ์ญ‰์ฃฝ์ญ‰ ๋‚˜์˜ค๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰์— ์ €๋ ‡๊ฒŒ push๊ฐ€ ์ž˜ ๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Dockerrun.aws.json์— ๋Œ€ํ•ด์„œ

์ €๋ฒˆ ์‹ค์Šต์—์„œ๋Š” ๋ฆฌ์•กํŠธ๋งŒ์„ ์ด์šฉํ•ด์„œ ์•ฑ์„ ๋งŒ๋“ค ๋•Œ๋Š” Dockerrun.aws.json์ด๋ผ๋Š” ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ์ด ํŒŒ์ผ์„ ์จ์•ผ์ง€ ElastickBeanstalk์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘๋™์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ๋„์ปค ํŒŒ์ผ์ด ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•  ๋•Œ,(๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)

    	![](https://velog.velcdn.com/images/kansun12/post/61dfa229-0aca-4472-be95-5eb9392ef499/image.png)

์ €๋ฒˆ์— ๋ฆฌ์•กํŠธ๋งŒ์„ ์ด์šฉํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ๋Š” Dockerfile์ด ํ•˜๋‚˜์˜€๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ ๋„์ปค ํŒŒ์ผ์„ Elastic beanstalk์— ์ „๋‹ฌํ•˜๋ฉด EB๊ฐ€ ์•Œ์•„์„œ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๊ทธ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋Œ๋ ค์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์˜€์—ˆ๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ์„ค์ •์„ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋์—ˆ์Œ.

UI๋งŒ ์ฒ˜๋ฆฌํ–ˆ์—ˆ์œผ๋‹ˆ๊นŒ!

  • ๋„์ปค ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ๊ฐœ ํ•„์š”ํ•  ๋•Œ,(ํ’€ ์Šคํƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)

ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ๋…ธ๋“œ, Mysql, Nginx ๋“ฑ์„ ์œ„ํ•œ Dockerfile์ด ์—ฌ๋Ÿฟ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— EB๊ฐ€ ์–ด๋–ค ํŒŒ์ผ์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ํ–‰๋™์„ ์ทจํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž๋™์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•ด๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ž„์˜๋กœ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
๊ทธ๊ฑธ ์„ค์ •ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ด ๋ฐ”๋กœ Dockerrun.aws.json!

AWS์—์„œ ๋งํ•˜๋Š” Dockerrun.aws.json ํŒŒ์ผ์˜ ์ •์˜

Dockerrun.aws.jsonย ํŒŒ์ผ์€ Docker ์ปจํ…Œ์ด๋„ˆ ์„ธํŠธ๋ฅผ Elastic Beanstalk ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” Elastic Beanstalk ๊ณ ์œ ์˜ JSON ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.ย Dockerrun.aws.jsonย ํŒŒ์ผ์„ ๋ฉ€ํ‹ฐ์ปจํ…Œ์ด๋„ˆ Docker ํ™˜๊ฒฝ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

Dockerrun.aws.json์€ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค(Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ˜ธ์ŠคํŠธํ•˜๋Š” Amazon EC2 ์ธ์Šคํ„ด์Šค)์— ๋ฐฐํฌํ•  ์ปจํ…Œ์ด๋„ˆ ๋ฐ ํƒ‘์žฌํ•  ์ปจํ…Œ์ด๋„ˆ์˜ ํ˜ธ์ŠคํŠธ ์ธ์Šคํ„ด์Šค์—์„œ ์ƒ์„ฑํ•  ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • Dockerrun.aws.json โ€” (์–ด๋–ป๊ฒŒ ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž‘๋™์‹œํ‚ฌ์ง€ ์•Œ๋ ค์คŒ) โ€”> ์ผ๋ผ์Šคํ‹ฑ ๋นˆ์Šคํ†ก
  • ์ •ํ™•ํ•œ Dockerrun.aws.json์˜ ์ž‘๋™ ๊ตฌ์กฐ

AWS์—์„œ ๋งํ•˜๋Š” Task Definition(์ž‘์—… ์ •์˜)์—์„œ ์ง€์ • ํ• ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค

  • ์ž‘์—…์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ์‚ฌ์šฉํ•  ๋„์ปค ์ด๋ฏธ์ง€
  • ๊ฐ ์ž‘์—… ๋˜๋Š” ์ž‘์—… ๋‚ด ๊ฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘
  • ์‚ฌ์šฉํ•  ์‹œ์ž‘ ์œ ํ˜•์œผ๋กœ์„œ ํ•ด๋‹น ์ž‘์—…์ด ํ˜ธ์ŠคํŒ…๋˜๋Š” ์ธํ”„๋ผ๋ฅผ ๊ฒฐ์ •
  • ์ž‘์—…์˜ ์ปจํ…Œ์ด๋„ˆ์— ์‚ฌ์šฉํ•  ๋„์ปค ๋„คํŠธ์›Œํ‚น ๋ชจ๋“œ
  • ์ž‘์—…์— ์‚ฌ์šฉํ•  ๋กœ๊น… ๊ตฌ์„ฑ
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ ๋˜๋Š” ์‹คํŒจํ•˜๋”๋ผ๋„ ์ž‘์—…์ด ๊ณ„์† ์‹คํ–‰๋ ์ง€ ์—ฌ๋ถ€
  • ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ํ•  ๋ช…๋ น
  • ์ž‘์—…์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ
  • ์ž‘์—…์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” IAM ์—ญํ• 
  • ์ด ์ž‘์—… ์ •์˜๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด Container Definition์„ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ Container Definition์€ dockerrun.aws.json์— ๋ช…์‹œํ•ด์ฃผ๋ฉฐ ๋„์ปค ๋ฐ๋ชฌ์œผ๋กœ ์ „ํ•ด์ง„๋‹ค.

โœ…Dockerrun.aws.json ์ž‘์„ฑํ•˜๊ธฐ

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "frontend",
      "image": "smileajw1004/docker-frontend",
      "hostname": "frontend",
      "essential": false,
      "memory": 128
    },
    {
      "name": "backend",
      "image": "smileajw1004/docker-backend",
      "hostname": "backend",
      "essential": false,
      "memory": 128
    },
    {
      "name": "nginx",
      "image": "smileajw1004/docker-nginx",
      "hostname": "nginx",
      "essential": true,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": ["frontend", "backend"],
      "memory": 128
    }
  ]
}
  • AWSEBDockerrunVersion : Dockerrun ๋ฒ„์ „ 2๋กœ ์ง€์ •
  • containerDefinitions : ์ด ์•ˆ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ •์˜
.
.
{
      "name": "frontend",
      "image": "smileajw1004/docker-frontend",
      "hostname": "frontend",
      "essential": false,
      "memory": 128
    },
.
.
  • ์ด ๊ฐ์ฒด์•ˆ์—์„œ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜
  • name : ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„
  • image : Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ์ถ•ํ•  ์˜จ๋ผ์ธ Docker ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ Docker ์ด๋ฏธ์ง€ ์ด๋ฆ„
  • hostname : ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ์ด ์ด๋ฆ„์„ ์ด์šฉํ•ด์„œ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ์ด์šฉํ•ด ์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
  • essential : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ž‘์—…์„ ์ค‘์ง€ํ•ด์•ผ ํ•˜๋ฉด true์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜์ ์ด์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ธ์Šคํ„ด์Šค์˜ ๋‚˜๋จธ์ง€ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Œ
  • memory : ์ปจํ…Œ์ด๋„ˆ์šฉ์œผ๋กœ ์˜ˆ์•ฝํ•  ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘, ์ปจํ…Œ์ด๋„ˆ ์ •์˜์—์„œ memory ๋˜๋Š” memoryReservation ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋ชจ๋‘์— 0์ด ์•„๋‹Œ ์ •์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋จ
  • portMappings : ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์ง€์ ์„ ํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” ์ง€์ ์— ๋งคํ•‘
  • links : ์—ฐ๊ฒฐํ•  ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์„œ๋กœ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Œ
  • Nginx
    • links
      • Frontend
      • Backend

โœ…VPC(virtual private cloud)์™€ Security Group ์„ค์ •ํ•˜๊ธฐ

์™œ VPC์™€ Security Group์„ ์„ค์ •ํ•ด ์ค˜์•ผ ํ•˜๋‚˜?

  • AWS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ผ ์žˆ์ง€ ์•Š์•„์„œ ์„œ๋น„์Šค ๊ฐ„์— ํ†ต์‹ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์„ค์ •ํ•ด์„œ ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•จ!

โœ…MYSQL์„ ์œ„ํ•œ AWS RDS ์ƒ์„ฑํ•˜๊ธฐ

RDS๋ฅผ ์ƒ์„ฑํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ docker-compose๋ถ€๋ถ„์— DB์„ ์œ„ํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

์ฆ‰, ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ..

์šฐ์„  db.js๋ฅผ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

//db.js
const mysql = require("mysql");
const pool = mysql.createPool({
    connectionLimit: 10,
    host: process.env.MYSQL_HOST,
    user: process.env.MYSQL_USER,
    password: process.env.MYSQL_ROOT_PASSWORD,
    database: process.env.MYSQL_DATABASE,
    port: process.env.MYSQL_PORT
});
exports.pool = pool;

docker-compose.yml๋„ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

#docker-compose.yml
backend:
    build:
      dockerfile: Dockerfile.dev
      context: ./backend
    container_name: app_backend
    volumes:
      - /app/node_modules
      - ./backend:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: seongeun
      MYSQL_DATABASE: myapp
      MYSQL_PORT: 3307
  • ์ดํ›„ aws์—์„œ rds๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ  ์˜ต์…˜์„ ์•Œ๋งž๊ฒŒ ์ž…๋ ฅํ•ด์ค€ ํ›„์— ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ์ƒ์„ฑํ•˜๋‹ค๋ณด๋ฉด security group์„ ์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๋˜ ๋งŒ๋“ค์–ด์ค˜์•ผํ•จ.

์ด๋Š” VPC์—์„œ ๋ณด์•ˆ๊ทธ๋ฃน์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋งŒ๋“  ํ›„์— ์—ฌ๊ธฐ์„œ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ธ๋ฐ”์ธ๋“œ ๊ทœ์น™์„ ํŽธ์ง‘ํ•˜์—ฌ MYSQL๊ณผ ์†Œํ†ตํ•ด์•ผํ•˜๋Š” port 3307์„ ์ ์–ด์ค€๋‹ค. ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ณด์•ˆ๊ทธ๋ฃน์„ ์„ ํƒํ•ด์„œ ๊ทœ์น™์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค!

์ด์ œ ๋งŒ๋“ค์–ด๋‘” ๋ณด์•ˆ๊ทธ๋ฃน์„ ์•„๊นŒ ๋งŒ๋“ค์–ด์ค€ rds ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‹ค์‹œ ์ ์šฉ์‹œ์ผœ์ฃผ์ž.

โ€œ์ˆ˜์ •โ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑํ–ˆ๋˜ ๋ณด์•ˆ ๊ทธ๋ฃน์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด์ œ ๋ณด์•ˆ๊ทธ๋ฃน๊นŒ์ง€ ์„ค์ •์ด ๋œ RDS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— EB๊นŒ์ง€ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด EB์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋ณด์•ˆ๊ทธ๋ฃน์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ ์šฉ์‹œ์ผœ์ฃผ๊ณ  EB์™€ RDS ์†Œํ†ต์„ ์œ„ํ•ด์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋!

โœ”.travis.yml ํŒŒ์ผ ์ž‘์„ฑ (๋ฐฐํฌ)

language: generic

sudo: required

services:
  - docker

before_install:
  - docker build -t kkkkmd/react-test-app -f ./frontend/Dockerfile.dev ./frontend

script:
  - docker run -e CI=true kkkkmd/react-test-app npm test

after_success:
  - docker build -t kkkkmd/docker-frontend ./frontend
  - docker build -t kkkkmd/docker-backend ./backend
  - docker build -t kkkkmd/docker-nginx ./nginx

  - echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_ID" --password-stdin

  - docker push kkkkmd/docker-frontend
  - docker push kkkkmd/docker-backend
  - docker push kkkkmd/docker-nginx

deploy:
  provider: elasticbeanstalk
  region: "us-west-2"
  app: "docker-fullstack-app"
  env: "DockerFullstackApp-env"
  bucket_name: elasticbeanstalk-us-west-2-896153392792
  bucket_path: "docker-fullstack-app"
  on:
    branch: master

  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_ACCESS_KEY

์ด ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋œ ๊ฒƒ

์ €๋ฒˆ์— ํ–ˆ๋˜๊ฑฐ๋ž‘ ๊ฑฐ์˜ ๋˜‘๊ฐ™์Œ

deploy:
  provider: elasticbeanstalk
  region: "us-west-2"
  app: "docker-fullstack-app"
  env: "DockerFullstackApp-env"
  bucket_name: elasticbeanstalk-us-west-2-896153392792
  bucket_path: "docker-fullstack-app"
  on:
    branch: master

  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_ACCESS_KEY
  • provider : ์™ธ๋ถ€ ์„œ๋น„์Šค ํ‘œ์‹œ (s3, elasticbeanstalk, firebase ๋“ฑ)
  • region : ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” AWS์˜ ์„œ๋น„์Šค๊ฐ€ ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ๋ฌผ๋ฆฌ์  ์žฅ์†Œ
  • app : ์ƒ์„ฑ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฆ„
  • env : ํ•ด๋‹น elasticbeanstalk์„ ์œ„ํ•œ s3 ๋ฒ„์ผ“ ์ด๋ฆ„
  • bucket_path : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฆ„๊ณผ ๋™์ผ

โœ”Travis CI์˜ AWS์ ‘๊ทผ์„ ์œ„ํ•œ API key ์ƒ์„ฑโœ”

์†Œ์Šค ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ ์š”๊ฑด

  • ๊นƒํ—ˆ๋ธŒ
    • Travis CI์— ๋กœ๊ทธ์ธํ•˜๋Š” ๊ณผ์ •์—์„œ ๊นƒํ—ˆ๋ธŒ ๊ณ„์ •์„ ์—ฐ๋™ํ•จ์œผ๋กœ์จ ์ธ์ฆ ์™„๋ฃŒ
  • Travis CI
    • AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ์•ก์„ธ์Šค ํ‚ค์™€ ๋น„๋ฐ€ ์•ก์„ธ์Šค ํ‚ค๋ฅผ Travis CI ์˜ ์„ค์ • ํŒŒ์ผ์— ์ž‘์„ฑํ•จ์œผ๋กœ์จ ์ธ์ฆ
  • AWS

์ธ์ฆ์„ ์œ„ํ•ด์„œ๋Š” API Key๊ฐ€ ํ•„์š”

  • Secret, Access API Key ๋ฐ›๋Š” ์ˆœ์„œ
    • IAM USER ์ƒ์„ฑ
    • APIํ‚ค๋ฅผ Travis yml ํŒŒ์ผ์— ์ ์–ด์ฃผ๊ธฐ
    • Travis CI์—์„œ๋„ ์•„๊นŒ Docker Hub ID, PASSWORD ๋ฅผ More options์—์„œ ์„ค์ •ํ•ด์ค€๋‹ค.

  • ๋งˆ์ง€๋ง‰์œผ๋กœ api key๊นŒ์ง€ ๋„ฃ์–ด์คฌ๋‹ค๋ฉด ์ €๋ฒˆ์— ๋ฐฐํฌํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ docker compose up์„ ํ•ด์ค€ ํ›„์— travis ci๋กœ ์˜ค๋ฅ˜ ์—†์ด ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ db์— ์ž˜ ๋“ค์–ด๊ฐ€๋Š”์ง€๋ฅผ aws eb์—์„œ ํ™•์ธํ•ด์ฃผ๋ฉด ๋์ด ๋‚œ๋‹ค!
profile
๊น€์„ฑ์€์ž…๋‹ˆ๋‹ค.

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