클라우드 + DevOps/Docker

Docker 실습 :: MYSQL과 WORDPROCESS 연동해 관리 (docker compose)

gamjadori 2024. 1. 20. 10:30
728x90

<Docker 실습 :: MYSQL과 WORDPROCESS 연동해 관리>

  • docker compose: 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구
  • YAML 파일을 사용하여 컨테이너, 서비스, 네트워크 및 볼륨을 정의하며, 이를 통해 손쉽게 멀티컨테이너 애플리케이션을 관리

<실습>

ubuntu@host1:~/Labs/ch08$ mkdir myweb_data mydb_data
ubuntu@host1:~/Labs/ch08$ ls
mydb_data  myweb_data

 

1. 도커 볼륨 생성

  • mydb_data와 myweb_data 생성
ubuntu@host1:~/Labs/ch08$ docker volume create mydb_data
mydb_data
ubuntu@host1:~/Labs/ch08$ docker volume create myweb_data
myweb_data
ubuntu@host1:~/Labs/ch08$ docker volume ls
DRIVER    VOLUME NAME
local     3c6934ae8b00c0075ee164b4adf4db3efd685465b23936fbe61323800a1d100a
local     5037ad84f479fac50914cb017c195a48592bb122348b30fc498e17b700b93526
local     7218ff99f0ef01950ab25d481f4e099e049adf6c750e5c76cd9bf9b797ed465c
local     8144d9495439098a90a41e9e592acba434b5da7463d42ff6908c487ac3a99805
local     mydb_data
local     myweb_data

 

2. 도커 네트워크 생성 및 확인

  • 네트워크: my-webdb-net
ubuntu@host1:~/Labs/ch08$ docker network create my-webdb-net
ubuntu@host1:~/Labs/ch08$ docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
f757fbc75ea2   bridge         bridge    local
a10c647d79d1   host           host      local
**2be25d7803aa   my-webdb-net   bridge    local**
2785de26c8d7   none           null      local

 

3. 도커 컨테이너 생성 및 확인

  • MYSQL 컨테이너
docker run -itd \\
--name=mysql_app \\
-v mydb_data:/var/lib/mysql \\
--restart=always \\
-p 3306:3306 \\
--net=my-webdb-net \\
-e MYSQL_ROOT_PASSWORD=password# \\
-e MYSQL_DATABASE=wpdb \\
-e MYSQL_USER=wpuser \\
-e MYSQL_PASSWORD=wppassword \\
mysql:8.0-debian
  • WORDPRESS 컨테이너 생성
docker run -itd \\
--name=wordpress_app \\
-v myweb_data:/var/www/html \\
-v ${PWD}/myweb-log:/var/log \\
--restart=always \\
-p 8888:80 \\
--net=my-webdb-net \\
-e WORDPRESS_DB_HOST=mysql_app:3306 \\
-e WORDPRESS_DB_NAME=wpdb \\
-e WORDPRESS_DB_USER=wpuser \\
-e WORDPRESS_DB_PASSWORD=wppassword \\
--link mysql_app:mysql \\
wordpress:5.7

 

<컨테이너 생성 확인>

ubuntu@host1:~/Labs/ch08$ docker container ps
CONTAINER ID   IMAGE              COMMAND                   CREATED          STATUS          PORTS                                                  NAMES
0a545a17eba7   wordpress:5.7      "docker-entrypoint.s…"   12 seconds ago   Up 11 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp                  wordpress_app
4313bd4df776   mysql:8.0-debian   "docker-entrypoint.s…"   5 minutes ago    Up 5 minutes    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql_app

 

1. 워드프레스 생성 확인

2. MYSQL 생성 확인 및 데이터 확인

ubuntu@host1:~/Labs/ch08$ docker container exec -it mysql_app bash

 

<MYSQL 접속>

root@4313bd4df776:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 37
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

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.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| **wpdb**               |
+--------------------+
5 rows in set (0.00 sec)
>> **wpdb** 파일 확인
mysql> use wpdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------+
| Tables_in_wpdb        |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
12 rows in set (0.01 sec)

 

4. 로그 기록 확인

  • /Labs/ch08/myweb-log/apache2에 로그 기록 존재
ubuntu@host1:~/Labs/ch08$ ls
mydb_data  myweb-log  myweb_data  myweb_log
ubuntu@host1:~/Labs/ch08$ cd myweb-log/
ubuntu@host1:~/Labs/ch08/myweb-log$ ls
apache2
ubuntu@host1:~/Labs/ch08/myweb-log$ cd apache2/
ubuntu@host1:~/Labs/ch08/myweb-log/apache2$ ls
access.log  error.log  other_vhosts_access.log

 

<access.log 로그 확인>

ubuntu@host1:~/Labs/ch08/myweb-log/apache2$ cat access.log

<error.log 기록 확인>

ubuntu@host1:~/Labs/ch08/myweb-log/apache2$ cat error.log 
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
[Wed Jan 17 07:59:18.417410 2024] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.4.21 configured -- resuming normal operations
[Wed Jan 17 07:59:18.417470 2024] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
sh: 1: /usr/sbin/sendmail: not found
sh: 1: /usr/sbin/sendmail: not found

 

5. 구동 중인 컨테이너 종료 및 삭제

ubuntu@host1:~/Labs/ch08/myweb-log/apache2$ docker stop mysql_app wordpress_app
mysql_app
wordpress_app
ubuntu@host1:~/Labs/ch08$ docker container rm wordpress_app mysql_app
wordpress_app
mysql_app

>>  각 컨테이너가 잘 구동되는 것을 확인했음

 

<docker container compose 기능 이용>

1. docker-compose.yaml 파일 생성

ubuntu@host1:~/Labs/ch08$ mk docker-compose.yaml
docker-compose.yaml  mydb_data  myweb-log  myweb_data  myweb_log

<docker-compose.yaml 내용>

version: "3.9"
services:
  # 첫 번째 서비스 정의.
  mydb:
    # 도커 허브에서 제공하는 mysql:8.0 이미지 선택.
    image: mysql:8.0-debian
    # 서비스 컨테이너 이름 지정.
    container_name: mysql_app
    # 최상위 레벨에 정의 mydb_data 볼륨 지정.
    volumes:
      - mydb_data:/var/lib/mysql
    # 수동 제어를 제외한 컨테이너 종료 시 자동 재시작.
    restart: always
    # 호스트 운영체제와 컨테이너의 3306 포트를 바인드한다.
    # workbench 같은 클라이언트 도구와 연결하기 위해 필요하다.
    ports:
      - "3306:3306"
    # 최상위 레벨에 정의한 backend-net을 기본 네트워크로 지정한다.
    networks:
      - backend-net
    # 서비스가 사용할 환경 변수 지정한다.
    environment:
      MYSQL_ROOT_PASSWORD: password#
      MYSQL_DATABASE: wpdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword
  # 두 번째 서비스를 작성한다.
  myweb:
  # myweb 서비스가 실행되기 전에 mydb 서비스를 먼저 실행하는 의존성을 설정한다.
    depends_on:
      - mydb
    # wordpress:5.7 이미지 지정한다.
    image: wordpress:5.7
    # 서비스 컨테이너 이름을 지정한다.
    container_name: wordpress_app
    # 호스트 운영체제의 8888 포트와 컨테이너의 80 포트를 바인드한다.
    ports:
      - "8888:80"
    # backend-net으로 mydb 서비스와 동일 네트워크로 지정하고,
    # 외부 연결을 위한 네트워크를 위해 fronetend-net 지정을 가정한다.
    # docker network connect ~ 명령으로 두 번째 네트워크를 추가하는 것과 같다.
    networks:
      - backend-net
      - frontend-net
    # 컨테이너 데이터 지속성을 위해 도커 볼륨기법과 바인드 마운트 기법을 사용한다.
    volumes:
      - myweb_data:/var/www/html
      - ${PWD}/myweb-log:/var/log \\
    # 수동 제어를 제외한 컨테이너 종료 시 자동 재시작한다.
    restart: always
    # 서비스가 사용할 환경 변수를 지정한다.
    environment:
      WORDPRESS_DB_HOST: mydb:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
      WORDPRESS_DB_NAME: wpdb

# 도커 컴포즈 애플리케이션이 사용할 네트워크 생성. docker network create와 동일하다.
networks:
  frontend-net: {}
  backend-net: {}

# 도커 컴포즈 애플리케이션이 사용할 볼륨 생성. docker volume create와 동일하다.
volumes:
  mydb_data: {}
  myweb_data: {}

 

2. 두 개의 컨테이너 같이 구동 ( docker compose up )

ubuntu@host1:~/Labs/ch08$ docker compose up
ubuntu@host1:~/Labs/ch08$ ps
    PID TTY          TIME CMD
  56504 pts/5    00:00:00 bash
  58467 pts/5    00:00:00 ps

 

3. 컨테이너 내리기 ( docker compose down )

ubuntu@host1:~/Labs/ch08$ docker compose down
[+] Running 4/4
 ✔ Container wordpress_app    Removed                                                   0.0s 
 ✔ Container mysql_app        Removed                                                   0.0s 
 ✔ Network ch08_frontend-net  Removed                                                   0.6s 
 ✔ Network ch08_backend-net   Removed                                                   0.3s
version: "3.9"
services:
  # 첫 번째 서비스 정의.
  mydb:
    # 도커 허브에서 제공하는 mysql:8.0 이미지 선택.
    image: mysql:8.0-debian
    # 서비스 컨테이너 이름 지정.
    container_name: mysql_app
    # 최상위 레벨에 정의 mydb_data 볼륨 지정.
    volumes:
      - mydb_data:/var/lib/mysql
    # 수동 제어를 제외한 컨테이너 종료 시 자동 재시작.
    restart: always
    # 호스트 운영체제와 컨테이너의 3306 포트를 바인드한다.
    # workbench 같은 클라이언트 도구와 연결하기 위해 필요하다.
    ports:
      - "3306:3306"
    # 최상위 레벨에 정의한 backend-net을 기본 네트워크로 지정한다.
    networks:
      - backend-net
    # 서비스가 사용할 환경 변수 지정한다.
    environment:
      MYSQL_ROOT_PASSWORD: password#
      MYSQL_DATABASE: wpdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword
  # 두 번째 서비스를 작성한다.
  myweb:
  # myweb 서비스가 실행되기 전에 mydb 서비스를 먼저 실행하는 의존성을 설정한다.
    depends_on:
      - mydb
    # wordpress:5.7 이미지 지정한다.
    image: wordpress:5.7
    # 서비스 컨테이너 이름을 지정한다.
    container_name: wordpress_app
    # 호스트 운영체제의 8888 포트와 컨테이너의 80 포트를 바인드한다.
    ports:
      - "8888:80"
    # backend-net으로 mydb 서비스와 동일 네트워크로 지정하고,
    # 외부 연결을 위한 네트워크를 위해 fronetend-net 지정을 가정한다.
    # docker network connect ~ 명령으로 두 번째 네트워크를 추가하는 것과 같다.
    networks:
      - backend-net
      - frontend-net
    # 컨테이너 데이터 지속성을 위해 도커 볼륨기법과 바인드 마운트 기법을 사용한다.
    volumes:
      - myweb_data:/var/www/html
      - ${PWD}/myweb-log:/var/log \\
    # 수동 제어를 제외한 컨테이너 종료 시 자동 재시작한다.
    restart: always
    # 서비스가 사용할 환경 변수를 지정한다.
    environment:
      WORDPRESS_DB_HOST: mydb:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
      WORDPRESS_DB_NAME: wpdb

# 도커 컴포즈 애플리케이션이 사용할 네트워크 생성. docker network create와 동일하다.
networks:
  frontend-net: {}
  backend-net: {}

# 도커 컴포즈 애플리케이션이 사용할 볼륨 생성. docker volume create와 동일하다.
volumes:
  mydb_data: {}
  myweb_data: {}
  1. 두 개의 컨테이너 같이 구동
ubuntu@host1:~/Labs/ch08$ docker compose up

ubuntu@host1:~/Labs/ch08$ ps
    PID TTY          TIME CMD
  56504 pts/5    00:00:00 bash
  58467 pts/5    00:00:00 ps
  1. 컨테이너 내리기
ubuntu@host1:~/Labs/ch08$ docker compose down
[+] Running 4/4
 ✔ Container wordpress_app    Removed                                                   0.0s 
 ✔ Container mysql_app        Removed                                                   0.0s 
 ✔ Network ch08_frontend-net  Removed                                                   0.6s 
 ✔ Network ch08_backend-net   Removed                                                   0.3s