Wecode - Project 3 (부트캠프)/세션

Docker를 활용한 AWS 실습 [개념]

JBS 12 2023. 10. 26. 23:07

[참고자료]

 

만들면서 이해하는 도커(Docker) 이미지: 도커 이미지 빌드 원리와 OverlayFS

도커 이미지는 유니온 마운트 기술을 활용해 계층화된 레이어들로 구성되며, 도커 레지스트리를 사용해 쉽고 효율적인 공유를 가능하게 해줍니다. 이 글에서는 도커 이미지가 저장되는 방식과

www.44bits.io

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. 초기 세팅

  1. 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