Docker

[Docker] 도커 컨테이너에 jar 실행하기

서견 2023. 9. 20. 00:37

1. jar 파일 생성

 

2. Dockerfile 작성

# 기반이 될 Docker 이미지 선택
FROM openjdk:8-jdk-alpine

# 작업 디렉토리 생성
WORKDIR /app

# JAR 파일을 Docker 이미지로 복사
COPY <jar파일명>.jar .

# 컨테이너 실행 시 실행될 명령 정의
CMD ["java", "-jar", "<jar파일명>.jar"]

3. docker build 로 이미지 생성

docker build -t myproject:latest .

위의 명령은 현재 디렉토리의 Dockerfile을 사용하여 myproject:latest라는 이름의 Docker 이미지를 빌드합니다. -t 옵션은 이미지의 태그를 지정하는데, latest는 이미지의 버전을 의미합니다.

4. docker hub 에 이미지 푸쉬

이미지에 편하게 접근하기 위해 docker hub에 이미지 업로드 하기.

$ docker login

우선 도커에 로그인 후

$ docker push <이미지 이름>

해당 명령어를 통해 docker hub로 push 한다.

docker login 후 push 과정에서 오류 발생

해결 방안

  1. 로그인을 하지 않아서 발생하는 경우
    1. 로그인을 진행한다.
  2. 이미지의 user name과 docker hub의 name 이 일치하지 않을경우
    1. Docker Tag 를 Docker Hub ID 와 동일하게 생성함.
$ docker tag <원래 이미지 이름> <내 유저명>/<이미지 이름> 

도커 태그명 수정 후 재 푸쉬

5. docker run 으로 컨테이너 실행

$ docker run -d -p <호스트 시스템 포트>:<컨테이너 내부 포트> <이미지 파일 이름>
  • p 옵션은 Docker 컨테이너의 포트 포워딩을 설정하는 데 사용되는 옵션입니다. 이를 통해 호스트 시스템의 포트와 컨테이너 내부의 포트를 매핑할 수 있습니다.
  • 옵션 -p는 두 개의 포트 번호를 콜론(:)으로 구분하여 지정합니다. 첫 번째 번호는 호스트 시스템의 포트이고, 두 번째 번호는 컨테이너 내부의 포트입니다. 따라서 -p 8080:8080은 호스트의 8080 포트를 컨테이너의 8080 포트로 매핑한다는 의미입니다.
  • 이렇게 포트를 매핑하면 호스트 시스템의 특정 포트로 들어오는 요청이 컨테이너의 해당 포트로 전달되므로, 호스트 시스템에서도 컨테이너의 애플리케이션에 접근할 수 있게 됩니다. 이 예에서는 호스트의 8080 포트를 사용하여 컨테이너의 8080 포트로 들어오는 요청을 전달합니다.

6. docker 컨테이너 내부 접속

$ docker exec -it <컨테이너 아이디> /bin/bash

 

 

📌에러 OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown

  • 해당 에러는 컨테이너 내에서 /bin/bash 바이너리를 찾을 수 없기 때문에 발생하는 것. 이는 컨테이너 내부에 bash가 설치되어 있지 않거나 해당 경로에 bash가 위치하지 않아서 발생할 수 있음.

컨테이너 내부의 쉘 변경:

  • /bin/bash 대신 /bin/sh을 사용.
$ docker exec -it <컨테이너 아이디> /bin/sh