어플리케이션이 하나이고 도커파일이 하나 일때는 도커 파일을 Elastic beanstalk에 전달하면 EB가 알아서 그 빌드된 이미지를 돌려서 어플리케이션을 실행합니다. 그래서 아무런 설정을 해주지 않아도 됩니다.
하지만 Full Stack App의 경우 노드, Mysql, Nginx등을 위한 Dockerfile이 여러개이고 EB가 어떤 파일을 먼저 실행할지 등에 대하여 자동으로 프로세스를 해나갈수 없습니다.
그래서 그에 대한 설정을 따로 해주는 파일이 Dockerrun.aws.json입니다.
Dockerrun.aws.json 파일은 Docker 컨테이너 세트를 Elastic Beanstalk 애플리케이션으로 배포하는 방법을 설명하는 Elastic Beanstalk 고유의 JSON 파일입니다. Dockerrun.aws.json 파일을 멀티 컨테이너 Docker 환경에 사용 할수 있습니다.
Dockerrun.aws.json은 환경에서 각 컨테이너 EC2 인스턴스(Docker 컨테이너를 호스트하는 Amazon EC2 인스턴스)에 대해 배포할 컨테이너 및 탑재할 컨테이너의 호스트 인스턴스에서 생성할 데이터 볼륨을 설명 합니다.
Docker run.aws.json이 어떻게 다중 컨테이너를 작동 시킬지 알려준다.
이 작업 정의를 등록하려면 Container Definition을 명시해줘야 한다. 그리고 Container Definition은 docker run.aws.json에 명시해 주며 도커 데몬으로 전해진다.
name
컨테이너의 이름입니다.
hostname
호스트 이름입니다. 다른 컨테이너에서 접근이 가능합니다. (도커컴포즈를 이용해 생성된 다른 컨테이너)
essential
1. nginx 경우 모든 컨테이너가 죽으면 다른 컨테이너들이 작업을 할수 없기 때문에 essential을 true로 준다.
2. 필수적이지 않은 컨테이너는 나머지 컨테이너에 영향을 미치지 않고 종료될수 있습니다.
컨테이너가 실패할 경우 작업을 중지해야 하면 true
Memory
컨테이너용으로 예약할 컨테이너 인스턴스에 있는 메모리 양입니다.
컨테이너 정의에서 memory 또는 memoryReservation 파라미터 중 하나 또는 모두에 0이 아닌 정수를 지정하면 됩니다.
PortMappings
컨테이너에 있는 네트워크 지점을 호스트에 있는 지점에 매핑합니다.
Links
연결할 컨테이너의 목록입니다. 연결된 컨테이너는 서로를 검색하고 안전하게 통신할 수 있습니다.
📄 Dockerrun.aws.json
{
“AWSEBDockerrunVersion”:2,
“containerDefinitaions”:[
{
“name”: “frontend”,
“image”: “도커허브아이디/도커컨테이너이름”,
“hostname”:false,
“essential”: false,
“memory”: 128
},
{
“name”: “backend”,
“image”: “도커허브아이디/도커컨테이너이름”,
“hostname”:false,
“essential”: false,
“memory”: 128
},
{
“name” : “nginx”,
“image”: “도커허브아이디/도커컨테이너이름”,
“hostname”: nginx,
#nginx가 죽으면 프론트엔드, 백엔드에 모두 요청이 안가기 때문에 값을 true로 필수적으로 생각해준다.
“essential”: false,
“portMappings”:[
{
“hostPort”:80,
“containerPort”:80
}
],
#nginx는 프론트와 백엔드 둘다 연결해준다.
“links” : [“frontend”, “backend”],
“memory”:128
}
]
}