windows11
ec2(ubuntu 24)
- docker destop 설치
https://docs.docker.com/desktop/install/windows-install/
Install Docker Desktop on Windows
Get started with Docker for Windows. This guide covers system requirements, where to download, and instructions on how to install and update.
docs.docker.com
nest프로젝트 root 경로에 Dockerfile 생성
// Dockerfile
// Node.js 20버전이 설치된 Alpine Linux를 기반 이미지로 사용
FROM node:20-alpine
// Docker 컨테이너 내에서 작업 디렉토리를 /app으로 설정한다.
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
// 환경변수 설정 EC2의 public DNS를 MYSQL_HOST로 설정
ENV MYSQL_HOST=ec2-43-201-69-246.ap-northeast-2.compute.amazonaws.com
ENV MYSQL_PORT=3306
ENV MYSQL_USER=user
ENV MYSQL_PASSWORD=password
EXPOSE 3000
CMD [ "npm", "start" ]
docker desktop을 실행한 뒤 다시 vscode로 돌아온다.
터미널 실행 후
docker build -t [my-image] .
Docker 이미지를 빌드하고 그 이미지에 my-image라는 태그를 부여하는 명령어다.
태그는 이미지를 참조하는데 사용한다.
맨 뒤에 .은 Dockerfile이 있는 디렉토리를 나타낸다. 해당 경로에서 Dockerfile을 찾고, Dockerfile에 명시된 대로 이미지를 빌드한다.
생성된 이미지를 확인할 수 있다.
다음 단계로 가기전에 docker hub에서 회원가입을 하자
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
이제 docker hub에 push하기 위한 이미지를 생성하고 실제로 push하는 동작을 알아보겠다.
docker login docker tag [tag-name] [docker hub의 사용자명]/[이미지명] //
ex) docker tag odd-server odd/odd-server
docker push [docker hub의 사용자명]/[이미지명]
// ex) docker push odd/odd-server
push가 정상적으로 완료됬다면 docker hub에서 이미지들을 확인할 수 있다.
이제 ec2에서 해당 이미지들을 내려 받아보자
dockerImage를 사용하다보면 용량이 금방찬다고 한다. 프리티어의 micro 대신에 medium으로 ec2 인스턴스를 생성하고 ami는 ubuntu를 사용했다.
apt update & apt upgrade
// docker 설치에 필요한 필수 패키지를 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
// 설치가 되었다면 Docker의 GPC 인증을 한다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
// Docker Repository를 등록한다.
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
// Docker 설치
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
docker -v
// Docker 실행
sudo systemctl enable docker
// Docker 활성화
sudo service docker start
service docker status
ec2에서 docker를 사용할 준비가 다 되었다. 이제 docker hub에서 아까 올려놨던 image와 mysql image를 내려 받자.
docker pull [사용자명]/[이미지명]
docker pull mysql:[version]
// ex) mysql:5.7, mysql:latest
이미지를 내려받는 progress가 표시되고 완료되었다면
docker images
해당 명령어로 이미지들을 확인할 수 있다.
이제 이미지들을 컨테이너로 실행하게 되면 실제롤 서버와 db가 ec2에서 동작하게 된다.
mysql 이미지
docker run --name [컨테이너명] --network [네트워크명] -e MYSQL_DATABASE=[데이터베이스명] -e MYSQL_USER=[데이터베이스 유저명] -e MYSQL_PASSWORD=[데이터베이스 비밀번호] -e MYSQL_ROOT_PASSWORD=[데이터베이스 루트 비밀번호] -d -p 3306:3306 mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
-e : 환경변수를 지정해주는 키워드이다.
--name : 컨테이너 이름을 지정해서 이후 stop, rm, start 등을 정해준 이름으로 쉽게 할 수 있다. 정해주지 않으면 ID로 일일이 쳐줘야함
--network : 네트워크는 nest서버 이미지와 mysql 이미지가 컨테이너로 실행될 때 컨테이너 간 통신을 하기위해 설정해준다.
docker network create [네트워크명]
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
mysql 5.7은 기본 charset이 latin으로 설정되어 있어 한글을 데이터베이스에 저장할 수 없는 문제가 있다.
그래서 컨테이너를 생성할때 charset을 utf8로 설정해줘야 이런 문제를 해결할 수 있다.
nest 이미지
docker run --name [컨테이너명] --network [네트워크명] -d -p 80:3000 [사용자명]/[이미지명]
80:3000으로 포트포워딩을 해준다. 아직 도메인 없이 작업 중이라 80:3000을 사용중이고 나중에 https로 사용할때는 443:3000으로 사용하면 된다.
현재 컨테이너를 확인하기 위해서는
docker ps -a
해당 명령어를 사용하면 된다.
마지막으로 위에서 나오진 않았지만 자주 쓰는 명령어
docker start [컨테이너명]
docker restart [컨테이너명]
docker stop [컨테이너명]
docker rm [컨테이너명]
ㄴ 컨테이너 삭제
docker rmi [이미지명]
ㄴ 이미지 삭제
docker image prune -a
ㄴ 사용하지 않는 이미지 삭제
docker container prune
ㄴ 사용하지 않는 컨테이너 삭제
docker volume prune
ㄴ 사용하지 않는 볼륨 삭제