-
도커와 도커컴포즈로 빌드해보기docker 2023. 2. 18. 01:54
아래는 내가 구성했던 환경이다
dockerFile
FROM openjdk:17-jdk ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "app.jar"]
- FROM : Docker Base Image (기반이 되는 이미지, <이미지 이름>:<태그> 형식으로 설정, java17로 코드를 작성)
- ARG : 컨테이너 내에서 사용할 수 있는 변수를 지정할 수 있다.
- COPY : 위에 선언했던 JAR_FILE 변수를 컨테이너의 app.jar로 복사한다.
- ENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행
dockerCompose
version: "3" services: db: container_name: my_sql image: mysql environment: MYSQL_DATABASE: testdb MYSQL_ROOT_PASSWORD: sa volumes: - ./db:/var/lib/mysql:rw ports: - "3306:3306" restart: always backend: build: context: backend/ dockerfile: Dockerfile restart: always ports: - "8080:8080" depends_on: - db container_name: "backend" environment: SPRING_DATASOURCE_URL: jdbc:mysql://my_sql:3306/testdb SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: sa
service-a 는 DB 커넥션이 없으면 예외를 던지면서 애플리케이션이 종료되고 컨테이너도 종료되버린다.
이를 방지하기 위해 depend-on 이라는 옵션을 이용해 service-a 컨테이너가 db 컨테이너에 의존하고 있다는걸 사실 명시했지만 이것만으로는 대처가 안된다. 이유는 db 컨테이너가 생성되고 다른 접속을 받을 수 있도록 소켓 대기 상태를 만든 뒤에 service-a 컨테이너가 만들어져야 되는데, 소켓 대기 이전에 service-a 컨테이너를 실행해버리기 때문.
그렇기 때문에 service-a가 실패하더라도 다시 db 컨테이너에 연결을 시도하도록 restart 옵션을 줘야 된다.
build에서 conext는 dockerFile의 위치를 말한다.
루트디렉토리 -> 백엔드폴더 안에 스프링 모듈이 들어가 있으므로, 루트레 compose파일, 스프링 모듈쪽에 dockerFile이 위치한다.
따라서 context에 하위디렉토리인 backend까지 적어주고, dockFile을 명시해준다.
environment : 중요한 부분이다.
DB의 연결할때 일반적으로 다음과 같이 사용한다.
spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false spring.datasource.username=root spring.datasource.password=sa
도커의 데이터베이스를 사용하기 위해서는 따로 url을 다시 설정해주어야 한다.
만일 사용하려는 db의 컨테이너 이름이 my_sql이라면
SPRING_DATASOURCE_URL: jdbc:mysql://mysql_db:3306/jpa-test
이 된다.
어플리케이션 내부에서 실행이 아닌 도커에서 따로 컨테이너를 생성 했기때문에 컨테이너로 연결해야 한다.
그래도 실행이 잘 안되었다.
포트번호를 3307을 사용하고 있었는데, 서버로부터 패킷을 받지 못한다는 오류가 계속 발생했다.
워크벤치로는 db가 연결이 되는데, 스프링과 연결이 계속 거부가 되었다.
따라서 연결되는 포트를 3306으로 변경시켰는데.... 드디어 성공....
설정하는데 1주일이 넘도록 걸린건 안비밀...
그래도 되긴되네,,, 삽질한 보람이 있다.>!
728x90'docker' 카테고리의 다른 글
도커파일 문법 (0) 2023.12.25 dockerFile과 docker-compose.yml 의 차이 (0) 2023.02.16 dockerFile이란? (0) 2023.02.14 docker-compose로 mysql사용하기2 (0) 2023.02.12 docker-compose로 mysql사용하기1 (0) 2023.02.12