[Tistory] Docker로 AWS EC2 배포하기 (미완)

원글 페이지 : 바로가기

Docker 컨테이너 기반의 오픈소스 가상화 플랫폼 Container 컨테이너는 독립된 가상 공간에서 프로세스가 동작하는 기술 하나의 서버에 여러개의 컨테이너를 띄울 수 있음 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순화 할 수 있음 컨테이너마다 다른 프로그램, 다른 버전을 적용할 수 있으며 각자 독립적으로 실행할 수도, 서로 연동해서 사용할 수도 있음 VM(Virtual Machine)과 비슷한 개념이지만, VM은 각각에 OS를 올려서 사용해야 하고 자원을 할당해서 사용하는 반면, 컨테이너 기반 가상화 방식은 Host OS와 Docker 엔진 위에서 바로 동작하기 때문에 성능이 좋고 필요한 만큼의 자원만 사용해서 사용함 Docker Image 도커 이미지에는 실행 가능한 어플리케이션 소스 코드 뿐만 아니라 실행에 필요한 모든 툴, 파일, 라이브러리 및 설정값 등이 포함 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음 Git으로 저장된 내용들이 Github에 올려지는 것과 같이, Docker Image는 Docker Hub에 업로드 되어서 공유되고 다운 받을 수도 있음 Docker File Docker에서 이미지를 생성하기 위한 용도로 작성하는 파일 생성할 이미지에 대한 정보들을 기술해 놓은 파일이라고 생각하면 됨 => Docker File을 읽으면 해당 이미지가 어떻게 구성되었는지 알 수 있음 필요한 작업 EC2에 Docker 설치 Local에 Docker 설치 Docker Image로 만들 Spring Boot 프로젝트. Docker Hub 회원가입 (계정 필요) https://chb2005.tistory.com/189 [AWS] EC2 인스턴스에 Docker 설치 및 프로젝트 배포 + 배포 중지 개념 정리 Docker 란? Docker : 컨테이너 기반의 오픈소스 가상화 플랫폼 Container 란? 컨테이너는 독립된 가상 공간에서 프로세스가 동작하는 기술 하나의 서버에 여러개의 컨테이너를 띄울 수 있음 chb2005.tistory.com AWS 인스턴스 생성하기 1. AWS Region 설정 2. 인스턴스 시작 이름 : project1-ec2 OS : Ubuntu AMI : Ubuntu Server 24.04 LTS (HVM), SSD Volume Type (24년 6월 기준) 인스턴스 유형 : t2.micro 키 페어 키페어 유형 : RSA, 프라이빗 키 파일 형식 : .pem 키 페어를 생성하면 다운로드가 되는데 잘 저장해놔야 함 키페어를 이용해 터미널에서 해당 컴퓨터(인스턴스)로 안전하게 연결이 가능 chmod 400 “EC2 KeyPair.pem” ssh -i “EC2 KeyPair.pem” ubuntu@ec2-ㅇㅇ-ㅇㅇㅇ-ㅇㅇ-ㅇㅇ.ap-northeast-2.compute.amazonaws.com 위에서 알려준대로 다음과 같은 명령을 통해 접속한다. (키페어가 있는 폴더로 이동한 뒤 실행해야함) Mac 터미널에서 인스턴스 접속을 위한 명령 실행 접속 완료 EC2에 Docker 설치 apt를 사용하여 Docker를 설치할 것이다. 1. apt 설치 $ sudo apt update 2. Docker 설치에 필요한 Package 설치 다음 명령어는 apt가 https 저장소를 사용 할 수 있게 해주는 Package 이다. $ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 3. Docker 설치를 위한 gpg를 다운로드, Docker 저장소 키를 apt에 등록 $sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – 다음과 같이 apt-key는 더 이상 사용되지 않는다면서 경고문구가 뜨고 있는데 검색을 해보니 Warning 은 버전이 다르거나 등의 문제로 수시로 뜨는 부분이기 때문에 무시해도 된다고 한다. 4. Ubuntu 버전에 맞는 Docker를 다운로드 및 repository 리스트에 추가 Docker 버전에는 stable, nightly, test 가 있다고 한다. – stable : 안정화된 Docker 버전을 의미. 가장 최신 릴리즈 버전. – nightly : 차기 출시를 위해 진행중인 최신 빌드 버전이다. – test : 검증 되기 이전의 가장 최신 빌드 버전이다. 별 다른 목적이 존재하지 않는다면, 안정성을 위해 stable 버전 사용을 권장한다고 한다. sudo add-apt-repository [저장소 이름] 이 명령어를 실행하면 apt 리스트에 도커가 추가된다. $sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” 5. apt update 최신 도커 버전을 다운받기 위해 패키지를 업데이트한다. 6. docker-ce 설치 도커 엔진은 유료로 제공되는 기업용 솔루션인 EE(Enterprise Edition)와 무료로 제공되는 CE(Community Edition)로 나뉜다. 무료 버전인 CE 버전을 설치한다. 7. docker 서비스 상태 확인(설치 확인) $sudo systemctl status docker Active : active (running) 을 보면 docker 가 실행되고 있다는 것이다. (q를 누르면 다시 명령어 창으로 돌아와진다) 설치가 완료되고 나면 docker 명령어를 통해 EC2 내부에서 docker container의 기능을 사용할 수 있다. Docker에 MySQL 설치 1. MySQL Docker Image 다운로드 $ sudo docker pull mysql 2. 다운로드 된 Docker image 확인 $ sudo docker images 3. MySQL Docker 컨테이너 생성 및 실행 $ sudo docker run –name mysql-container -e MYSQL_ROOT_PASSWORD=[패스워드] -d -p 3306:3306 mysql:latest 4. Docker 컨테이너 리스트 확인 5. EC2 MySQL Docker 컨테이너 접속 bash 로 mysql 컨테이너에 접근 후, mysql -uroot -p (root 계정 로그인) 입력 후 설정한 패스워드 입력. $ sudo docker exec -it mysql-container bash bash # mysql -uroot -p EC2 내부에서 실행중인 MySQL에 접속 성공 Docker – 프로젝트 EC2 배포하기 DockerFile 생성 프로젝트 폴더안에 Dockerfile 이라는 파일을 생성한다. (src 폴더 안이 아님!) 그리고 아래와 같이 입력한다. # jdk 11 Image Start
FROM openjdk:17
# 인자 정리 – Jar
ARG JAR_FILE=builds/libs/*.jar
# Jar File Copy
COPY ${JAR_FILE} app.jar
ENTRYPOINT [“java”, “-Dspring.profiles.active=docker”, “-jar”, “app.jar”] FROM [이미지명]:[태그] : Docker 베이스 이미지. 즉, openjdk 이미지 17 버전을 베이스 이미지로 지정. ARG : 변수 선언. 즉, JAR_FILE을 *.jar파일로 지정 COPY [원본 경로][복사경로] : 호스트의 파일 또는 디렉토리를 도커 이미지로 복사 . 즉, JAR_FILE을 도커 이미지의 app.jar로 복 ENTRYPOINT : 컨테이너 시작 시 스크립트 실행. 즉, 관련 자바파일(서버)을 실행 build.gradle 추가 jar {
enabled = false
}
Spring Boot 2.5 버전 이후, jar 파일이 2개가 생기기 때문에 1개만 생기게끔 하기 위해 다음과 같은 설정을 추가한다. 그리고 Docker Image 가 생성되지 않을 수도 있다. Jar 파일 생성 Jar 파일 생성완료 Docker 로그인 (Local Terminal) Docker Hub에 Docker Image를 올릴려면 로그인을 해야한다. 개인 로컬 터미널에 접속하여 아래 명령어로 로그인해준다. $ docker login -u [username] 맥북 M1 칩을 사용하는 유저는 ARM 기반 프로세서를 사용하기 때문에 Docker Desktop을 사용하는 것이 일반적이라고 한다. 따라서 위의 명령어를 실행하는 대신 Docker Desktop 을 설치하여 실행시키는 것이 좋다. Docker Image 생성 (Local Terminal) Dockerfile을 빌드해줌으로써 도커 이미지가 생성되는데 터미널에 Dockerfile이 있는 위치에서 다음 명령어를 써주면 Dockerfile이 빌드가 된다. 기본 커맨드 docker build -t [DockerHub ID]/[생성할 이미지명]:[태그명] [DockerFile위치] 태그 지정 X : latest가 지정 docker build -t [DockerHub ID]/[생성할 이미지명] . 나처럼 맥북 M1 칩을 사용하는 유저는 주의할 사항이 있다. 사용중인 맥북이 Apple M1칩이라면 도커가 해당 이미지를 빌드할때 생성된 빌드 플랫폼이 클라우드 서버(linux) 와 m1 맥북간의 호환성이 안맞는 문제가 발생한다고 한다. 맥북 m1 의 경우 아래의 명령을 통해 호환성을 맞춰주도록 사전에 제대로 이미지를 빌드해주도록 한다. docker build –platform linux/amd64 -t [DockerHub ID]/[생성할 이미지명] . Docker Images를 실행해보면 Image가 잘 생성된 것을 볼 수 있다. Docker Push (Local Terminal) Docker Image를 생성했으니, 이제 Docker Hub 레포지토리에 Push를 해줘야 한다. Docker Hub의 레포지토리에 방금 생성한 이미지를 Push 하고, 나중에 클라우드 서버에서 해당 레포지토리로 부터 도커 이미지를 가져오는 방식이다. docker push [DockerHub ID]/[이미지명] Docker Desktop과 Docker Hub에서도 확인해보면 잘 Push되어 있는 것을 확인할 수 있다. EC2에서 Docker 배포하기 Docker Hub에 이미지가 올라간것을 확인 했기 때문에 EC2에서 해당 이미지를 다운로드 받고, 실행 시키면 된다. Docker Pull EC2 환경에서 이전에 Image Push를 했던 DockerHub로부터 도커 이미지를 가져온다. Docker Run 아래의 명령어를 실행하면 Docker Pull 명령과 함께 실행이 되므로 위의 Pull 과정은 생략해도 된다. $ sudo docker run -d -p 8080:8080 [DockerHub ID]/[이미지명] 그리고 인스턴스가 중지됐거나 컨테이너가 가동중이지 않은 경우, 다시 가동시키려면 Docker Run이 아닌 Docker Start 명령을 써야한다. Docekr Run 명령을 실행하게 되면 또 Pull 하는 과정을 하게 되므로 이미지가 하나 더 생성되기 때문이다. 미해결 ) 현재 Docker Run을 하자마자 컨테이너가 바로 꺼지는 문제가 생겼다. 테스트코드도 이상없이 돌아가게끔 수정했는데도 안되는 이유가 뭘까? 출처 https://lucas-owner.tistory.com/46 https://lucas-owner.tistory.com/47 https://lucas-owner.tistory.com/48 https://velog.io/@yeonjookang/MySQL%EA%B3%BC-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%84%9C%EB%B2%84%EB%A5%BC-Docker%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0 https://sseongju1.tistory.com/5

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다