Container/Docker

[Docker]애플리케이션을 Docker compose와 AWS의 ECS/ECR을 통해 배포해보자!

마손(Mason) 2022. 3. 22. 15:31

일단 공식문서를 보고 따라해보자!

 

이전에 했던 애플리케이션을 이용해보자!

app.js 수정

- const port = 80
+ const port = 3333 //3333번 포트 노출로 변경

script.js 수정

- fetch('http://localhost:3333/')
+ fetch(`http://${location.hostname}:3333/`)

docker-compose.yml 수정

version: "3.0"
services:
  frontend:
    build: frontend
    image: <도커허브아이디>/frontend:1.0
    ports:
      - target: 80
        published: 80
        x-aws-protocol: http
    depends_on:
      - backend
  backend:
    build: backend
    image: <도커허브아이디>/backend:1.0
    ports:
      - target: 3333
        published: 3333
        x-aws-protocol: http

build하고 docker hub에 올려보자

sudo docker compose build
sudo docker compose up ##잘되나 확인
sudo docker login
sudo docker compose push

이미지 빌드 잘되었고, 도커 허브에도 잘 올라갔음을 확인할 수 있다.

 

생각해볼 문제

  • 왜 포트 구성에서 target과 published를 일치시켰을까?
    • target: 컨테이너 내부포트를 지정하는 것. 
    • published: 라우팅 메쉬에 바인딩될 포트를 지정하는 것. 비워두면 무작위 높은 포트가 지정된다.
    • 기존의 -p 8080:80 방식에서 8080이 publish, 80이 target이다. 기존의 방법보다 위의 방법이 더욱 읽기 쉽고 유연하게 사용할 수 있게에 더 선호된다.
    • 잘모르겠다. 애플리케이션 내부 통신이 가능해야 원활한 서비스가 가능할 것 같은데, 3333포트로 통일을 시키면 frontend 서비스와 통신이 안되는 것 아닌가? 이에는 로드밸런서swam이라는 공식문서가 도움 될 것 같다. 
    • AWS로 배포할 때에는 반드시 포트번호를 맞추도록 되어있다. 공식문서에 나와있다.
The source and target ports defined in the Compose file MUST be the same

 

  • x-aws-protocol의 속성은 무엇일까?
    • http 프로토콜 사용을 강제하여, ALB(Applicaition Load Balancer)를 사용할 수 있게 한다.

Docker context란?

다른 도커 호스트나 클라우드 플랫폼으로 명령을 리다이렉트해주는 메커니즘을 말한다. 말은 어렵지만, 이를 통해 컨테이너가 내 호스트 PC가 아닌 클라우드에서 실행될 수 있게 만들어 준다는 것만 기억하자.

 

사전 설정

공식문서대로 따라하다보면 다음과 같이 context가 생성되었음을 알 수 있다.

만든 myecscontext로 옮겨보자

$ sudo docker context use myecscontext

작성해둔 docker-compose.yml이 존재하는 디렉토리로 이동하여 실행시켜보자

$ sudo docker compose up

실행되었음을 알 수 있다.

AWS ECS로 이동하면 다음과 같이 클러스터가 실행됨을 알 수 있다.

오.. 클라우드에서 내 컨테이너가 잘 실행되고 있다!

로드밸런서도 생성되었다.

DNS 주소로 들어가봐도 잘 나온다.


생각해볼 문제

  • ECS 컨텍스트 상에서 docker compose up을 한 경우, 실제로 생성되는 AWS 리소스는 무엇인가?
    • CloudMap을 비롯하여 총 21개의 리소스가 생성되는데, 각각이 무엇인지 확인하고 무슨 용도에서 만들어지는지 이해해보자.

  • DefaultNetwork: Docker에서 컨테이너 간 통신을 위한 서버가 있듯, 여기서도 생성된다.
  • CloudMap:
  • LogGroup:
  • Backend3333Targetgroup:
  • Cluster:
  • LoadBalancer: 
  • 등등등.. 모두 다 ECS에서 생성 됨을 확인할 수 있다! 참 많은 리소스들이 생성된다.

Docker compose를 이용하면 EC2없이도 애플리케이션 배포를 클라우드 상에서 실행할 수 있구나!를 느꼈다.

Docker compose 없이 일일이 아키텍처를 구성하려면 꽤 어려운 작업이 될 것이다