요즘 AWS DVA-C02 공인 시험을 치르기 위해서 AWS 공부를 하는 동시에 이제 실질적인 경험을 쌓기 위해 틈나는대로 바로 활용가능한 내용을 적용해보는 중이다.
그중에서 EC2 user data(사용자 데이터)를 통해 EC2가 부팅될때마다 특정 스크립트가 실행하는 기능을 활용해 dev용으로 사용하고 있는 API를 자동으로 배포해보도록 하겠다.
일단, 먼저 기존 EC2에 docker로 띄워놓은 dev 서버를 확인해보면 다음과 같이 3개의 container가 실행된다.
나는 사전에 docker-compose.prod.yaml 파일을 작성해두었기 때문에 스크립트를 다소 간편?하게 다음과 같이 /home/ubuntu 위치에 start-script.sh를 작성해주었다. 사실 이 부분을 그냥 사용자 데이터에 그대로 넣어도 된다. 다만 cd 파트는 /home/ubuntu/{docker compose 파일이 위치한 경로}로 바꾸어주면 된다.
그리고 나서 인스턴스를 중지하고
사용자 데이터 편집을 눌러
그런데 3개의 컨테이너가 실행되어야 하는데 1개만 시작되고 있었다.(미처 캡쳐하진 못했습니다..) 뭘까? 싶어서 일단 로그를 보기로 헀다.
docker compose log containerID
로 실행되지 않은 나머지 두 개의 컨테이너의 로그를 살펴봤는데 놀랍게도 오류가 없었다. 그런데 왜 exit이 되는것인지 궁금해서 시작되었던 1개의 container 설정과 다른 container 들의 설정을 비교해봤는데 restart: always
속성이 눈에 띄었다.
그리고 나머지 두 컨테이너에도 docker daemon이 시작될때마다 container가 실행될 수 있게 옵션을 주었더니! 의도한대로 잘 배포가 된 것을 확인할 수 있었다!
그래서 왜 그런것인가에 대해 생각해봤는데, 생각해보면 당연하다. 컴퓨터를 종료하면 모든 실행되고있는 앱들이 종료될 것이고 여기에는 docker daemon도 포함된다.
사실 그래서 내가 작성한 스크립트는 사실 크게 영향이 없었을게(으악!) docker compose up -d 자체는 실행이 되었겠지만(sudo systemctl enable docker 영향) -> 도커 데몬이 실질적으로 실행되기 전이라 컨테이너가 유지 되지 않고 종료되었을 것이다. (부팅 로그 분석을 해보고 싶었는데 결국 해당 내용을 못찾았다...그래서 이 부분은 뇌피셜 및 내 생각이다.)
docker를 설치할때부터 아마 daemon이 자동 실행되게끔 설정을 해준거 같은데 ec2가 부팅될때마다 docker가 실행되었기 때문에 기존에 종료되었던 restart 설정이 always인 container가 자동으로 다시 시작된것이다.
그러니까 사실 사용자 데이터에는 docker install/daemon을 실행해주는 코드/system start up시 사용 가능하게 해주는 코드가 필요한 것이고 -> 이후 배포 코드 및 docker-compose.yaml file을 다운로드 및 실행 해주는 코드를 작성하는 것이 바람직하다. -> 다시 말해 초기 설정을 하는 부분만 유의미할 것 같다는 것이 나의 결론이다.
실질적으로 자동 컨테이너 실행을 가능하게 해주는 것은 docker compose이며 docker-compose.yml에 restart:"always" 옵션을 주고, docker compose up -d 를 한번만 돌려도 알아서 docker가 실행될때마다 컨테이너를 자동으로 실행해준다.