관리 메뉴

진취적 삶

docker를 이용한 3tier 구축하기 nginx ,tomcat,db 본문

개발

docker를 이용한 3tier 구축하기 nginx ,tomcat,db

hp0724 2024. 1. 18. 01:19

3 tier 설명

Web Server : 클라이언트로부터 HTTP 요청을 받아들이고 ,해당 요청에 대한 응답을 생성하여 클라이언트에게 제공하는 소프트웨어 정적인 콘텐츠 (HTML)을 제공하여 동적인 콘텐츠는 웹 애플리케이션 서버 나 다른 백엔드 서버에서 처리된다.

 

NGINX : 높은 성능과 안정성을 가진 오픈 소스 Web Server 소프트웨어이다.

리버스 프록시 서버로도 사용된다. 부하분산 , 캐싱 및 SSL/TLS 을 지원한다.

 

Web Application Server : 웹 애플리케이션을 실행하고 관리하는 소프트웨어 환경을 제공하는 서버

웹 서버와는 다르게 동적인 콘텐츠 생성, 데이터베이스 연동, 비즈니스 로직 처리 등과 같은 고수준의 작업을 처리하는 데 중점

 

apache tomcat : Apache Tomcat은 자바 웹 애플리케이션 서버로서, Java Servlet, JavaServer Pages (JSP), 그리고 Java API를 실행할 수 있도록 설계된 오픈 소스 소프트웨어이다.

 

DB : 데이터베이스는 체계적으로 구성된 데이터의 모음이며, 효율적인 데이터 관리를 위해 설계되었다. 데이터베이스는 정보를 저장, 검색, 갱신 및 관리하는 데 사용된다.

 

maria db :MariaDB(마리아디비)는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)으로, MySQL과의 호환성을 갖춘 데이터베이스 서버

docker 를 이용한 3 tier 구축 과정

우분투 버젼

우분투 ssh 입장

ssh suha@172.16.210.43

우분투 도커 설치

sudo apt-get update && upgrade 

패키지 설치

sudo apt-get install ca-certificates curl gnupg lsb-release 

Docker GPG key 등록

mkdir -p /etc/apt/keyrings
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --
dearmor -o /etc/apt/keyrings/docker.gpg
  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg
    • curl 명령어는 주어진 URL에서 데이터를 다운로드한다.
    • 이 명령어는 Docker의 공식 GPG 키를 다운로드한다.
  2. sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg:
    • sudo: 명령어를 관리자 권한으로 실행한다.
    • gpg 명령어는 GnuPG를 실행하는 명령어로, 여기서는 Docker의 공식 GPG 키를 변환하고 저장한다.
    • 옵션:
      • -dearmor: GPG 키를 ASCII-armor 형식에서 바이너리 형식으로 변환한다.
      • o /etc/apt/keyrings/docker.gpg: 변환된 GPG 키를 /etc/apt/keyrings/docker.gpg 파일에 저장한다.

도커 리포지토리 등록 설정

echo "deb [arch=$(dpkg --print-architecture) signedby=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/ubuntu> $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

도커 설치

# Update package list
sudo apt-get update

# Install Docker Engine
sudo apt-get install docker.io

# Install Docker Compose
sudo apt-get install docker-compose

도커 실행

systemctl start docker
systemctl enable docker
  •  systemctl start docker 현재 세션에서 도커 서비스를 시작합니다.
  • systemctl enable docker 는 도커가 부팅 시 자동으로 시작되도록 설정합니다.

nginx

nginx 설치

docker pull nginx 

docker images 
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    61395b4c586d   2 days ago     187MB
hello-world   latest    9c7a54a9a43c   4 months ago   13.3kB

nginx 실행

docker run --name ws_nginx -d -p 80:80 nginx
docker ps -a
suha@suha2:~$ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS                               NAMES
3fbe984628fa   nginx         "/docker-entrypoint.…"   18 seconds ago   Up 17 seconds              0.0.0.0:80->80/tcp, :::80->80/tcp   ws_ngnix
2a9c91d71655   hello-world   "/hello"                 6 minutes ago    Exited (0) 6 minutes ago                                       gracious_williams

nginx 확인

172.16.210.43 확인 

Tomcat

tomcat 구축

sudo docker pull tomcat 
sudo docker run -d -i -t --name was_tomcat -p 8080:8080 tomcat
  • sudo: 명령어를 관리자 권한으로 실행하도록 하는 명령어.
  • docker run: Docker 컨테이너를 실행하는 명령어.
  • d: 컨테이너를 백그라운드에서 실행 (detached mode).
  • i: 컨테이너의 표준 입력을 유지 (interactive mode)
  • t: 유사한 터미널을 제공하여 컨테이너에 연결(pseudo-TTY)
  • -name was_tomcat: 컨테이너의 이름을 "was_tomcat"으로 지정.
  • p 8080:8080: 호스트의 포트 8080을 컨테이너의 포트 8080에 매핑한다. 즉, 호스트의 8080 포트를 통해 컨테이너의 8080 포트에 접속할 수 있다.
  • tomcat: 사용할 Docker 이미지의 이름. 이 경우에는 "tomcat" 이미지를 사용하여 컨테이너를 생성하고 실행한다.
<http://172.16.210.43:8080/>

tomcat bash 접속

sudo docker exec -it was_tomcat /bin/bash
/usr/local/tomcat/webapps

해당 파일로 이동후 ROOT 폴더 만들기

mkdir ROOT

index.jsp 만들기

<html>
        <title>This is a test page</title>
        <body>
                this is a test page
        </body>
</html>
<http://172.16.210.43:8080/> 확인 

bash 에서 나가기

exit 

maria db

sudo docker pull mariadb

마리아 db 구동

sudo docker run --name mariadb -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234qwer! mariadb

마리아 db 쉘

docker exec -it mariadb /bin/bash

로그인

mariadb -u root -p

비밀번호

1234qwer!

계정 확인

use mysql 
select host,user,password from user;
+-----------+-------------+-------------------------------------------+
| Host      | User        | Password                                  |
+-----------+-------------+-------------------------------------------+
| localhost | mariadb.sys |                                           |
| localhost | root        | *758752F1936406AC9A3EEDE3106E6C207FB60EF7 |
| %         | root        | *758752F1936406AC9A3EEDE3106E6C207FB60EF7 |
| 127.0.0.1 | healthcheck | *E9593FC57C9D4C339A07A3ADB01FB3CCF1438312 |
| ::1       | healthcheck | *E9593FC57C9D4C339A07A3ADB01FB3CCF1438312 |
| localhost | healthcheck | *E9593FC57C9D4C339A07A3ADB01FB3CCF1438312 |
+-----------+-------------+-------------------------------------------+

테스트용 데이터베이스 만들기

create database homework 

테스트 용 테이블 만들기

CREATE TABLE user (
    name VARCHAR(50),
    age INT
);

데이터 넣기

INSERT INTO user(name, age) VALUES ('suha', 26);

WS(ngnix) -WAS(tomcat) 연결

docker exec -it ws_ngnix /bin/bash

설정 파일 수정

nano /etc/nginx/nginx.conf 
user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;

    keepalive_timeout 65;

    gzip on;

    upstream tomcat {
        server 172.16.210.43:8080;
    }

    server {
        listen 80;
        listen [::]:80;
        server_name localhost;

        location / {
            proxy_pass <http://tomcat>;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # Additional server blocks or configurations can be added here if needed.
    }
}

상위 샷에서 upsteam부분은 Nginx의 reverse proxy설정을 하는 부분임. Nginx는 웹서버의 기능 중 보안 및 벡엔드에게 포워딩하는 기능도 가지고 있음.

docker restart ws_nginx

was 와 db 연동

jdbc 다운로드

 

tomcat 의 lib에 jdbc -connector 추가

wget <https://downloads.mariadb.com/Connectors/java/connector-java-3.1.0>
/mariadb-java-client-3.1.0.jar
docker restart was_tomcat 

was_tomcat 들어가기

sudo docker exec -it was_tomcat /bin/bash

webapps root로 이동

cd /usr/local/tomcat/webapps/ROOT
 nano dbconnection.jsp
<%@ page import="java.sql.*" %>

<%
    String url = "jdbc:mariadb://172.16.210.43:3306/homework";
    String username = "root";
    String password = "1234qwer!";
    String driver = "org.mariadb.jdbc.Driver";

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    try {
        Class.forName(driver);
        conn = DriverManager.getConnection(url, username, password);

        stmt = conn.createStatement();
        String sql = "SELECT * FROM user";  // Replace with your actual table name
        rs = stmt.executeQuery(sql);
    } catch (Exception e) {
        e.printStackTrace();
    }
%>

<!DOCTYPE html>
<html>
<head>
    <title>MariaDB Data</title>
</head>
<body>

<h1>MariaDB Data Connection Success!</h1>

<%
    while (rs.next()) {
%>
<h2>Name: <%= rs.getString("name") %></h2>
<h2>Age: <%= rs.getInt("age") %></h2>
<%
    }
%>

<%
    // 리소스 해제
    try {
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
%>

</body>
</html>
 

 

'개발' 카테고리의 다른 글

QueryDSL  (0) 2024.02.28
JPA 단점과 JPQL  (0) 2024.02.28
JPA 와 Hibernate  (0) 2024.02.28
docker 기반 nginx 를 이용한 로드 밸런싱  (1) 2024.01.24