나이키 웹사이트를 모티브로 한 프로젝트[Link]를 도커를 활용하여 EC2 인스턴스로 배포하는 기록
EC2는 ubuntu20.04로, RDS는 미리 만들어둔 상태로 진행한다.
혹시 모를 상황에 대비해 jupyter-notebook을 EC2 인스턴스에 설치하고 시작한다.
프로젝트 루트폴더에 Dockerfile
과 .dockerignore
를 작성한다.
추후 프로세스를 모니터링하고 EC2 터미널에서 조작을 용이하기 위해 PM2 패키지를 활용해보자.
도커 컨테이너에서 pm2 start app.js
로 구동할 경우 컨테이너가 바로 꺼지기 때문에
CMD ["pm2-runtime","app.js"]"
로 작성한다.
node:16-alpine으로 진행하다가 이미지 빌드시 에러가 발생해서 그냥 node:16.4.2로 변경
#Dockerfile
FROM node:16.4.2
WORKDIR /usr/src/app
COPY package*.json .
RUN npm install
RUN npm i pm2 -g
COPY . .
EXPOSE 8000
CMD ["pm2-runtime","app.js"]",
#.dockerignore
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.dockerignore
로node_modules
폴더를 제외해주지 않으면 에러가 발생할 수 있다.
도커를 OS에 맞게 설치하고, 로컬 터미널에서 docker login
을 한다.
도커파일이 있는 경로에서 이미지를 빌드한다.
도커 허브에 있는 레포지터리에 이름이 동일하도록 빌드했다.
WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
M1칩 이슈인지 플랫폼 에러가 발생해서
--platform amd64
을 추가하여 빌드한다.
docker build --platform amd64 -t whroddl2/just-do-it-backend:1.0.0 .
docker push whroddl2/just-do-it-backend:1.0.0
참고 )
태그명 변경
docker tag 이미지id whroddl2/just-do-it-backend:latest
이미지 삭제없이 태그만 삭제 할경우
docker rmi whroddl2/just-do-it-backend:tagname
생성한 EC2 instance 접속
get-docker.sh 다운로드
curl -fsSL https://get.docker.com -o get-docker.sh
ll
명령어로 현재 디렉토리에 get-docker.sh 파일 확인
get-docker.sh 실행하여 Dokcer 설치
sh get-docker.sh
EC2 인스턴스 내에서 docker login
linux에서 root 권한이 아닌 상태로 docker를 실행하면 권한 문제가 발생할 수 있다.
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied
해결방법
docker group에 해당 유저를 추가
docker group이 없다면 생성sudo groupadd docker
docker group에 해당 유저를 추가sudo usermod -aG docker \$USER
로그아웃 후 다시 로그인하거나newgrp docker
를 실행시켜야 적용
AWS EC2에서 사용할 포트를 열어준다 (인바운드 규칙 편집)
EC2 터미널에서 이미지를 풀하고 포트를 설정해 컨테이너를 구동한다.
docker pull whroddl2/just-do-it-backend:1.0.0
docker run -p 8000:8000 whroddl2/just-do-it-backend:1.0.0
서버가 열렸따
EC2 인스턴스의 퍼블릭 IP로 회원가입을 진행해서 서버가 잘 작동하는지 확인한다.
pm2-runtime
.dockerignore
node_modules
추가--platform amd64
참고)
https://stackoverflow.com/questions/68360501/docker-build-version-of-npm-is-incompatible-with-lockfileversion1
https://potato-hyun.tistory.com/34
https://stackoverflow.com/questions/71910780/docker-run-fails-return-process-dlopenmodule-path-tonamespacedpathfilename
https://www.npmjs.com/package/pm2