[web] Docker 를 이용한 DB 사용법

hyewon jeong·2023년 2월 19일
0

web

목록 보기
5/24

💻 도커

도커란?

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.

컨테이너란?

컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(Linux Container)가 있습니다.
기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어집니다.

한 서버의 여러 OS를 가상화 하여 사용하는 것과 컨테이너 방식으로 프로세스를 격리시켜 동작하는 방법은 어떠한 차이점이 있을까요?

기존에 우리에게 익숙한 VM같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용합니다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다고 봐도 무방합니다. 반면에 컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됩니다. OS 가상화를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴수 밖에 없습니다. 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진위에서 바로 동작하며 Host의 커널을 공유합니다. 커널을 공유하게 되면 io처리가 쉽게 되어 성능의 효율을 높일 수 있습니다.

컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다.

이렇게 쓰고보니 컨테이너기반이 OS가상화보다 뛰어나다라고 말하는 것 같지만 그렇지는 않습니다.
Docker를 소개하는 포스트인만큼 OS가상화에 비해 컨테이너기반의 가상화가 좋은점을 강조하며 Docker를 왜 쓰는지에 대해 설명을 한 것입니다.

OS가상화는 컨테이너기반 가상화보다 더 높은 격리 레벨을 지원합니다. 이는 보안적인 측면에서 더욱 유리합니다.
또한 OS가상화의 커널을 공유하지 않는 장점 또한 있습니다. 커널을 공유하지 않는 만큼 멀티 OS가 가능하다는 것입니다. 커널을 공유하지 않아 멀티 OS가 불가능 하다는 것은 Linux위에 Window를 올릴 수 없다는 단점이 있는 것이죠. 그럼에도 왜 Docker를 쓰는 이유는 성능향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성이라고 생각합니다.


Docker Image란 컨테이너를 실행할 수 있는 실행파일, 설정 값 들을 가지고 있는 것이라고 생각 하면 됩니다.
그림과 같이 Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 되는 것이죠.

도커 설치

  1. doker 검색하여 설치

  2. 하단 고래모양에 마우스커서를 대면 'Engine runnig' 뜨는 경우 : 도커를 백그라운드에 띄워 쓰겠다라는 의미로 실행되고 있음을 의미함

💻 Docker에 PostgreSQL 사용법

PostgreSQL 컨테이너를 생성하고 진입하기

		// docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=teasun -e POSTGRES_DB=messenger --name postgres_boot -d postgres

    // docker exec -i -t postgres_boot bash
    // su - postgres
    // psql --username teasun --dbname messenger
    // \list (데이터 베이스 조회)
    // \dt (테이블 조회)
    
        // IntelliJ Database 에서도 조회 
        (자바어플리케이션에서 이 컨테이너에 접속하기 위해서는 포스트그래SQL 주소를 입력해주어야함

    String url = "jdbc:postgresql://localhost:5432/messenger";
    String username = "teasun";
    String password = "pass";
  1. PostgreSQL을 위한 컨테이너를 생성하기 위해서는 아래와 같이 입력한다.
 docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass -e POSTGRES_USER=teasun -e POSTGRES_DB=messenger --name postgres_boot -d postgres

위의 각 항목은 다음과 같다.
(1) docker run : docker image에서 container를 생성한다.
(2) -p 5432:5432 : 해당 container의 port forwarding에 대해 inbound/outbound port 모두 5432으로 설정한다.( 내 로컬 포트 5432 서버에 연결 시켜주겠다.)
(3) -e POSTGRESPASSWORD=pass :환경변수로 루트내의 암호를 POSTGRES_PASSWORD = pass로 설정
(4) -e POSTGRES_USER= hyewon : 환경변수로 POSTGRES_USER를 =hyewon 로 설정
(5) -e POSTGRES_DB=messenger : 포스트그래스
디비 이름을 메신저로 설정
(6) -d postgres : postgres이라는 이미지에서 분리하여 container를 생성한다.

  • -d : 대문으로 백그라운드에 다시 띄우겠다.

  • postgres : 실제 이 포스트그레스ql이 설치되어 있는 도커 이미지를 말함. 그러니까 이제 설치되어 있는 서버컴퓨터를 하나 새로 띄운다라고 보면됨


    PostgreSQL 컨테이너 생성 됨

  1. PostgreSQL 컨테이너 에 접속

    /**
    //docker exec -i -t postgres_boot bash
     * postgres_boot 라는 이름으로 생성한 컨테이너에 접속해서 배쉬명령어를 실행하겠다.
     * 위의 코드를 입력하면  루트계정으로 접속해서 실제 컨테이너에 접속한걸 알수 있음 .
     * root@ab2ee581a61b:/#
     *
     *  docker-entrypoint-initdb.d  e 명령어를 통해 이미 포스트그레스ql이 떠있음
     *  // su - postgres
     *  그래서 계정을 루트에서 ->포스트그래스 계정으로 바꾸고
     *  //psql
     *   psql 명령어가 잘 되는지 확인
     *   ㄴ 이 명령어가 에러나는 이유는 유저네임이 안 걸렸기 때ㅑ문임 , 디비네임도 같이 명시해서 접속하기
     *   // psql --username teasun --dbname messenger 입력
     */


    메신저 디비에 hyewon이라는 설정한 유저네임으로 접속한것을 알수 있음

\list (데이터 베이스 조회)
\dt (테이블 조회)
// 현재 테이블 조회시 처음생성되어 비어 있다. 


  @Test
  @DisplayName("JDBC DB 연결 실습")
  void jdbcTest() throws SQLException {



/**
 * // \list (데이터 베이스 조회)
 * // \dt (테이블 조회)
 *   String url = "jdbc:postgresql://localhost:5432/messenger";
 *     String username = "teasun";
 *     String password = "pass";
 */

    String url = "jdbc:postgresql://localhost:5432/messenger";
    String username = "hyewon";
    String password = "pass";

    try {
      try (Connection connection = DriverManager.getConnection(
          url)) {
        String createSql = "CREATE TABLE ACCOUNT (id SERIAL PRIMARY KEY, username varchar(255), password varchar(255))";
        PreparedStatement statement = connection.prepareStatement(createSql); // 쿼리를 요청하게 해줌
        statement.execute();// 쿼리 실행

        statement.close();
        connection.close();
      } // 커넥션을 생성하여 쿼리를 요청할 수 있는 statement 만들고 ,
      ;
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}
//PostgreSQL 의존성 추가
implementation 'org.postgresql:postgresql:42.2.27'

```
// when
   try (Connection connection = DriverManager.getConnection(url, username, password)) {
     System.out.println("Connection created: " + connection);
// try 문에 넣어주면 close를 별도로 해줄 필요 없이 자동으로 try이가 끝날때 close된다. 
     String insertSql = "INSERT INTO ACCOUNT (id, username, password) VALUES ((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), 'user1', 'pass1')";
     try (PreparedStatement statement = connection.prepareStatement(insertSql)) {
       statement.execute();
     }

실행후 터미널 창에 \dt 하여 테이블 생성됐는지 확인
또는 postgreSQL에서 확인 가능

postgreSQL에서 확인 가능

우측 데이터베이스 클릭하여 postgreSQL 클릭

입력한 정보를 기입 후 test connection하여 연결한후 apply -> ok

PostgreSQL DB 가 연결 된것을 알 수 있다.


콘솔창에서 직접 쿼리를 보낼 수도 있다.

참고
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90

profile
개발자꿈나무

0개의 댓글