๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Server/Docker

[Docker] Docker ๋กœ MySQL ๊ณผ Tomcat ์‚ฌ์šฉ (with docker-compose & VSCode)

by soy๋ฏธ๋‹ˆ 2021. 10. 2.

 

 

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ €๋ฒˆ์— ๋งŒ๋“  JAVA-Tomcat-MySQL ํˆฌํ‘œ ํ”„๋กœ๊ทธ๋žจ์„ .war๋กœ ๊ฐ€์ ธ์™€์„œ Docker์—์„œ ์‹คํ–‰ํ•ด๋ณด๋Š” ์‹ค์Šต ๊ณผ์ •์„ ์ ์–ด๋ณด์•˜๋‹ค. VSCode ์—์„œ Dockerfile ์„ ์ž‘์„ฑํ•  ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— docker-compose.yml ํŒŒ์ผ๊ณผ mysql, tomcat ํ™˜๊ฒฝ์„ค์ •์„ ํ•ด์ฃผ๋Š” ํŒŒ์ผ์„ ๊ฐ๊ฐ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ ํ”„๋กœ์ ํŠธ ์œ„์—์„œ ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์„œ docker-compose up -d ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ mysql ์ปจํ…Œ์ด๋„ˆ์™€ tomcat ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ๊ฐ ์‹คํ–‰์ด ๋œ๋‹ค.

 

 

 

 

1. Docker Image Pull & Container Run

 

# ๋„์ปค ํ—ˆ๋ธŒ์—์„œ tomcat ์ด๋ฏธ์ง€ ์ฐพ๊ธฐ
docker search tomcat
# ๋„์ปค ํ—ˆ๋ธŒ์—์„œ mysql ์ด๋ฏธ์ง€ ์ฐพ๊ธฐ
docker search mysql
# tomcat ์ด๋ฏธ์ง€ pull
docker image pull tomcat:9
# mysql ์ด๋ฏธ์ง€ pull
docker image pull mysql
# pull ๋ฐ›์€ tomcat ์ด๋ฏธ์ง€๋ฅผ container ๋กœ ์‹คํ–‰ (์ฒซ ์‹คํ–‰)
docker run -d --name="tomcat-test" -p 8080:8080 tomcat:9
# pull ๋ฐ›์€ tomcat ์ด๋ฏธ์ง€๋ฅผ container ๋กœ ์žฌ์‹คํ–‰
# docker restart tomcat-test
# pull ๋ฐ›์€ mysql ์ด๋ฏธ์ง€๋ฅผ container ๋กœ ์‹คํ–‰
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=mysql๋น„๋ฒˆ -d -p 3306:3306 mysql:latest
# pull ๋ฐ›์€ mysql ์ด๋ฏธ์ง€๋ฅผ container ๋กœ ์žฌ์‹คํ–‰
# docker restart mysql-container

 

 

 

 

๐Ÿ’ก mysql ์ด๋ฏธ์ง€ ๋ฐ›๊ณ  run ์‹คํ–‰ํ•  ๋•Œ 3306 port conflict ์—๋Ÿฌ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ,

์œˆ๋„์šฐ ๊ฒ€์ƒ‰์ฐฝ - "์„œ๋น„์Šค" ๊ฒ€์ƒ‰ - MySQL80 - ์ค‘์ง€ ํด๋ฆญ

 

 

 

 

 

2. war ํŒŒ์ผ tomcat/webapps/์— ๋„ฃ๊ธฐ

 

# ๋กœ์ปฌ ๊ฒฝ๋กœ์— ์žˆ๋Š” war ํŒŒ์ผ์„ docker ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌ
docker cp ./ROOT.war tomcat-test:/usr/local/tomcat/webapps/

 

 

๐Ÿ’ก war ํŒŒ์ผ์˜ ์›๋ณธ์ธ java ํŒŒ์ผ์—์„œ mysql ์—ฐ๋™๋ถ€๋ถ„์˜ ip ์ฃผ์†Œ๋ฅผ localhost ์—์„œ ipv4 ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ

 

static String url = "jdbc:mysql://๋‚ดIpv4์ฃผ์†Œ:3306/db๋ช…";

 

 

 

 

3. docker tomcat ํด๋” ๋“ค์–ด๊ฐ€์„œ war ํŒŒ์ผ ํ™•์ธํ•˜๊ธฐ, docker mysql ์— ๋“ค์–ด๊ฐ€์„œ database ๋งŒ๋“ค๊ธฐ

 

# mysql ๋“ค์–ด๊ฐ€์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์„ฑ
docker exec -it mysql-container bash
mysql -u root -p

# tomcat ๋“ค์–ด๊ฐ€์„œ war ํŒŒ์ผ ํ™•์ธํ•˜๊ธฐ
docker exec -it tomcat-test /bin/bash

 

๐Ÿ’ก ํ†ฐ์บฃ ๋‚ด๋ถ€์— JDK ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ Java ๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ํ†ฐ์บฃ ํด๋”์— ์ ‘๊ทผํ•ด์„œ Java ๋ฒ„์ „์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. (Java ๋ฒ„์ „์ด war ํŒŒ์ผ์˜ Java ๋ฒ„์ „๊ณผ ๋‹ค๋ฅด๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฒ„์ „์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๋กœ์ปฌ Java ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ํ•˜๊ฑฐ๋‚˜ ํ†ฐ์บฃ ๋‚ด๋ถ€์˜ Java ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•ด์•ผ ํ•œ๋‹ค.)

 

 

 

 

 

4. ์„ค์ •ํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์ปจํ…Œ์ด๋„ˆ ์ €์žฅ

 

docker commit mysql-container mysql
docker commit tomcat-test tomcat

 

 

 

 

5. docker-compose ๋งŒ๋“ค๊ธฐ

 

๐Ÿ’ก ์ด๋ฒˆ์— ์ž‘์—…ํ•œ ๋„์ปค ์ด๋ฏธ์ง€ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์ด๋ ‡๋‹ค. ๋จผ์ € mysql:latest ์ด๋ฏธ์ง€์™€ tomcat:9 ์ด๋ฏธ์ง€๋ฅผ pull ๋ฐ›์•„์„œ ๊ฐ๊ฐ 3306 ํฌํŠธ์™€ 8080 ํฌํŠธ๋กœ test_mysql ๊ณผ test_tomcat ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‘ ๊ฐœ๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๊ณ  web ์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ ๋‹ค์Œ docker compose ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. docker compose ๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด๊ณ  ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ๊ฐ์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

docker compose ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

 

 

๐Ÿ’ก VSCode ์— ํ”„๋กœ์ ํŠธ ํด๋” ์ƒ์„ฑ

๐Ÿ’ก mysql ์„ ์œ„ํ•œ database ํด๋” ์ƒ์„ฑ - database/script ์— sql ์ฟผ๋ฆฌ๋ฌธ ํŒŒ์ผ ์ž‘์„ฑ

๐Ÿ’ก tomcat ์„ ์œ„ํ•œ tomcat ํด๋” ์ƒ์„ฑ - tomcat/webapp ์— .war ํŒŒ์ผ ์ถ”๊ฐ€

๐Ÿ’ก docker-compose.yml ์ž‘์„ฑ

 

version: "3.7"
services:
  webapp:
    build: tomcat
    ports:
      - 8080:8080
    environment:
      MYSQL_HOST: database
      MYSQL_USER: root
      MYSQL_PASSWORD: ๋น„๋ฒˆ
      MYSQL_DB: db๋ช…

  database:
    build: database
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: ๋น„๋ฒˆ
      MYSQL_DATABASE: db๋ช…

 

๐Ÿ’ก docker compose ์—์„œ๋Š” services ๊ฐ€ container ์™€ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๊ณ , services ํ•˜์œ„์— compose ๋กœ ์‹คํ–‰ํ•˜๋ ค๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค(์ด๋ฏธ์ง€)์„ ์ž‘์„ฑํ•œ๋‹ค.

๐Ÿ’ก tomcat ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์œผ๋กœ webapp์„, mysql ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์œผ๋กœ database ๋ผ๊ณ  ์ง€์ •ํ–ˆ๋‹ค.

๐Ÿ’ก build: tomcat ์ด๋ž€, tomcat ์ปจํ…Œ์ด๋„ˆ์ธ webapp ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด tomcat ํด๋”์˜ Dockerfile ์— tomcat ์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•  tomcat docker image ๋ฅผ ์ง€์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๐Ÿ’ก build: database ๋ž€, mysql ์ปจํ…Œ์ด๋„ˆ์ธ database ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด database ํด๋”์˜ Dockerfile ์— mysql ์˜ ํ™˜๊ฒฝ ์„ค์ •์„ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•  mysql docker image ๋ฅผ ์ง€์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๐Ÿ’ก docker-compose.yml ์—๋Š” ๋ฒ„์ „, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„์ด๋””, ๋น„๋ฒˆ, ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ช…, ํฌํŠธ ๋ฒˆํ˜ธ, ๋นŒ๋“œํ•  ์ด๋ฏธ์ง€ ๋“ฑ์— ๊ด€๋ จํ•œ ๊ฒƒ(๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ค์ •)์„ ์ž‘์„ฑํ•˜๊ณ , ๋นŒ๋“œํ•  tomcat ๊ณผ database ์˜ ํด๋” ํ•˜์œ„์— ์žˆ๋Š” Dockerfile ์—๋Š” ์‹ค์ œ docker terminal ์ƒ์—์„œ ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค(์ด๋ฏธ์ง€ pull, ํŒŒ์ผ ์ถ”๊ฐ€, sql ์ฟผ๋ฆฌ๋ฌธ ์ž‘์„ฑ, ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ ๋“ฑ) ์„ ์ž‘์„ฑํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

๐Ÿ’ก ports ๋กœ ๊ฐ๊ฐ ์‹คํ–‰ํ•  ํฌํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

 

 

tomcat ํด๋”์˜ Dockerfile

 

database ํด๋”์˜ Dockerfile

 

 

 

5. docker-compose ์‹คํ–‰

 

 

 

 

6. docker-compose ํ”„๋กœ์ ํŠธ ์ €์žฅ

docker-compose ํ”„๋กœ์ ํŠธ๋ฅผ build ํ•˜๋ฉด docker-compose ํด๋” (newtest ์ปจํ…Œ์ด๋„ˆ) ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” newtest_webapp ๊ณผ newtest_database ์˜ ์ด๋ฏธ์ง€๋งŒ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‘ ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง„ newtest ์˜ ์ด๋ฏธ์ง€๋Š” ๋งŒ๋“ค์–ด ์ง€์ง€ ์•Š๋Š”๋‹ค. docker image merge ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ผ๊ณ  ํ•ด์„œ dockerfile ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค ๋„ฃ๊ณ  ํ™˜๊ฒฝ์„ค์ • ํ•ด์ค€ ๋‹ค์Œ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒƒ๋„ merge ์˜ ๊ฐœ๋…์€ ์•„๋‹Œ ๋“ฏ ํ–ˆ๋‹ค. ์šฐ์„  ํ•˜๋ผ๋Š”๋Œ€๋กœ ๋”ฐ๋ผ ํ•ด๋ดค๋Š”๋ฐ ๋ญ”๊ฐ€ ์ž˜ ์•ˆ๋œ๋‹ค.

 

 

๊ธฐ์กด์— ๋”ฐ๋กœ ์„ค์ •ํ•ด ๋‘” tomcat ๊ณผ mysql ์„ ํ•˜๋‚˜์˜ dockerfile ์— ๋‹ค ์ž‘์„ฑํ•ด์„œ ์ด๋ฏธ์ง€ push ํ•˜๋Š” ๊ฒƒ ๊นŒ์ง€๋Š” ๋œ๋‹ค. docker hub ์— ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ์— docker compose ์ด๋ฏธ์ง€๋ฅผ push ํ•˜๊ณ  ์‹คํ–‰์„ ํ•ด๋ดค์œผ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค.

 

 

 

 

๋กœ๊ทธ๋ฅผ ๋ณด๋‹ˆ๊นŒ tomcat ์€ ๋‚˜์˜ค์ง€๋„ ์•Š๊ณ  mysql ๊ด€๋ จ ๋กœ๊ทธ๋งŒ ๋œฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  db01 ์„ ๋ชป์ฐพ๋Š” ๊ฑธ๋กœ ๋ด์„œ๋Š” mysql user ๊ณ„์ • ๋ฌธ์ œ๋„ ์žˆ๋Š” ๊ฑฐ ๊ฐ™๋‹ค. ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ์— ๋Œ€ํ•œ ๊ฑธ ๋” ์ฐพ์•„๋ณด๊ณ  ๋‹ค์‹œ ํ•ด๋ด์•ผ์ง€.. ์ผ๋‹จ docker ๊ฐ€์ด๋“œ ๋ฌธ์„œ์—๋„ ๋‚˜์˜ค๋“ฏ์ด docker-compose ํ”„๋กœ์ ํŠธ๋ฅผ github ์— ์˜ฌ๋ ค๋‘๊ณ  ํด๋ก  ๋ฐ›์•„์„œ ์“ฐ๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค. github ์— docker-compose ๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ๋‹ค. ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ์— docker-compose ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  push ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

 

๐Ÿ docker-compose ์‹ค์Šต ๊นƒํ—ˆ๋ธŒ : https://github.com/qwa310/DockerCompose

 

GitHub - qwa310/DockerCompose: Docker Compose ์‹ค์Šต

Docker Compose ์‹ค์Šต. Contribute to qwa310/DockerCompose development by creating an account on GitHub.

github.com

 

 

 

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

๋Œ“๊ธ€