Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/Apache Airflow

[Airflow] docker-compose.yaml로 mariaDB 컨테이너를 올렸을 때 볼륨이 정상 작동 안하는 오류 해결

DH’s Blog 2024. 1. 18. 14:58
반응형

 

 

 

원래 컨테이너에 쓰인 데이터는 휘발성으로 컨테이너를 내리면 데이터도 함께 사라지게 된다. 하지만 DB(postgres, mariaDB) 같은 경우에는 컨테이너 재기동과 상관없이 데이터를 계속 저장할 수 있어야 하며, 이러한 기능을 지원하는 것 중에 하나가 볼륨(volume)이다. 즉 쉽게 말해서 컨테이너에 대해 볼륨을 지정해주면 도커를 재기동해도 데이터가 남아있어야 한다.

 

하지만 mariaDB 컨테이너에 볼륨을 설정해주었는데 도커 재기동시 테이블과 데이터가 모두 사라진다면?

볼륨이 재기능을 하지 못하는 상황으로 볼륨 마운트 위치를 잘못 설정한 것이 원인이다. 그럼 이 문제를 어떻게 해결할 수 있을지 알아보자.

 

 

(문제상황) 볼륨이 작동하지 않는 상황

mariaDB 컨테이너를 올린 후에 컨테이너, 볼륨 리스트도 모두 잘 확인되고 있다. (DBeaver에서 테이블 생성 후 데이터 적재까지 완료한 상황) 하지만 도커를 내리고 다시 올린 후에 DBeaver에서 테이블이 모두 사라지는 상황이 발생했다.

 

 

# 처음 문제가 된 docker-compose.yaml 내용

# docker-compose.yaml
services:
  mariadb:
    image: mariadb:10
    container_name: mariadb-container
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: passwd
      MYSQL_ROOT_PASSWORD: root_pw
      MYSQL_DATABASE: mariadb
      TZ: Asia/Seoul
    volumes:
      - mariadb-db-volume:/var/lib/mysql/data
    restart: always
    ports:
      - 3307:3306
    networks:
      network_custom:
        ipv4_address: 172.28.0.2
      
...

volumes:
  postgres-db-volume:
  mariadb-db-volume:

 

 

# 도커, 볼륨 리스트 모두 정상적으로 확인

# 도커 재기동
sudo docker compose down
sudo docker compose up -d

# 컨테이너 리스트 확인(mariadb-container 정상적으로 올라온것 확인)
sudo docker container ls

# 볼륨 리스트 확인(dhkim_mariadb-db-volume 확인...dhkim은 내가 접속한 유저명)
sudo docker volume ls

# 볼륨 세부정보 확인
# sudo docker volume inspect ${mariadb-volume명}
sudo docker volume inspect dhkim_mariadb-db-volume

container list
volume list and details

 

 

# 도커 재기동 후에 테이블이 삭제되었다고 에러 발생

(참고 - 도커 재기동) sudo docker compose down sudo docker compose up -d

 

 

 

 


(해결방법) 볼륨 마운트 위치 수정

문제를 확인해보니 mariaDB 컨테이너에 대한 default 볼륨 위치를 잘못 설정한게 원인이었다. 볼륨 위치가 잘못되어서 계속 yaml 파일의 다른 부분을 수정해도 재기동시 만들어놓은 테이블과 데이터가 모두 사라져버리는 것이었다.

 

그럼 default 볼륨 위치를 어떻게 확인할까?

 

# default 볼륨 위치 확인

먼저, mariadb container 내부의 bash shell을 이용할 수 있도록 접근하고 아래와 같이 mysql을 접속하여 저장위치를 확인하자.

# mariadb container 접근
# sudo docker exec -it ${container명} bash
sudo docker exec -it mariadb-container bash

# mysql 접속 (password : docker-compose.yaml 파일에서 지정한 MYSQL_ROOT_PASSWORD)
mysql -u root -p

# default 저장위치 확인
select @@datadir;

default volume location

 

 

# docker-compose.yaml에서 volumes 마운트 위치 수정

(수정전) /var/lib/mysql/data → (수정후) /var/lib/mysql

# docker-compose.yaml
services:
  mariadb:
    image: mariadb:10
    container_name: mariadb-container
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: passwd
      MYSQL_ROOT_PASSWORD: root_pw
      MYSQL_DATABASE: mariadb
      TZ: Asia/Seoul
    volumes:
      - mariadb-db-volume:/var/lib/mysql
    restart: always
    ports:
      - 3307:3306
    networks:
      network_custom:
        ipv4_address: 172.28.0.2
      
...

volumes:
  postgres-db-volume:
  mariadb-db-volume:

 

 

# 도커 다시 재기동

# 도커 재기동
sudo docker compose down
sudo docker compose up -d

 

 

# 볼륨 정상적으로 작동

도커 재기동후에도 만들었던 테이블과 데이터가 모두 남아있음을 확인했고, 볼륨이 정상적으로 작동하는 것을 확인할 수 있었다.

 

 

 

 


 

볼륨이 마운트되는 위치를 잘못 설정되게 되면, 컨테이너가 정상적으로 올라와도 볼륨 기능을 사용하지 못하게 된다. 처음에는 docker-compose.yaml 파일에 문제가 있으면 컨테이너 올라오는 과정에서 에러가 발생할 것이라 생각했다. 하지만 볼륨 마운트 위치를 잘못 설정하는 것과 이것은 전혀 상관없는 문제였던 것이다.

 

볼륨 자체를 지워보고,

볼륨 마운트 디렉터리 자체를 지워보고,

볼륨을 직접 생성하여 마운트 위치로 지정해주기도 하고,

정말 몇일 동안 수십번의 시도 끝에 문제를 해결할 수 있었다.

 

혹 나와 같은 문제를 마주했다면 볼륨 마운트 위치가 잘못된게 아닐지 먼저 확인해보길 바란다. 오늘도 이 내용이 많은 사람들에게 도움이 되었으면 좋겠다.

 

 

 

 

 

 

반응형