진취적 삶
docker를 이용한 3tier 구축하기 nginx ,tomcat,db 본문
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
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg
- curl 명령어는 주어진 URL에서 데이터를 다운로드한다.
- 이 명령어는 Docker의 공식 GPG 키를 다운로드한다.
- 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 |