본문 바로가기

IT

도커라이즈 (MariaDB 이미지, docker compose, NginX Proxy Manager)

728x90

각각의 컨테이너에서 요청이 들어오면 Nginx가 SpringBoot에게 넘기고 DB가 필요하면 MariaDB에게 부탁하는 이상적인 형태로 도커라이즈를 진행해보려 한다.

 

이전에는 DB를 따로 설치해서 사용하였는데 이번에는 DB는 MariaDB 도커 이미지를 실행시키려고 한다. 기존에 MariaDB가 설치되어 있다면 삭제 해주도록 한다.

MariaDB 삭제

  • sudo yum remove mariadb
  • sudo rm -rf /var/lib/mysql
    • 잔존 데이터 삭제
  • sudo rm -rf /etc/my.cnf.d*
    • 잔존 설정파일 삭제

다음은 기본적으로 만들어져 있는 MariaDB 이미지를 실행한다.

MariaDB  이미지 실행

https://hub.docker.com/_/mariadb

# 컨테이너 실행
docker run \
  --name mariadb_1 \
  -d \
  --restart unless-stopped \
  -e MARIADB_ROOT_PASSWORD=lldj123414 \
  -e TZ=Asia/Seoul \
  -p 3306:3306 \
  -v /docker_projects/mariadb_1/conf.d:/etc/mysql/conf.d \
  -v /docker_projects/mariadb_1/mysql:/var/lib/mysql \
  -v /docker_projects/mariadb_1/run/mysqld:/run/mysqld/ \
  mariadb:latest

보안설정

  • docker exec -it mariadb_1 /usr/bin/mariadb-secure-installation

계정 생성 및 권한 부여

  • docker exec -it mariadb_1 mysql -u root -p => 도커내부에 있는 mariadb를 실행하기 때문에 docker exec -it [컨테이너]를 명령어 앞에 붙여준다.
  • GRANT ALL PRIVILEGES ON . TO lldj@'%' IDENTIFIED BY 'lldj123414'; => mysql에서 * 대신 % 사용 ex) lldj@127.0.0*
  • GRANT ALL PRIVILEGES ON . TO lldjlocal@127.0.0.1 IDENTIFIED BY '1234';
  • GRANT ALL PRIVILEGES ON . TO lldjlocal@'172.17.%.%' IDENTIFIED BY '1234';

테스트용 테이블 생성

CREATE DATABASE app20220916_2__test;
CREATE DATABASE app20220916_2;

USE app20220916_2;

CREATE TABLE `article` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `subject` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

insert  into `article`(`id`,`subject`) values 
(1,'1'),
(2,'2');

실행 결과

실행결과 테스트로 넣은 임의의 값 이 잘 찍히는 것을 확인할 수 있다.

실행 결과

 

지금까지 DB 이미지를 받아서 스프링부트 프로젝트와 연동할 수 있도록 작업하였다.

이번에는 nginx를 사용해보려한다.

https를 사용하기 위해서 무료SSL, Let's ENcrypt(자동 갱신)등의 방법이 있지만 필자는 Nginx Proxy Manager를 사용한다.  

필자는 로컬에서 강제로 도메인을 입히기 위해 C:\Windows\System32\drivers\etc\hosts에서 hosts 파일을 수정해주었다. 

참고 https://sh970901.tistory.com/50?category=958061  

 

192.168.21.5	java.site1.com
192.168.21.5	java.site2.com
192.168.21.5	java.site3.com
192.168.21.5	java.site4.com
192.168.21.5	java.site5.com
192.168.21.5	java.site6.com
192.168.21.5	java.site7.com
192.168.21.5	java.site8.com

디렉토리 생성

  • mkdir -p /docker_projects/nginx_2
  • cd /docker_projects/nginx_2

docker-compose.yml 생성

  • vim docker-compose.yml
  • Dockerfile => 도커 기본
  • yml => docker compose (조금 더 설정을 많이 할 수 있다)
  • nginx proxy manager 정보가 DB에 저장된다
version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest' //받을 이미지 
    restart: unless-stopped // stop 하기전 까지 restart
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
    environment:     //DB에 설정 내용 저장
      TZ: "Asia/Seoul"
      DB_MYSQL_HOST: "172.17.0.1"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "[계정]"
      DB_MYSQL_PASSWORD: "[password]"
      DB_MYSQL_NAME: "nginx"
    volumes: //.은 pwd로 현재 위치 확인
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

DB 생성

  • docker exec -it mariadb_1 mysql -u root -plldj123414
  • CREATE DATABASE nginx;
  • exit

도커 compose 실행

  • docker compose up -d
  • 실행하면 docker-compose.xml 파일을 읽고 다음과 같은 파일이 생긴다.

ls
admit port 81

admin web port로 지정한 81번 포트로 접근하면 이와 같은 화면이 출력된다.

임시 관리자 계정 admin@example.com, changeme 

참고 https://nginxproxymanager.com/guide/#project-goal 

 

host 추가

Host 추가

host 설정

도커 컨테이너 nginx(80, 443, 81port)에서 스프링(8080 port)으로 바로 소통이 안되기 때문에 바깥 OS의 포트를 거쳐 접근해야 한다. 따라서 IP는 172.17.0.1 (바깥 OS)의 8080으로 설정한다. 이렇게 하면 도커에서 바깥으로 나가고 8080 포트를 통해 다시 OS에 접근하고 뚫어놓은 포트를 통해 스프링 프로젝트에 접근할 수 있다. (현재 로컬에서의 가짜 도메인 java.site2.com 이기 때문에 SSL은 생략)

실행 결과

 

실행 결과

 

현재 상황

 

현재 상황

도커 컨테이너 Spring, mysql, nginx가 있고 nginx에는 docker compose 에서 설정한 3개의 포트, 그리고 nginx를 통해 java.site2.com(host에서 설정한 IP 192.168.21.5)에 접근하면 172.17.0.1(OS)의 8080 포트를 사용해 스프링에 접근하는  구조이다. 스프링에서 DB을 조회했을 경우도 마찬가지로 바로 접근하는 것이 아닌 172.17.0.1을 3306을 통해 접근하는 것이다.