DevOps/Docker

Dockerhub를 이용한 이미지 push/pull + 컨테이너 생성

닉네임생각즁 2024. 3. 11. 16:55

 

1. window/mac(개발 환경)에서 스프링 앱 도커화

2. 도커 허브에 이미지 push

3. EC2 리눅스 서버(운영 환경)에 도커 설치 후 Dockerhub에 올라가 있는 스프링 이미지 pull

4. 컨테이너 생성 후 실행, 접속 확인

 

과정을 남겨보도록 하겠습니다😎

 

 

1. window/mac(개발 환경)에서 스프링 앱 도커화

 

◾ 스프링 프로젝트 가져오기

git clone {git URL}

 

 

◾ Dockerfile 생성

  → gradle 프로젝트인 경우 gradlew 있는 위치로 이동해서 / maven 프로젝트인 경우 mnvw 있는 위치로 이동해서

cd {해당 폴더}
vi Dockerfile

 

 

gradle

# Builder Stage - 빌드를 위한 부분 (.jar파일이 있는 경우 해당 stage 제거 필요)
FROM gradle:7.3.3-jdk11 AS builder

WORKDIR /usr/src/app

COPY build.gradle .
COPY settings.gradle .
COPY src src

# 빌드
RUN gradle build --no-daemon

# App Stage - 실행을 위한 부분(여기는 무조건 필요)
FROM openjdk:11-jre-slim 

WORKDIR /app

COPY --from=builder /usr/src/app/build/libs/*.jar app.jar

ENTRYPOINT ["java", "-jar", "/app/app.jar"]

 

 

maven

FROM eclipse-temurin:11-jdk-alpine as builder
# 빌드는 컴파일러가 필요하기 때문에 jdk로 활용.
# 그렇지 않을 경우, 다음의 에러 발생 -> [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
WORKDIR /usr/src/app

COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src

RUN ./mvnw package
# issue: https://stackoverflow.com/questions/61226664/build-docker-error-bin-sh-1-mvnw-not-found
# 해결 방법은 sed -i 's/\r$//' mvnw 명령어 실행 후 다시 실행하기

# App
FROM eclipse-temurin:11-jre-alpine

WORKDIR /app

COPY --from=builder /usr/src/app/target/*.jar app.jar

ENTRYPOINT ["java","-jar","/app/app.jar"]

 

 

◾ 이미지 빌드

docker build -t {image name} .

 

 

◾ 이미지 빌드 결과 확인

docker images

 

 

 - docker desktop 에서도 확인 가능

 

 

 

 

2. Dockerhub에 이미지 push

 

Dockerhub에 repository 생성

 

 - repository name 을 입력하면 {user name}/{repository name} 으로 repository 생성됨

 

 

이미지에 계정이름 태깅

 - 이미지를 repository에 push하기 위해서는 이미지 이름 앞에 도커 계정명에 대한 참조를 추가해야함

docker tag {image name} {user name}/{repository name}

 

→ 이미지를 {user name}/{repository name} 으로 변경한다고 생각하면 됨

 

 

◾ Dockerhub에 이미지 push 

docker push {user name}/{repository name}

 

 

3. EC2 리눅스 서버(운영 환경)에 도커 설치 후 Dockerhub에 올라가 있는 스프링 이미지 pull

- 도커 설치되어 있는 서버 실행 (설치되어있지않다면 도커 설치해야함)

 

Dockerhub에서 태그 확인 

 

 

이미지 pull

docker pull {user name}/{repository name}:latest

 

 - 오른쪽에 보이는 명령어 복사해서 pull

 - :latest 없어도 됨 (확실하지는 않습니다🙄)

 

 

 이미지 확인

 

 

4. 컨테이너 생성 후 실행, 접속 확인

컨테이너 생성

docker run -dp 3000:8080 --name {container name} {user name}/{repository name}

 - run = pull + create + start 

 - 한번 생성된 후에는 start 로 실행 (run을 하면 중복되어 또 생성됨

 

 - --name {container name} : 컨테이너 이름 설정해주는 옵션, 안 쓰면 랜덤으로 생성됨

ex)

docker stop {container name}
docker rm {container name}

→ 컨테이너 삭제하기 : (실행중이면 stop 한 후) rm

 

 

실행중인 컨테이너 조회

docker ps

- -a 를 붙이면 모든 컨테이너 조회

 

 

 - {EC2 public 주소}:3000 으로 접속하면 8080 으로 연결되어서 스프링 웹페이지가 뜸

 - 보안그룹 인바운드 규칙에 3000번 포트 추가되어있어야함