[1] Docker

2024. 10. 16. 17:58Docker

- 기본 컨셉

-> 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