본문 바로가기

Container/Docker

[Docker]Dockerfile을 이용해 빌드, 배포하기 트러블슈팅

Project3-DAY3-Step1

목표: 수정된 openapi.yaml을 ec2에서 Dockerfile을 사용하여 배포 자동화를 달성하자.
필요한 것:

  • redoc-cli: openapi.yaml을 .html파일로 변경하여 정적 호스팅 가능하게 하자.
  • apache2: .html파일을 정적호스팅 하자.
  • ssh: ec2에 접속하자.
  • scp: local의 파일을 ec2에 옮기자.
  • shell script: 명령어를 파일에 정리하여 반복되는 작업을 한번에 실행하자.

Apache2 is not running

작업흐름

  1. ec2에 ssh를 통해 접속하여 Docker를 설치한다.
  2. 로컬에서 redoc-cli를 통해 .html파일을 생성한후 index.html로 파일명을 변경한다.
  3. ec2에 접속하여 apache2 서버를 이미지로 만들기 위해 docker build 명령을 사용한다.
  4. 만들어진 이미지를 docker run으로 실행한다.
  5. 정적배포가 완료되어 ec2 엔드포인트로 접속해본다.

문제점
docker run -p 80:80 image:1.1.0로 실행하니 다음과 같은 에러를 만났다.

 * Reloading Apache httpd web server apache2
 * 
 * Apache2 is not running

해결노력

  1. ec2에서 안되면 로컬에서 실행해보자! 같은 에러..
 * Reloading Apache httpd web server apache2
 * 
 * Apache2 is not running
  1. 나의 로컬이 apache2서버를 실행시킬 수 없을 수도 있다. 재실행해보자!
sudo brew services apache2 stop
sudo brew services apache2 start

sudo brew services apache2 restart
  1. 아파치가 안깔렸나? 설치하자.
    그러나, 설치되었으면 덮어쓰기가 안된다. 잘못 설치되었을수도 있으니 기존 아파치를 끄고 새로 설치해보자.
/기존 아파치 끄자
sudo apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null

/새 아파치 설치하자
brew install httpd

해결방안
등잔 밑이 어둡다. 문제는 Dockerfile에 있었다. 엔지니어 승우님이 감사하게도 내가 야크털을 깎다 그만둘 수 있도록 도와주셨다!
Docker container로 직접 들어가서 Dockerfile에 따른 빌드 시 어떤 짓을 하나 알아보자!

  1. Docker container로 들어간다.
docker run image:1.1.0
docker ps
docker exec -it 13088e9e9045 /bin/bash

#!/bin/bash는 Dockerfile에 있는 명령어를 실행시키지 않는다는 것이다.

  1. Dockerfile 내 명령어를 한줄 한줄 실행시켜본다.
root@d77cef83ab99:/# . /etc/apache2/envvars
root@d77cef83ab99:/# mkdir -p /var/run/apache2
root@d77cef83ab99:/# mkdir -p /var/lock/apache2
root@d77cef83ab99:/# service apache2 reload
 * Reloading Apache httpd web server apache2                                                                                                      * 
root@d77cef83ab99:/# /usr/sbin/apache2 -D FOREGROUND
httpd (pid 22) already running

이 명령들을 run_apache.sh에 작성하여 후에 한꺼번에 실행시켜 아파치 서버를 실행하는 구조이다.
직접 들어가서보니 아파치서버를 relad하고 다시 FOREGROUND에서 아파치 서버를 실행한다.
당연히 Docker를 실행시키면 위와 같이 아파치가 안돌아간다라는 말이 나올 것이다.

여기까지와보니 나는 docker를 FOREGROUND에서 실행하고 있었다.

결국 해결방안

docker run -d 80:80 image:1.1.0

##배운점

  1. 안되는건 들어가서 보자. 또는 로그를 잘 보자
  2. docker 공부는 정말 중요한듯 하다. 가물가물하다.

출처

https://github.com/cs-devops-bootcamp/agora-states/issues/258#issue-1223808796