프롤로그
스프링부트 공부한지 벌써 3개월째...
회원가입 로그인 이런 것도 적을까말까 고민했는데 이미 노션에다가 정리하면서 적어두어서....
졸업작품을 만들고 있는데, 내가 노션에다가 실패하면서 나온 결과들 정리했었는데, 조금 더 깔끔하게 정리하고자 블로그에다가 다시 작성하게 되었다.
+무엇보다 지금 하고 있는 과정이 구글에 자료가 진짜 없다...
스프링에서 도커를 조작하기
스프링부트로 도커를 조작하기 라고 구글이나 네이버에 검색을 진행하면...
도커에서 스프링부트 올려서 조작하기로 나온다.
스프링 부트 -> 도커 자료는 거의 없고 거의다 도커 -> 스프링부트 조작만 되게 많다.
그래 누가 스프링으로 도커를 만질려고 하겠어; 하는 내가 이상한 거지.
여기 사이트에서 docker와 자바 또는 스프링과 연결할 수 있는 거를 찾아보게 되면
이렇게 뜬다.
1등은 Docker Java라는 것 https://github.com/docker-java/docker-java
GitHub - docker-java/docker-java: Java Docker API Client
Java Docker API Client. Contribute to docker-java/docker-java development by creating an account on GitHub.
github.com
이거와,
2등의 Docker client인 https://github.com/spotify/docker-client
GitHub - spotify/docker-client: INACTIVE: A simple docker client for the JVM
INACTIVE: A simple docker client for the JVM. Contribute to spotify/docker-client development by creating an account on GitHub.
github.com
이 곳. 스포티 파이를 확인해보면 확실히 저기가 대형 그룹이라 그런가 자료가 좀 있었다. 문제는 저게 2019년 마지막 릴리즈라고 사진에 보이는데, 관리가 안 되는 느낌이다.
그래서 많이 사용하고, 업데이트도 자주 되는 저 docker-java 모듈(?) 라이브러리(?)을 사용해서 스프링부트로부터 도커를 조작해보려고 한다.
https://github.com/docker-java/docker-java/blob/main/docs/getting_started.md
docker-java/docs/getting_started.md at main · docker-java/docker-java
Java Docker API Client. Contribute to docker-java/docker-java development by creating an account on GitHub.
github.com
다음 공식 문서를 토대로 설명하겠다.
의존성 주입하기
스프링에서 라이브러리를 사용하기 위해서는 다음의 내용이 있어야한다.
첫번째로는 DockerClient를 위한
implementation 'com.github.docker-java:docker-java:3.4.1'
현재 2025년 2월 12일 기준으로 최신 버전은 3.4.1이기에 해당 버전을 사용하였다.
두번째로는 Docker-Daemon과 소통하기위한 transport를 하나 설정해야하는데, 이 공식문서에서 지원하는 transport는 다음 문서에서 확인할 수 있다.
https://github.com/docker-java/docker-java/blob/main/docs/transports.md
docker-java/docs/transports.md at main · docker-java/docker-java
Java Docker API Client. Contribute to docker-java/docker-java development by creating an account on GitHub.
github.com
- Apache HTTP Client
- Zerodep ->> 우리가 사용할 것
- OkHttp
- Netty
- Jersy
이렇게 총 다섯가지가 있었고, 나는 Apache Http Client와 OkHttp로 테스트를 해보았지만 실패하였고, 그래서 결국엔 Zerodep를 선택할 수 밖에 없었다. (저걸로 하니까 그냥 바로 잘 됨)
그렇기에 최종적으로는 아래와 같이 의존성을 주입하기 위하여 build.gradle에 다음과 같이 작성한다.
implementation 'com.github.docker-java:docker-java:3.4.1'
implementation 'com.github.docker-java:docker-java-transport-zerodep:3.4.1'
그리고 Gradle 다시 리프레쉬 하면 적용이 될 것이다.
아, 혹시라도 내가 ApacheHTTPClient를 쓰고 싶다면
implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.4.1'
이렇게 쓰면 된다.
프로젝트 구조
일단은, 아직 코드가 다 완성되지도 않았고 기본적인 목표는 스프링을 이용해서 도커를 생성, 삭제, 실행이 되는지만 확인할 것이다.
그렇기에
아래와 같이 프로젝트를 생성하였고, ContainerService에 실질적으로 오늘의 내용들은 거의다 작성되었다고 보면 된다.
DockerClientConfig 설정하기
기본적으로 그냥 설정이 되어있기에 바로 사용하기 위해서는
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.DefaultDockerClientConfig;
DockerClientConfig standard = DefaultDockerClientConfig.createDefaultConfigBuilder().build();
이렇게 작성해주면 된다.
그러나 무엇인가 추가적으로 설정을 해주고 싶다면
DockerClientConfig custom = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://docker.somewhere.tld:2376") // Docker 데몬이 위치한 호스트 URL 지정
.withDockerTlsVerify(true) // TLS 검증 활성화 여부
.withDockerCertPath("/home/user/.docker") // TLS 인증서 경로 지정
.withRegistryUsername(registryUser) // 도커 레지스트리 사용자명
.withRegistryPassword(registryPass) // 도커 레지스트리 비밀번호
.withRegistryEmail(registryMail) // 도커 레지스트리 이메일
.withRegistryUrl(registryUrl) // 도커 레지스트리 URL
.build();
. with ~~ 을 통해서 설정을 지정해주면 된다.
각 설정들은 기본적으로 우선순위를 따르게 되는데
1. docker-java.properties : 파일 내에 직접 설정한 프로퍼티
//docker-java.properties
DOCKER_HOST=unix:///Users/seo/Library/Containers/com.docker.docker/Data/docker-cli.sock
DOCKER_TLS_VERIFY=0
이런식으로 설정한다.
2. 시스템 프로퍼티 : 애플리케이션 실행시 옵션으로 전달한 값
@SpringBootApplication
public class DotcarApplication {
public static void main(String[] args) {
System.setProperty("DOCKER_HOST", "unix:///var/run/docker.sock");
SpringApplication.run(DotcarApplication.class, args);
}
3. 시스템 환경변수 : export ~ 같은 거
4. 파일시스템 :홈디렉터리의 $HOME ~
5. 클래스패스 : 같은 클래스 내 /docker-java.properties
이런 거 왜 설정해놨냐고? 나도 하고 싶지 않았어;;
하루종일 했는데 안 되더라고;;;
DockerHttpClient 생성하기
다음 파트이다.
DockerHttpClient 설정인데, Docker-Daemon과 Http통신을 하기 위한 클라이언트 생성하는 부분이다.
implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.4.1'
// DockerHttpClient 인스턴스 생성 -> Docker 데몬과 HTTP 통신을 하기 위한 클라이언트를 생성
// private final DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
// .dockerHost(config.getDockerHost()) // DockerClientConfig에서 Docker 호스트 정보 가져오기
// .sslConfig(config.getSSLConfig()) // SSL 구성 (TLS 인증서 등)
// .maxConnections(100) // 최대 연결 수 설정
// .connectionTimeout(Duration.ofSeconds(30)) // 연결 타임아웃 설정
// .responseTimeout(Duration.ofSeconds(45)) // 응답 타임아웃 설정
// .build();
이대로 설정해주면 된다.
(주석 봐줘;;안 돼서 주석처리함 ㅠㅠ)
만약에 본인처럼
implementation 'com.github.docker-java:docker-java-transport-zerodep:3.4.1'
이 zerodep 의존성을 설정했다면
DockerHttpClient httpClient = new ZerodepDockerHttpClient.Builder()
.dockerHost(config.getDockerHost()) // DockerClientConfig에서 Docker 호스트 정보 가져오기
.sslConfig(config.getSSLConfig()) // SSL 구성 (TLS 인증서 등)
.maxConnections(100) // 최대 연결 수 설정
.connectionTimeout(Duration.ofSeconds(30)) // 연결 타임아웃 설정
.responseTimeout(Duration.ofSeconds(45)) // 응답 타임아웃 설정
.build();
이렇게 설정을 해준다.
DockerClient 설정하기
Dockerclient는 DockerClientConfig와 DockerHttpClient를 결합하여 Docker Daemon에 명령을전달할 수 있는 객체이다.
아까 위의 코드 그 밑에다가 바로
private final DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient);
한 줄 작성 해주면 된다.
ContainerService 전체 코드
package com.hanbat.dotcar.container;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.PullImageResultCallback;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
import com.github.dockerjava.zerodep.ZerodepDockerHttpClient;
import org.apache.commons.io.LineIterator;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;
import javax.print.Doc;
import java.time.Duration;
@Service
public class ContainerService {
/**************************/
/** 공식 문서 사용 도커 연결 **/
// DockerClientConfig 인스턴스 생성 -> Docker 데몬에 접근할 수 있도록 환경 설정(예: DOCKER_HOST, 인증 관련 정보 등)을 제공하는 객체를 생성
private final DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
// .withDockerHost("unix:///var/run/docker.sock")
.build();
private final DockerHttpClient httpClient = new ZerodepDockerHttpClient.Builder()
.dockerHost(config.getDockerHost()) // DockerClientConfig에서 Docker 호스트 정보 가져오기
.sslConfig(config.getSSLConfig()) // SSL 구성 (TLS 인증서 등)
.maxConnections(100) // 최대 연결 수 설정
.connectionTimeout(Duration.ofSeconds(30)) // 연결 타임아웃 설정
.responseTimeout(Duration.ofSeconds(45)) // 응답 타임아웃 설정
.build();
// DockerClient 인스턴스 생성 -> DockerClientConfig와 DockerHttpClient를 결합하여 Docker 데몬에 명령을 전달할 수 있는 DockerClient 객체를 생성
private final DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient);
/**************************/
public ContainerInfoDto createContainer(CreateContainerRequestDto createContainerRequestDto){
}
}
이렇게 연결을 위한 기본 설정이 완료 되었다.
에필로그
바로 다음장에서 컨테이너를 생성하는 코드 작성을 진행하겠다.
현재 블로그 글 작성하기 전에 컨테이너 생성까지는 되었는데, 아직 구체화가 되지 않아서 구체화 다 된채로 한 편에 올릴지, 지금까지의 과정만 작성해서 2회에 나눠서 올릴 지 고민중이다 (귀찮아서 안 올리진 않겠지 설마)
지금까지의 진행상황은
https://github.com/Vak-kas/TCAR_VM/tree/container
GitHub - Vak-kas/TCAR_VM: 가상머신
가상머신. Contribute to Vak-kas/TCAR_VM development by creating an account on GitHub.
github.com
여기서 확인할 수 있다.
'웹 개발' 카테고리의 다른 글
[SpringBoot] docker-java 사용하여 스프링부트로 도커 조작하기 - 컨테이너 생성(2/3) (0) | 2025.02.14 |
---|---|
[SpringBoot] docker-java 사용하여 스프링부트로 도커 조작하기 - 컨테이너 생성(1/3) (0) | 2025.02.13 |
[장고] 회원가입 기능 상세하게 마무리 (이메일 인증) (0) | 2024.03.08 |
[장고] 회원가입시 이메일 인증하기(이메일 유효성 검사) #5 (1) | 2024.02.11 |
[장고] JWT 사용하기 #4 (0) | 2024.02.10 |