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 없이 일일이 아키텍처를 구성하려면 꽤 어려운 작업이 될 것이다