[참고자료]
1. 실습을 시작하기 전에
해당 실습은 AWS EC2와 RDS 생성 및 연결까지 준비되어 있어야 합니다. 또한 기본적인 AWS, Docker 개념 학습이 선행되어야 합니다.
기존에 EC2에서 **git clone** 을 통해 GitHub 에서 코드를 가져와서 배포를 했다면, 이번 실습에서는 Docker 컨테이너를 활용해 배포하겠습니다.
1-1. Docker 회원가입
소스 코드를 GitHub에서 관리하듯 Docker 이미지 또한 DockerHub에서 관리할 수 있습니다. 아래 Docker 사이트에 접속하여 사용하시는 이메일로 회원가입 해주세요.
1-2. Docker 설치
- Window / Mac Install
- 아래 링크에 들어가셔서 각자 본인 컴퓨터 OS에 맞게 설치해주세요.
- Ubuntu Install
# get-docker.sh 다운로드
$ curl -fsSL https://get.docker.com -o get-docker.sh
# ll 명령어로 현재 디렉토리에 get-docker.sh 파일 확인
$ ll
# get-docker.sh 실행하여 Dokcer 설치
$ sh get-docker.sh
1-3. 실습용 repository clone
아래 링크는 Docker 실습용 repository입니다. clone 받아서 사용해주세요.
1-4. 초기 세팅
- RDS mysql 서버에 접속합니다.
$ mysql -h 'RDS Database Endpoint 주소' -u root -p
mysql -h 'RDS Database Endpoint 주소' -u root -p
2. 데이터베이스를 생성합니다.
mysql> create database 'DATABASE 명' character set utf8mb4 collate utf8mb4_unicode_ci;
mysql> create database 'DATABASE 명' character set utf8mb4 collate utf8mb4_unicode_ci;
3. .env 생성 후 **DATABASES** 의 정보를 본인의 RDS 데이터베이스에 맞게 수정합니다.
# typeorm
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = RDS Endpoint 주소
TYPEORM_USERNAME = root
TYPEORM_PASSWORD = password
TYPEORM_DATABASE = DB_NAME
TYPEORM_PORT = 3306
TYPEORM_LOGGING = TRUE
# dbmate
DATABASE_URL="mysql://root:password@host:port/dbname"
#typeorm
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = RDS Endpoint 주소
TYPEORM_USERNAME = root
TYPEORM_PASSWORD = password
TYPEORM_DATABASE = DB_NAME
TYPEORM_PORT = 3306
TYPEORM_LOGGING = TRUE
# dbmate
DATABASE_URL="mysql://root:password@host:port/dbname"
4. 해당 디렉토리로 이동 후
데이터베이스에 migrate가 잘 작동하는지 확인합니다.
5. RDS에 접속하여
연결했던 데이터베이스에 테이블이 잘 생성되었는지 확인
2. Docker Image 생성
처음 Docker 명령어를 사용하시면 아래와 같은 권한 문제가 발생할 수 있습니다. 어떤 에러인지 한 번 읽어보시고 다음과 같은 명령어를 입력하여 해결해주세요.
$ docker run ...
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=api": dial unix /var/run/docker.sock: connect: permission denied.
# docker 명령어 입력 후 위와 같은 permission 에러 발생 시
$ sudo chmod 666 /var/run/docker.sock
$ docker run ...
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=api": dial unix /var/run/docker.sock: connect: permission denied.
# docker 명령어 입력 후 위와 같은 permission 에러 발생 시
$ sudo chmod 666 /var/run/docker.sock
2-1. Dockerfile 작성
먼저 docker image를 생성하기 위한 Dockerfile을 여러분의 프로젝트에 맞게 작성합니다.
(실습용 repo를 clone 받으셨다면 이미 Dockerfile이 존재하기 때문에 생략하셔도 됩니다.)
FROM node:16-alpine
WORKDIR /usr/src/app
COPY package*.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
FROM node:16-alpine
WORKDIR /usr/src/app
COPY package*.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
2-2. Dockerfile 이용해 Docker Image Build
이미지 생성 시 DockerHub username에 맞게 명령어를 입력해야 합니다.
docker build -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path'
ex) docker build -t wecode/wecodeproject:0.1.0 .
3. DockerHub에 Docker Image 올리기
$ docker push wecode/wecodeproject:0.1.0
$ docker push wecode/wecodeproject:0.1.0
4. EC2에 배포
EC2에 컨테이너를 활용하여 서버를 배포하기 위해
해당 EC2에 접속하여 Docker를 설치해야 합니다.
그리고 DockerHub에 있는 이미지를 불러와 컨테이너를 실행합니다.
4-1. EC2에 접속하여 Docker install
# 생성한 EC2 instance 접속
# get-docker.sh 다운로드
$ curl -fsSL <https://get.docker.com> -o get-docker.sh
# ll 명령어로 현재 디렉토리에 get-docker.sh 파일 확인
$ ll
# get-docker.sh 실행하여 Dokcer 설치
$ sh get-docker.sh
# 생성한 EC2 instance 접속
# get-docker.sh 다운로드
$ curl -fsSL https://get.docker.com -o get-docker.sh
# ll 명령어로 현재 디렉토리에 get-docker.sh 파일 확인
$ ll
# get-docker.sh 실행하여 Dokcer 설치
$ sh get-docker.sh
- 만약 처음 EC2에 ssh 접속할 때 Permission Error가 발생한다면?
# 해당 에러는 pem 파일이 너무 많은 권한 설정이 되어있어 발생함
# pem 파일을 최소한의 권한으로 설정
$ sudo chmod 400 'Key 이름'.pem
4-2. Docker Image 가져오기
$ docker pull wecode/wecodeproject:0.1.0
$ docker pull wecode/wecodeproject:0.1.0
4-3. Docker Container 실행
아래와 같은 명령어를 입력할 시
local에서 이미지를 먼저 찾아본 후 없으면
자동으로 DockerHub에서 이미지를 찾습니다.
그 후 곧바로 이미지를 불러와 명령어가 실행됩니다.
따라서 바로 컨테이너를 실행하기 위해선 pull 명령어가 필요없다고 볼 수도 있습니다.
$ docker run --name api -p 3000:3000 wecode/wecodeproject:0.1.0
$ docker pull wecode/wecodeproject:0.1.0
- docker ps 명령어 입력 후 살펴보니 실행중인 컨테이너가 없다?
빌드된 이미지에 이상이 있을 경우 컨테이너를 실행하고 나서 바로 종료가 되기 때문입니다.
이런 경우 다음과 같이 실행해서 문제를 확인해 볼 수 있습니다.
$ docker run -it wecode/wecodeproject:0.1.0 /bin/bash
# 위의 명령어를 실행하여 이미지를 기반으로 바로 컨테이너를 실행하면서 접속
# process 등 여러가지를 살펴보면서 현재 서버에 어떤 문제가 있는지 알 수 있다. 하지만 수정은 컨테이너에서 하는게 아닌 이미지를 다시 빌드 해야한다.
$ docker run -it wecode/wecodeproject:0.1.0 /bin/bash
- 만약 DockerHub repo가 private이라면?
# 아래의 명령어로 로그인 후 해당 repo에 접근할 수 있습니다.
$ docker login
$ docker login
4-4. Test
EC2 서버에 http request를 보내서 다음과 같이 잘 동작하는지 확인해봅니다.
[그림 4-1] 유저 생성 request
[그림 4-2] 유저 목록 request
'Wecode - Project 3 (부트캠프) > 세션' 카테고리의 다른 글
Software Testing 1) - [Software Test란 ? (0) | 2023.10.27 |
---|---|
이후 해보면 좋을 [계산기 프로그램 리팩토링] 과제 ** (0) | 2023.10.27 |
주니어 개발자 마인드셋 (0) | 2023.10.27 |
docker 세션 [개념, 명령어, docker file ] (0) | 2023.10.26 |
에러 핸들링 [개념] 1 (0) | 2023.10.24 |