2024. 10. 16. 17:58ㆍDocker
- 기본 컨셉
-> API서버 -> 도커 이미지 > 도커허브 public > DB를 내걸로 사용하고싶다면?
1. 도커이미지 만들기
- 로컬환경에서 만들면 로컬환경에서 실행 가능 (DB가 문제가되긴함)
2. 도커허브에 업로드
3. 다운로드
4. 내것에 있는 DB를 사용
1) gradle > jar파일 만드는 명령어가 있다.
> build/jar 실행 > jar파일로 도커이미지를 만드는 방법
>> 문제점 : 못만들면 문제 = 컴파일부터 다시해야한다.
1. 프로젝트 루트 > new > docker File
2. DockerFile
FROM openjdk:17-jdk-alpine
COPY build/libs/*.jar app.jar
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app.jar"]
3. docker login
4. terminal
> docker build -t api1014 .
5. dockerdesktop / docker image에 보면 추가된것을 확인할 수 있다.
- 실행은 되지만 DB가 없어서 오류가 난다.
- 이미지 : cd같은것 > 실행을 하면 컨테이너라는 곳에서 실행된다.
- 컨테이너 : 기본적으로 Linux이다.
> Docker이미지를 실행한다 > 리눅스(비스무리한) 머신을 하나띄운다.
>> localhost:3306하면 실행안된다.
>>> cmd창에서 docker run명령어로 실행 ( 이때 포트를 열어줄 수 있다 )
>>>> docker run -p (몇번 포트를 열것이냐)
>>>>> docker run -p 8085:8080 api1014:latest
>>>>>> 바깥쪽 포트 : 8085, 내부포트 : 8080
>>>>>>> 도커 뜨는지 확인만 가능하다. 에러뜸
실행에 실패한 이유 : DB가 없다.
host: 도커를 실행하고 있는 윈도우
host쪽에서 3306을 써야한다. 헌데 컨테이너는 격리되어있는 환경이다. > 그래서 이것을 못씀
> 옵션을 줄때 hosting을 지정해줘야함
>> 이 도커의 컨테이너가 host와 연결을 해서 실행할 수 있음
docker run --name api_1014 -p 8080:8080 -e HOST_IP=10.10.10.181 -e SPRING_DATASOURCE_URL=jdbc:mariadb://10.10.10.181:13306/bootdb api1014
- -e : 오버라이드 하는 부분 ( yml 파일에 설정되어있는 것을 변경함 )
- wsl = 도커 내부의 네트워크
6. 도커 컨테이너
7. Logs보면 로그 쭉 나와있다.
> 다지움
왜? 각팀에서 가위바위보 진사람 한명만 뽑는다.
============================================================================================
다른사람이 올린 도커이미지 활용방법
- 업로드
1. intelliJ
2. terminal > docker build -t 계정/api1014 .
-t는 태그를 주는건데 본인의 계정
3. docker image 생성 후 확인
4. docker push 계정/api1014
> 이미지 이름 지정
> 버전 따로 안주면 latest붙는다.
5. 올라가면 허브에 repository 보면 업로드되어있어야 한다.
----------------------------------------------------------------------------------
haenjuna
docker run --name api_1014 -p 8080:8080 -e HOST_IP=10.10.10.181 -e SPRING_DATASOURCE_URL=jdbc:mariadb://10.10.10.181:13306/bootdb haenjuna/api1014
local DB를 사용하는것
2024.10.24 도커2
-------------------------------------도커----------------------------------------------------------------------------------------------------------------------
- 가상화
- 컨테이너 기술
- 컨테이너와 오케스트레이션
Docker 구조
- 도커는 리눅스에서 실행된다.
> docker를 실행하려면 wsl을 설치했던 것이다.
>>도커가 없을때는 가상머신이라는것을 설치했다.
>>>도커를 쓰게 되면 가상머신이 무겁고 종속적인문제가 생기는데 이런문제가 없어진다.
가장 큰 특징
- 1회용
- 도커의 컨테이너를 만들면 업데이트 없다.( 스냅샷이다 )
- 내가 필요할때마다 잠깐 사용하고 버리는것
- DB를 여러개 사용해야할때 각 설정이 다른데 도커에서는 컨테이너라는것으로 다 따로따로 설정할 수 있다.
- Docker를 모아서 한번에 운영하는 ScaleOut이라고하는데 모아서 할수있게끔 하는게 kubernetes이다.(k8s)
쿠버네티스
- yml파일로 한 이유 : kubernetes설정을 yml로 한다.
- yml파일만 가지고 이것에 맞게끔 스스로 알아서 조절한다.
여러 DB를 사용할때 - port번호가지고 다 따로따로 만들어서 사용할 수 있다.
- AWS에서도 S3, EC2처럼, Kubernetes가 있다.
그럼 쿠버네티스를 통한 실습은?
- miniKube > 개인적으로 써보고싶으면 이걸 사용해보면된다.
[ 쿠버네티스 ]
- 1주일에 수십억개의 컨테이너를 운영해야 하는 구글 = 시스템에 가장 이상적인 상태를 이야기해주면 내가 유지해줄게
- 어떤 서비스를 만들어서 올린다. 예를 들어, 서버를 하나만들고 운영을 한다면?
> 모니터링이 필요하다
>> spring에서도 라이브러리를 지원한다.
>>> 쿠버네티스는 이그네스라는 서비스가 있다 > 내가 이번에 운영하는데 모니터링을 해야해 > 서비스중에 yml설정에 이그네스 쓸거야 설정을 잡아주면 아무것도안해도 잡아준다.
>>>> 로드발란서를 할거야! > 서비스 쓸거야라고 표현만하면 알아서 로드발란스 해준다.
>>>>> 개발자가 소프트웨어로 하던것들이 서비스로 빠져있는것들이 쿠버네티스가 해준다.
>>>>>> 이것은 데브옵스의 영역이였다.
- 도커 컴포즈 : 여러개의 컨테이너를 묶어서사용하는것
- 헬름 : 얘로 조종을 한다.
도커는 '데이터 또는 프로그램을 격리'
- 도커 엔진
- 도커 이미지
- 도커 컨테이너
1. 프로젝트 내에 DockerFile 생성
> 이미지를 만드려면 필요하다. 만드는이유
1) 로컬에서 사용할 것이냐?
2) ㅊ5 ㅅ 남들과 같이 쓸 것이냐
> 도커허브의 계정이 필요함
- 도커파일을 만드는이유 : 이미지를 만들기 위해서
이미지 : 클래스 (엔진, 미션...)
컨테이너 : 인스턴스 (소나타, 그렌저...)
- 파일명은 계정이름을 붙여서 만들어라.
- (-t) = 이름, 태그가 된다.
- 명령어 : docker 목적어 작업이 붙는다.
ex) docker images -t ....
- docker image rm 이미지 삭제할 때
> 도커에 이미지가 삭제되면 기록했던 데이터가 사라진다.
>>사용하고 있는 볼륨이라던지 세팅해놓은것들 다 사라짐
[ 컨테이너의 구성 ]
- 하나의 컨테이너에 여러개의 SW구조
- 하나당 하나의 SW 구조
-> 이런것들을 묶어서 compose라는것으로 사용할 수 있다.
도커 컨테이너 라이프사이클
- 일회용에 가까운 사용용도
- 컨테이너의 소멸
[ 컨테이너 관련 명령어 ]
- docker run : 이미지를 다운하고 실행까지 할 수 있게끔 하는것
- ( -d ) : 백그라운드로 실행하게 한다. ( 따로뜨게끔 할 때 )
> 문제점 : 로그를 봐야할 때가 있는데
[실습]
부트 파일 만들고
docker파일 넣고
- ./gradlew bootjar실행해서 jar파일 만든다.
> build에 자르파일 생성확인
> 명령어 앞에 PS붙어있으면 ./ 붙여줘야한다. (Power Shell)
1. ./gradle bootJar
2. image 빌드 - docker build -t kimborisd1_container .
> run 하면 옵션이 있는데 잘못해서 아무설정안하고 실행했다 > 그럼 로그가 뜨는데
> 이렇게 하면 이 창을 띄워야만 로그를 볼 수 있다 그것을 편하게 하기 위해 이렇게 해보자
3. 컨테이너에 보면 랜덤하게이름을 만들어서 보여준다.
4. 이미지이름 기억해서 docker logs -f 100 --tail [container name] 하면 로그를 찍는다.
docker logs -f --tail 100 [container name]
(--tail 앞으로 몇라인 추적할거니)
내꺼에서 먼저 실행하고 싶으면
docker run --name d1 -d kimborisd1_container
(--name : 컨테이너의 이름)
docker logs -f --tail 100 d1
> 로그 찍어볼 수 있다.
5. controller.package / SampleController.class
6. ./gradlew bootjar 실행
7. docker build -t KimBoris/d1_container .
8. docker push KimBoris/d1_contanier
9. docker hub에 가서 보면 이미지가 만들어져 있어야 한다.
10 . 접근할 수 있는 포트/내부 포트
11. docker run --name myserver -p 8080:8080 -d kimboris/d1_container
12. 컨테이너의 번호만 뜬다.
13. 실행되는것을 확인해보면 myserver실행되고 있는것이 보임
도커 허브에 이미지 밀어넣기
- docker push <이미지 이름>
- 도커 허브에 만들어져있다.
다른 사람 피시에 통합하기
- docker pull <남의 이미지 이름>
포트번호 바꾸기
- docker run --name <새 컨테이너 이름> -p 8080:8080 -d <이미지 이름>: 내꺼
- docker run --name <새 컨테이너 이름> -p 8081:8080 -d <이미지 이름>: 남의꺼
- 만약 8080, 8081, 8082에서 하나의 DB를 사용하려면?
1 네트워크를 하나 만들어 줘야한다.
2. host옵션 지정방법
-------------------------------------------------------------------Host옵션 지정방법-------------------------------------------------------------------
1. 내가 혼자 사용할때는 localhost에 있는 DB를 쓰고싶어 > 3306사용하면된다.
도커에서 하고싶어 하면 바꿔줘야한다.
- 도커를 실행할때 '-e'라는 변수가 있다 ( 환경변수 세팅 )
2. gradle 수정
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
3. DB를 도커에 설치해줘야 한다.
- docker를 기반으로 DB를 쓸거냐
- 기존의 DB를 사용할 것이냐?
1) docker를 기반으로 DB
- docker run -dit
--network myproject-net
--name devMaria
-p 3306: 3306
-e MARIADB_ROOT_PASSWORD=[password]
-e MARIADB_DATABASE=[da name]
-e MARIADB_USER=[userID]
-e MARIADB_ROOT_PASSWORD=[userPw]
mariadb
> network가 없다는것은? 난 나만의 넌 너만의 네트워크가 있다면?
> 연동이 되지 않는다. > intelliJ에서 띄울때는 문제가 없다.
> docker환경에서 띄우면 localhost로 연결되는데 그럼 못본다.
>> docker에서는 이문제를 어떻게 해결할 것이냐
>>>
- docker run -dit
--network myproject-net
--name devMaria
-p 3306: 3306
-e MARIADB_ROOT_PASSWORD=[password]
-e MARIADB_DATABASE=[da name]
-e MARIADB_USER=[userID]
-e MARIADB_ROOT_PASSWORD=[userPw]
mariadb
4. 명령어 실행
docker run --name maria1024 -p 3316:3306 -e MARIADB_ROOT_PASSWORD=12345678 -e MARIADB_DATABASE=bootdb2 -e MARIADB_USER=bootdb2user -e MARIADB_PASSWORD=bootdb2user mariadb
5. 프로젝트에 DB연결 3316으로
테스트하고 apply 이상없어야 한다.
6. applcation.yml
spring:
application:
name: api1
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3316/bootdb2
username: bootdb2user
password: bootdb2user
hikari:
minimum-idle: 2
maximum-pool-size: 5
connection-timeout: 5000
jpa:
hibernate:
ddl-auto: update
dialect: org.hibernate.dialect.MariaDB103Dialect
show-sql: true
properties:
hibernate:
format_sql: true
7. project run
- DB연결 안되면 에러나는데 그것부터 확인
8. SampleController
@RestController
@Log4j2
@RequiredArgsConstructor
public class SampleController {
private final DataSource dataSource;
@GetMapping("hello")
public String[] hello() {
log.info("hello");
log.info("========================================");
log.info(dataSource);
return new String[]{"Boris","Kim","AAA", dataSource.toString()};
//shong park hi
}
}
9. localhost:8080/hello
결과값
-> 여기 까지 됐다? 나는 도커에있는 마리아디비 사용해서 개발했다.
호스트머신에서 도커에 있는 내 도커에있는 마리아 디비랑 연결해서 작업은 된다.
근데 이것을 도커의 이미지로 만들었따 > 도커의 이미지를 만들어서 실행을 하려면 컨테이너라는 격리되어있는 환경에서 실행되기 떄문에 localhost3306이라는애는 못찾는다.
>> 이문제를 어떻게 해결할 것이냐?
>>>1. 네트워크, 2. 도커에서 run할때 옵션을 줬는데 그것을 줘야한다.
>>>docker compose파일을 갖다 쓰면한번에 해결되지만 일단 차근차근가자
1. docker 에 network create my-network이름을 준다.
2.컨테이너 실행시 - network my-network ( my-network에서 실행할거야 ) 하면 같은 네트워크 망이 된다.
3. 옵션으로 로컬호스트가 아닌 주소를 변경해서 뺄 수 있다. ex) mariadb1024:3316으로 사용하면 mariadb1024주소를 활용한다.
[실습]
1. docker network create dev_network
2. docker run DB
docker run -dit --name maria1024 -p 3306:3306 --network dev_network -e MARIADB_ROOT_PASSWORD=12345678 -e MARIADB_DATABASE=bootdb2 -e MARIADB_USER=bootdb2user -e MARIADB_PASSWORD=bootdb2user mariadb
2. docker desktop
3. DB연결
docker run --name boris_d1 -p 8080:8080 --network dev_network -e spring.datasource.url=maria1024:3306/bootdb2 kimboris/d1_container:latest
- 잘못되면 도커 컨테이너부터 삭제하고 다시
정리 -
1. docker network create dev_network;
2. --network dev_network 추가해서 실행하게 ( mariaDB )
3. docker run -- name boris_d1 -p 8080:8080 --network dev_network + 마리아 DB정보
[ DB 구조 연결 방법 ]
DB | 서버(WAS) | |
별도의 DB서버 추천 | 호스트 | 호스트 |
호스트 | Docker | |
Docker | 호스트 | |
Docker | Docker |
'Docker' 카테고리의 다른 글
[2] Docker (1) | 2024.10.25 |
---|