AWS 비용 줄이기 프로젝트 2일 차, EC2 인스턴스 하나에 프로젝트들을 전부 올리기 위해 방법을 구상하던 중, 요새 그렇게도 많이 들려오는 Docker라는 놈이 궁금해졌고 하나의 인스턴스에 여러 개의 프로젝트를 단순히 띄우는 것이 아닌 도커 컨테이너를 통해 띄우는 방향으로 잡고 진행해보고자 했다.
대략적으로 건너건너 들은 바로는 Docker를 통해 여러 개의 컨테이너를 동시에 띄울 때에는 Docker Compose를 사용하는 것 같은데, 우선 가장 기본적인 Docker를 통해 Ec2 인스턴스에 간편하게 프로젝트를 띄우는 것을 먼저 시도해보고자 한다.
1. Docker 그게 뭔데?
Docker란 컨테이너 기반의 가상화 기술이지만, 기본의 Virtual machine과는 다르게 Host의 OS를 공용함으로써 기존의 virtual machine이 각각의 컨테이너에 OS를 포함하고있어 무거웠던 단점을 개선해 가벼워진 가상화 기술이다. 이러한 컨테이너의 운용을 관리하는 서비스로는 쿠버네티스(Kubernates)가 있다
2. Docker image는 뭐고 container는 뭐지?
0) Dockerfile :
Docker image를 만드는데 필요한 설명서(인데 내가 친절히 작성해서 도커한테 줘야 하는...)
1) Docker image :
컨테이너 실행에 필요한 파일들과 설정값들을 가지고 있는 것
2) Docker container :
이미지를 실행한 상태
이미지를 실행(컨테이너 생성)한 뒤 추가되는 것이나 변화하는 값은 컨테이너에 저장된다.
즉, 컨테이너를 실행하더라도 이미지는 변화하지 않는다.
3. Docker 명령어 뭐가 있지?
우선은 도커... 뭐가 되었건 간에 설치부터 해야겠지?
1. 도커 공식 홈페이지로 Go go(Get started!!)
설치와 도커허브 가입에 관한 설명은 아주 친절하게 되어있으니 건너뛰고, 직접 사용해 본 명령어들을 정리하고자 한다.
1) 설치 버전 확인 :
docker -v
2) 프로젝트에 Dockerfile 생성 : 확장자 없이 Dockerfile라는 text파일을 생성해 준다
JDK amazoncorretto 17 버전을 사용하는 spring boot 프로젝트의 이미지 생성을 예시로 들면 아래와 같다
FROM amazoncorretto:17
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- FROM : 현재 생성하고자 하는 이미지의 base이미지를 지정하기 위한 부분.
- COPY : 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용
- ENTRYPOINT : 이미지 실행 시 항상 실행돼야 하는 커맨드 설정
- CMD/ADD : 이미지 실행 시 함께 실행될 커맨드 명령어 설정
- EXPOSE : 컨테이너가 리스닝할 포트 또는 파라미터 설정
- ENV : 환경변수 설정
- ARG : 이미지 빌듯이 넘어올 수 있는 인자 설정(ENV와는 다르게 이미지를 빌드하는 순간에만 유효한 환경변수)
3) 도커 image build : 온점(.)은 반드시 있어야 한다..!
// MAC_M1칩
docker build -t [이미지 파일 tag명] --platform linux/amd64 .
// 그 외
docker build -t [이미지 파일 tag명] .
4) DockerHub 로그인
docker login
5) 도커 허브에 repository 생성 후 push
docker push [도커허브 계정명]/[도커허브 repository명]
6) aws ubuntu 인스턴스 내부에 docker 설치
// 설치 과정
apt update & apt upgrade
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
//설치 완료 후 버전(설치여부) 확인
docker -v
//도커 활성화
sudo systemctl enable docker
//도커 실행
sudo service docker start
//잘 실행되고 있는지 status 확인
service docker status
//추가 : docker 명령어 실행시 sudo를 빼고 입력하고 싶은 경우 도커 소켓의 접근 권한을 변경해줄 것
sudo su
chmod 666 docker.sock
7) dockerhub에서 이미지 pull
docker pull [도커허브 계정명]/[도커허브 repository명]
8) docker image 목록 출력
docker images
docker image list
9) 컨테이너 생성(이미지 실행)
(1) '-d' : 컨테이너가 중단되지 않도록 설정
(2) '-p' : 포트 매핑
docker run -d -p [호스트 포트]:[매핑시킬 컨테이너 내부 포트] [이미지 명]:[태그]
10) 실행 중 컨테이너 확인
docker ps -a
11) 실행중 컨테이너의 로그 확인
docker logs [로그를 확인하고 싶은 컨테이너의 CONTAINER ID(최소 앞 세글자) 혹은 NAMES]
12) 컨테이너 삭제
(1) '-f' : force
docker rm [중지하고자 하는 컨테이너의 CONTAINER ID(최소 앞 세글자) 혹은 NAMES]
docker rm -f [중지하고자 하는 컨테이너의 CONTAINER ID(최소 앞 세글자) 혹은 NAMES]
자 이렇게 도커를 간단히 사용해 보는 시간을 가졌다. 이제 남은 건
1) docker compose로 여러 프로젝트를 한 번에 pull 받는 것이 가능한지 확인해 보기
2) 업로드 리소스를 S3업로드로 바꾸기
3) CD 파이프라인을 어떤 식으로 트리거해서 구현할지 고민해 보기
뿐~~~~ 이다~~~!!!
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!