오늘은 EC2 우분투 환경에서 도커를 이용해 서버를 올리는 방법과 EC2 인스턴스 초기화에 대해 알아보았다.
초기 설정을 잘못했는지 서버를 인스턴스에 올린지 하루만에 반응속도가 엄청 느려졌다.
apt-get install
로 node
를 설치하고 nvm
으로 또 설치해서 충돌이 난 이유인 것 같다.
가장 좋은 방법은 스냅샷 기준으로 돌리기인데, 스냅샷이 없는 관계로 시작시점으로 돌린다.
인스턴스 관리 화면에서 작업 - 모니터링 및 문제 해결 - 루트 볼륨 대체
을 클릭한다.
복원 탭에서 시작상태
를 체크
해주고 대체된 루트 볼륨 삭제
에 체크
해준 후 대체 작업 생성
버튼을 눌러준다.
1분 뒤 ssh 연결하면 된다!
ssh 를 연결했을 때 이런 문제가 발생할 수 있다.
EC2 인스턴스의 루트 볼륨을 대체하면 새로운 인스턴스와 동일한 효과가 발생하기 때문에 SSH 키가 변경되었을 가능성이 크다.
그럴때는 당황하지 않고 호스트 키에서 삭제해주면 된다.
ssh-keygen -R <EC2-인스턴스-주소>
Dockerfile
생성
이 친구들 위치에 두면 된다.
안에 순서대로 레이어를 쌓아준다.
FROM
은 베이스가 될 이미지를 적어준다.
사진의 경우 Node.js 20 버전 기반의 경량 Alpine Linux 이미지를 사용한다는 뜻이다.
WORKDIR
은 도커 환경에서 나의 프로젝트가 실행될 위치를 정해준다.
컨테이너 내부에서 애플리케이션 파일이 배치될 작업 디렉토리를 /app으로 설정한다는 뜻으로 원하는 이름으로 해도 된다.
COPY
는 말 그대로 복사인데 현재 3번째에서는 종속성 파일을 복사한다.
RUN
은 npm install 명령어로 package.json에 정의된 의존성을 설치한다.
여기 COPY
는 애플리케이션의 파일을 복사한다.
현재 디렉토리의 모든 파일과 폴더를 컨테이너 /APP
디렉토리로 복사한다는 뜻이다.
ENTRYPOINT
는 컨테이너 실행 시 실행 할 명령이다. 사진에는 서버 구동을 위한 명령이 적혀있다.
터미널에서 docker build -f dockerfile -t <생성 할 이미지 이름> .
를 입력해준다.
마지막 .
은 docker 파일이 위치한 곳이다.
docker run -p <호스트 원하는 포트>:<컨테이너 원하는 포트> <생성한 이미지 이름>
해당 명령어로 호스트의 포트를 컨테이너 포트로 매핑하여 컨테이너를 실행시킬 수 있다.
docker login
명령어를 통해 로그인 해준다.docker tag <아까 만든 이미지 이름> <Docker Hub 사용자명>/<아까 만든 이미지 이름>:latest
입력을 통해 태그 이름을 docker 허브에 올리기 위한 이름으로 바꾼다.docker push <Docker Hub 사용자명>/<이미지 이름>:latest
으로 푸쉬한다.
한 30초 기다려주면 완료!
node_modules
*.env
우리가 .gitignore
작성하는 것처럼 도커도 지정해줄 수 있다.
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
docker --version
sudo usermod -aG docker $USER
위 명령어로 유저를 추가해준다.
newgrp docker
위 명령어로 현재 쉘을 새로고침 해준다.
docker ps
명령어가 잘 실행되는지 확인한다.
docker login
비밀번호 칠 때 * 안나오고 안쳐지는 것처럼 보이는데 타이핑 되고 있다.
잘 입력하고 엔터치면 된다.
docker pull <아까 푸쉬한 이미지 이름>
docker images
docker run -d -p <호스트 포트>:<컨테이너 포트> <이미지파일>
위 명령어로 받아온 이미지를 백그라운드로 실행합시다.
docker logs <컨테이너 id>
로 애플리케이션 실행 시 로그를 확인할 수 있다.
완료!