[Docker]도커 이미지 만들기 + 도커 이미지 dockerhub 에 push 해보기(feat.springboot)

zzarbttoo·2021년 8월 4일
0

docker/jenkins/k8s

목록 보기
3/7

안녕하세요! 오늘은 직접 도커 이미지를 만들어보고, 도커 이미지를 dockerhub(public)에 push 해보는 작업을 해보겠습니다

docker 이미지는 여러개의 이미지가 겹쳐지는 형태로 만들어지는데요
우리가 사용했던 alpine이나 hello-world 들도 사실은 이러한 이미지가 겹쳐서 만들어진 것이라고 할 수 있습니다!(image layer을 확인할 수 있습니다)

그래서 새로운 도커 이미지를 만드는 것은 기존에 누군가 생성해서 dockerhub에 올려놓은 이미지(base image)에 Dockerfile 을 이용해 명령어, 파일 등을 추가하는 것이라고 할 수 있습니다!

docker 이미지를 만들 때 예시를 위해 springboot를 사용했고, document 참고해서 진행했습니다!😀

일단 springboot 프로젝트를 생성하고, 간단한 Api 요청을 할 수 있도록 만들었습니다

package com.zzarbttoo.springbootdocker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SpringBootDockerApplication {

    @GetMapping("/")
    public String dockerTest(){
        return "hello docker world";
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDockerApplication.class, args);
    }

}
  • @RestController 를 이용해 RestAPI 요청을 받을 수 있도록 했습니다
  • "/"을 요청하면 hello docker world 를 출력합니다

이후 build를 진행했습니다

저는 gradle을 이용해 build를 진행했기 때문에
프로젝트 디렉토리 > build > libs 이하에 jar 파일이 생성됐습니다!
(maven은 target > 폴더 이하에 생성되겠쥬?)

그럼 이제 project 폴더 이하에 Dockerfile 을 생성하면 됩니다!

Dockerfile 은 VSCode 같은 편집기로 편집할 수 있는데 저는 간단한거여서 그냥 gitbash에서 바로 했습니다!

  • FROM 을 이용해 base 이미지를 설정할 수 있습니다
  • ARG를 통해 변수를 지정했습니다(build 시 오버라이드 가능)
  • COPY를 통해 build/libs 이하에 있는 jar 파일을 app.jar 이라는 이름으로 붙여넣었습니다(base 이미지에 파일을 복사한 것)
  • ENTRYPOINT를 이용해 docker run 명령어입력 시 실행 될 명령어를 지정해줬습니다 (CMD 명령어를 사용할 수도 있습니다)
  • java 버전이 안맞으면 다음과 같은 에러가 난다
    : Exception in thread "main" java.lang.UnsupportedClassVersionError:
    has been compiled by a more recent version of the Java Runtime (class file version 55.0),
    this version of the Java Runtime only recognizes class file versions up to 52.0
  • 55 = java 11 버전 , 52 = java 8 버전 필요

openjdk-11 은 alpine 이미지에서 불안정하기 때문에, 제공이 되지 않아서
오픈소스로 나와있는 adoptopenjdk/openjdk11 이미지를 찾아서 이용했습니다!

만약 jdk 8버전을 사용하시면 베이스 이미지를 알파인 이미지를 사용하시면 됩니다!
(훨씬 가벼움)

FROM openjdk:8-jdk-alpine

docker 파일을 작성한 후에 build를 하면, 로컬에 도커 이미지가 생성되게 되는데요
docker build 명령어는 다음과 같습니다!

docker build -t {docker 이미지이름} {작성한 Dockerfile 위치}
ex ) docker build -t zzarbttoo/springbootdocker:1.1 .

  • -t 명령어는 docker 이미지 이름을 지정해줄 수 있게 합니다
  • docker 이미지가 docker hub라는 공개된 장소에 올라가기 때문에 이미지 이름은 다음과 같이 작성할 것이 권고됩니다
  • {docker Id 아니면 docker repository 이름}:version
  • version은 default 값이 latest입니다 (ex zzarbttoo/springbootdocker:latest)
  • docker Id나 docker Repository 이름은 소문자로 작성되어야 합니다 (소문자로 작성하지 않으면 다음 에러를 만나게 됩니다)
$ docker build -t zzarbttoo/springBootDocker:latest .
invalid argument "zzarbttoo/springBootDocker:latest" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
See 'docker build --help'.

여튼 빌드 명령어를 입력하면 다음과 같이 단계에 따라 빌드가 되게 됩니다

build 후 docker image가 생성된 것을 확인할 수 있습니다
(원래는 하나만 생성되는 것이 정상이며 저는 버전에 따라 두번 생성되도록 실행했습니다)

version이 Tag로 지정된 것을 볼 수 있습니다

build 이후 docker 이미지를 실행할 수 있는데, 포트 번호를 지정해줘야합니다!

docker run -p {외부 포트번호}:{컨테이너 내부 포트번호} {이미지 이름}:{이미지 버전}
ex) docker run -p 8751:8080 zzarbttoo/springbootdocker:1.1

  • -p 를 이용해 포트 번호를 지정해줄 수 있으며, {외부 포트번호}:{내부 포트번호} 형식으로 포트번호를 지정해줘야합니다
  • 현재 springboot 프로그램은 실행될 때 8080 번 포트를 사용하기 때문에 내부 포트를 8080으로 지정했어요
  • 외부 포트 번호는 그냥 사용할 수 있는 것(지금 내 컴퓨터에서 안 쓰이는 포트번호 아무거나) 중 하나를 선택해서 지정했어요


위 명령어를 이용해 실행을 하면 8080 port에서 springboot 어플리케이션이 실행되는 것을 확인할 수 있습니다!(Tomcat initialized with port(s) : 8080(http))
때문에 컨테이너 내부 포트를 8080으로 지정한 것!

지정한 외부포트인 8715로 api를 요청했을 때 원하는 결과가 나오는 것을 확인할 수 있었습니다!

이제 이렇게 만들어진 docker image를 dockerhub에 올려보려고 합니다!
일단 bash 창에 docker login 명령어를 쳐봅니다!
(로그인이 이미 되어있다면 아래와 같은 창이 나올 것이고 아니면 login 및 password를 입력하는 창이 나올겁니다!)

이후 지정된 이미지를 push 하는 명령어를 사용합니다(자매품 pull 명령어)

docker push 이미지이름


image push 명령어 입력 후 docker hub에 들어가서 이미지 이름을 검색 하면
이미지가 업로드가 된 것을 확인할 수 있습니다

이후 같은 이미지이지만 버전만 다른 이미지를 push 했는데요..!

결과는..?

위와 같이 같은 이미지가 버전별로 다르게 업로드 된 것을 확인할 수 있었습니다!
오늘은 docker image를 만들고, docker hub에 올려보는 과정까지 공부했는데요!
문제는 이것이 public이기 때문에 보안이 필요한 파일은 dockerhub에 바로 올리기가 어렵다는 것...

물론 private으로 dockerhub에 올릴 수도 있지만...

유료!
그래서 다음은 private registry를 만들고, CI/CD를 해보는 과정을 공부해보도록 하겠습니다!

짜요~

profile
나는야 누워있는 개발머신

0개의 댓글