Application Modernization/Container & PaaS

Docker로 Tomcat MySQL 실행

Cloud Applicaiton Architect 2021. 9. 14. 08:16
반응형

이 글은 네이버 블로그에 2018년 포스팅 했던 글을 리포스팅한 글입니다.

 

이번 포스트에서는 지난번에 설치한 Tomcat 컨테이너에 이어 MySQL 컨테이너를 추가해 Tomcat컨테이너와 MySQL컨테이너 사이의 연동을 테스트해 보도록 하겠습니다. 지난 포스팅인 ‘Docker for windows를 통한 Tomcat 실행’를 테스트를 하지 않은 분은 반드시 이전 실습을 완료 후 이번 포스팅을 보시기 바랍니다.

 

MySQL 연동을 위한 MySQL설치

  • docker search mysql (docker hub로부터 mysql image search)
C:\Users\FKL>docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 7824 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2579 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 590 [OK]
percona Percona Server is a fork of the MySQL relati… 415 [OK]
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 167 [OK]
hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 106
abbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 91 [OK]
centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
  • docker pull mysql (docker hub로부터 mysql image download)
C:\Users\FKL>docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6ae821421a7d: Extracting [=========================> ] 11.7MB/22.5MB
a9e976e3aa6d: Download complete
e3735e44a020: Download complete
bfd564e9483f: Download complete
df705f26e488: Download complete
0c5547f73d62: Download complete
f437382cf8a1: Download complete
b8e2d50f1513: Download complete
e2e3c9928180: Downloading [===> ] 5.889MB/95.64MB
b60db6d282cd:
1d32deab69c6: Waiting
408a40cd2e9c: Waiting

 

MySQL 컨테이너 실행

  • docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql mysql
C:\Users\FKL>docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql mysql
082ae5660fe1b99dbf49fad728d3deacfdd06a05725359a3d891f860a399c3cc
C:\Users\FKL>

 

※ -e 옵션은 도커 이미지가 생성될 때 생성자가 외부 파라미터를 입력 받기 위해 사용하는 환경변수 입니다. 일반적으로 도커 허브에 등록된 이미지에 대한 설명 페이지에서 어떤 환경변수가 있는지 확인 할 수 있습니다.

ex: 실습에 사용되는 mysql은 https://hub.docker.com/_/mysql 페이지에서 ‘Environment Variable’ 항목을 찾아 보면 사용 가능한 환경변수값이 확인 가능합니다.

 

테스트를 위한 MySQL 데이터베이스, 테이블, 데이터 생성

  • docker exec -ti mysql bash (mysql container 접속)
C:\Users\FKL>docker exec -ti mysql bash
root@f38932fdb3a1:/#
  • mysql –uroot –proot (MySQL 로그인)
root@f38932fdb3a1:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.15 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  • create database testdb; (테스트를 위한 DB 생성)
mysql> create database testdb;
Query OK, 1 row affected (0.03 sec)
  • 데이터베이스 변경 및 테이블 생성
mysql> use testdb;
Database changed
mysql> create table board (
-> no int primary key auto_increment,
-> title varchar(100) not null,
-> writer varchar(20),
-> contents varchar(5000),
-> wdate varchar(20));
Query OK, 0 rows affected (0.08 sec)
  • 테스트용 데이터 입력
mysql> insert into board(title,writer,contents,wdate) values('Test board','ROOT','This is a test content.',now());
Query OK, 1 row affected (0.03 sec)
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

  • 입력 데이터 확인
mysql> select * from board;
+----+------------+--------+-------------------------+---------------------+
| no | title | writer | contents | wdate |
+----+------------+--------+-------------------------+---------------------+
| 1 | Test board | ROOT | This is a test content. | 2019-02-19 01:49:48 |
+----+------------+--------+-------------------------+---------------------+
1 row in set (0.00 sec)
mysql>exit

 

MySQL jdbc driver(connector/j) download 및 설치

MySQL의 공식 페이지인 https://dev.mysql.com/downloads/connector/j/ 에서 Operating System을 ‘Platform Independent’ 타입으로 설정해 다운로드 받도록 합니다

 

connector/j 8.0이상을 다운로드 받아 C:\webapps\ROOT\WEB-INF\lib라는 폴더를 만들어 압축을 풀도록 합니다. ex: mysql-connector-java-8.0.15.jar

 

Docker 네트워크 환경 점검

  • 윈도우 커맨드창에서 ipconfig/all을 통해 HOST 컴퓨터의 모든 IP를 체크해 보도록 합니다.

 

  • Tomcat8-3 컨테이너 IP 체크
    • docker inspect tomcat8-3 (Networks을 찾아 IPAddress를 체크해 둡니다.)
C:\Users\FKL>docker inspect tomcat8-3
...
"NetworkSettings": {
...
"Ports": {
"8009/tcp": null,
"8080/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8083"
...
"Networks": {
...
"IPAddress": "172.17.0.3",
...
]
C:\Users\FKL>

  • MySQL 컨테이너 IP 체크
    • docker inspect tomcat8-3 (Networks을 찾아 IPAddress를 체크해 둡니다.)
C:\Users\FKL>docker inspect mysql
...
"Networks": {
...
"IPAddress": "172.17.0.2",
...
]
C:\Users\FKL>

 

지금까지 테스트한 네트워크 환경을 그림으로 표시하면 다음과 같습니다.

 

※개인 PC 환경에 따르 다르겠지만 제 PC의 환경으로 보면 tomcat containe에서 mysql containe를 접속하기 위한 ip는 172.17.0.2:3306이 됩니다. - 본인의 PC 환경은 상기 명령어를 입력해 직접 확인해 보기 바랍니다.

 

board 테이블의 데이터 조회 페이지(index.jsp)만들기

C:\webapps\ROOT\index.jsp를 다음과 같이 입력하도록 합니다.

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import = "java.sql.*" %>
<html>
  <body>
    <table border="1">
      <tr>
        <td>no</td>
        <td width="200">title</td>
        <td width="100">writer</td>
        <td width="100">wdate</td>
      <tr>
<%
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
  //MySQL 서버 내부 Container IP주소 , docker inspect mysql로 ip주소 확인 가능
  String url = "jdbc:mysql://172.17.0.2:3306/testdb";
  String id = "root";
  String pw = "root";

  Class.forName("com.mysql.cj.jdbc.Driver");
  conn=DriverManager.getConnection(url,id,pw);
  stmt = conn.createStatement();
  rs = stmt.executeQuery("select * from board order by no desc");
  while(rs.next()) {
    out.println("<tr>");
    out.println("<td>" + rs.getString("no") + "</td>");
    out.println("<td>" + rs.getString("title") + "</td>");
    out.println("<td>" + rs.getString("writer") + "</td>");
    out.println("<td>" + rs.getString("wdate") + "</td>");
    out.println("</tr>");
  }
}catch(Exception e){
  e.printStackTrace();
}finally {
  if (rs !=null){ try {rs.close();} catch(Exception e) {}}
  if (stmt !=null){ try { stmt.close(); } catch(Exception e) {}}
  if (conn !=null) { try { conn.close(); } catch(Exception e) {}}
}
%>
    </table>
  </body>
</html>

 

위 소스 코드의 url은 앞서 체크한 MySQL서버의 IP로 변경해 두기 바랍니다. 소스코드 타이핑이 어렵다면 여기를 클릭해 파일을 다운로드 받으시기 바랍니다.

 

Tomcat과 MySQL연동 확인

Host 컴퓨터의 웹 브라우저를 기동 시킨 후 localhost:8083으로 index.jsp 파일을 호출하면 다음과 같은 페이지 검색이 가능합니다.

 

 

호스트 컴퓨터의 커맨드 창에서 docker logs tomcat8-3을 통해 톰켓의 로그를 확인 해 볼 수 있습니다.

 

이번 포스팅은 여기까지 입니다.

감사합니다.

 

반응형

'Application Modernization > Container & PaaS' 카테고리의 다른 글

Docker Private Container Registry 만들기  (0) 2021.09.29
자주쓰는 Dockerfile 명령어  (0) 2021.09.14
Dockerfile 로 docker image 작성  (0) 2021.09.14
Docker로 Tomcat 실행  (2) 2021.09.14
Docker 개념  (0) 2021.09.07