docker

[doker] 도커 빌드 및 도커 컨테이너 실행

수수한개발자 2022. 7. 22.
728x90

이전 글에서 도커 설치까지 하였습니다. 

이제 스프링부트에서 도커를 빌드하고 컨테이너를 실행해보도록 하겠습니다.

 

 

스프링 프로젝트 생성

gradle 

java 11 

그리고 dependencies 는 web만 추가해주었습니다.

 

DockerController

package com.example.springbootdocker.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DockerController {

    @GetMapping("/")
    public String home() {
        return "Hello Docker World";
    }

}

 

그리고 컨트롤러를 하나 만들어서 서버를 실행해 루트 경로로 들어가면 Hello Docker World라는 메시지를 출력합니다.

이제 우리는 이 인텔리제이에서 서버를 실행시키는것이 아니고 도커를 사용하여 서버를 시작할 수 있는 환경을 만들어보겠습니다.

Doker 이미지를 생성하기 위해 필요한 Jar 파일을 생성합니다. Jar파일은 build/libs 디렉터리에 생성됩니다.

Jar파일 생성 방법은 인텔리제이 오른쪽의 Gradle -> Tasks -> build -> bootJar를 눌러줍니다.

 

 

 

그러면 위와 같이 jar 파일이 생성됩니다.

그리고 루트 경로에 Dockerfile을 생성 해줍니다. 여기서 루트 경로는 spring-boot-docker에서 오른쪽 버튼을 누르고 new -> file -> Dockerfile 이렇게 만들어줍니다.

 

루트 경로에 Dockerfile 이 만들어진 모습

그리고 다음과 같이 Dockerfile에 작성해줍니다.

FROM lpicanco/java11-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

FROM 

FROM 키워드는 Docker에게 주어진 이미지를 (태그포함) 빌듯이 기반으로 사용하도록 지시합니다.

 

ARG

빌드시 사용할 환경변수를 선언합니다. Spring Jar 파일이 생성되는 위치를 변수로 선언합니다.

 

Copy

Jar 파일을 app.jar 이름으로 복사합니다. 이는 실행할 jar 파일명을 통일하기 위함입니다. Container 화할 때 Jar 파일명이 매번 달라지면 실행하기 어렵기 때문입니다.

 

ENTRYPOINT

컨테이너 실행 시 java -jar /app.jar 명령어를 실행한다.

이미지를 Container로 띄울때 Jar 파일이 실행되어 Spring 서버가 구동되도록 Command를 설정합니다.

shell 스크립트를 직접 작성하고 ENTRYPOINT에 shell을 선언하는 것도 가능합니다.

 

그리고 인텔리제이에는 terminal이 있습니다. 인텔리제이를 사용하지 않는다면 cmd창도 가능합니다.

 

현재 프로젝트가 있는 경로로 이동해 줍니다.

 

그리고 docker build. 을 치고 엔터를 눌러줍니다.

 

 

그러면 위와 같이 뜨고 마지막에 writing 하고 sha256 : 36b6 ~~ 가 나옵니다 여기서 36b6~~ 여기가 이미지 ID입니다.

이렇게 하면 Repository와 tag 가 none으로 들어가게 됩니다.

생성된 이미지를 확인하는 방법은 Terminal에 docker images를 쳐줍니다.

 

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
<none>           <none>    36 b6 a0245 f7 b   3 hours ago   87.4MB

 

 

docker build -t deploy-demo:0.0.1. 이런 식으로 하게 되면 

Repository는 deploy-demo tag 에는 0.01 이런식으로 들어갑니다.

 

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
deploy-test        0.0.1     5 e5 ebd4 fe080   20 hours ago   346MB

 

이제 이미지를 만들어진 게 확인이 되었습니다. 이미지를 만들었으니 docker run명령으로 이미지를 Container 인스턴스로 론칭합니다. 쉽게 말해 실행시킵니다.

-p 옵션을 주면 Container 내부 8080 port가 호스트 PC의 8080 port로 포워딩되도록 처리할 수 있습니다.

Container는 기본적으로 외부와 격리되어 있기 때문에 이 설정을 통해서 Container 내부의 Spring 서버에 접속할 수 있습니다.

위에서 docker build.

docker run -p 8080:8080 36 b6 a0245 f7 bc24118 a1276 af46 bc1 fc0 a 09 dbf5 a 4 f889 e 7 ee30 e6 f37 a8494 e8

이렇게 위에서 나온 ID 값을 넣어줍니다.

REPOSITORY가 있을 경우 docker run -p 8080:8080 deploy-test 이런 식으로 하면 됩니다. 

 

분명 인텔리제이에서 run에 가보면 서버가 꺼져있습니다.

그리고 terminal에서 

docker run -p 8080:8080 36 b6 a0245 f7 bc24118 a1276 af46 bc1 fc0 a 09 dbf5 a 4 f889 e 7 ee30 e6 f37 a8494 e8

해주면 밑의 사진처럼 스프링 서버를 켠 것처럼 나옵니다.

 

인텔리제이 터미널 창

 

cmd 창 명령 프롬프트 창에서 해도 같은 화면이 나옵니다.

cmd창

이제 터미널 창에서 docker ps 명령을 쳐주면 현재 실행 중인 인스턴스를 확인할 수 있습니다.

이제 크롬을 켜서 localhost:8080으로 들어가 보면 DockerController에서 루트 경로에 맵핑해놓은 Hello Docker World가 떠야 합니다. 과연...

localhost:8080

성공했습니다.. 눈물 ㅜㅜ 이렇게 도커를 빌드하고 컨테이너를 실행해서 서버를 띄었습니다...

도커 서버를 종료 시킬 때는 docker ps 를 한상태에서 NAMES 는 랜덤으로 나오는데 NAMES를 복사해서 

docker stop NAMES 를 넣어주면 종료됩니다. 

감사합니다.

728x90

'docker' 카테고리의 다른 글

[Docker] Docker 로그인 방법  (0) 2023.10.21
도커기본 명령어 및 도커 허브에 이미지 올리기  (0) 2023.02.26
[Docker] Docker MySQL사용하기  (0) 2022.10.09
[docker] window10 도커 설치  (0) 2022.07.21
[docker] 도커란?  (0) 2022.07.21

댓글