Developers Haven

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

Welcome to DH's Blog

[기술공부]/Apache Airflow

[Airflow] docker-compose.yaml로 mariaDB 컨테이너 올리기 & DBeaver 연결하기

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

 

 

 

이번 시간에는 docker-compose.yaml 스크립트를 이용하여 mariaDB 컨테이너를 올리고 DBeaver 연결까지 하는 방법을 알아보도록 하자.

 

 

[1단계 - mariaDB 컨테이너 올리기]

1. 컨테이너가 사용하고 있는 default network 확인

컨테이너들 간의 통신을 위해서 고정 IP를 할당해주고자 하며, 고정 IP를 할당할 때는 컨테이너가 사용하고 있는 default network와 겹치지 않아야 한다.

 

컨테이너 상세 정보를 확인(sudo docker inspect ${container_ID} )하여 현재 default network가 172.18.0.6인 것을 확인했고, 새롭게 만들 고정 IP는 default와 겹치지 않게 해야한다.

# 컨테이너 리스트 확인 
sudo docker ps

# 컨테이너 상세 정보 
# sudo docker inspect ${container_ID}
sudo docker inspect 3eb58ef882b6

# ----------------------------------------------------------------------------------------------------------------- #
# 해당 컨테이너가 사용하고 있는 IP --> 172.18.0.6 / NetworkID --> 43d8d6396735
"Networks": {
                "dhkim_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "dhkim-airflow-worker-1",
                        "airflow-worker",
                        "3eb58ef882b6"
                    ],
                    "NetworkID": "43d8d63967356602fc933d1f0d6f635bed144b4fd62e58d7949c80e20a37d44f",
                    "EndpointID": "e448bb4ef823c841e3e45d15ae807a275f39793ce296c93d31abfdbd0b7b61a1",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.6",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:06",
                    "DriverOpts": null
# ----------------------------------------------------------------------------------------------------------------- #

 

 

※ (참고) 컨테이너 상세 정보에서 나온 "NetworkID": "43d8d6396735"는 무슨 네트워크일까?

아래 명령을 통해 해당 네트워크는 dhkim_default라는 것이 확인되었고, 이와 같이 별도의 설정이 없으면 처음에는 default network를 사용함을 볼 수 있다. (참고로, dhkim은 현재 내가 접속한 유저명이다)

# 현재 설치된 네트워크 리스트
sudo docker network ls

 

 

 

 

2. 컨테이너 고정 IP 할당하기

컨테이너를 올리게 되면 컨테이너는 기본적으로 유동IP를 가지게 되며, 컨테이너 생명주기에 따라 IP는 계속 변경되게 된다. 우리는 새롭게 올릴 mariaDB와 기존 컨테이너들간의 통신을 위해서 고정 IP를 만들어 할당해주기로 한다. (컨테이너들 간의 네트워크가 다르면 통신이 불가능하기 때문)

 

(1) 고정 IP로 사용할 network 정보를 docker-compose.yaml에 추가해주기

# docker-compose.yaml 파일에서 'networks' 부분 내용 수정
# 네트워크 명칭 --> 'network_custom' 
# driver: bridge --> 도커의 기본 네트워크 드라이버(통신이 필요한 컨테이너에서 어플리케이션을 실행할 때 사용)

networks:
  network_custom:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          gateway: 172.28.0.1

docker-compose.yaml에 network 정보 추가

 

 

(2) 기존 컨테이너들에게도 network 추가 할당해주기

위에서 지정한 고정 IP 정보를 기반으로 docker-compose.yaml 파일에서 각 서비스들에게 네트워크 정보를 추가해야하며, 아래는 내가 8개 서비스들에게 할당한 네트워크 정보이다.

├── services
     └── mariadb : 172.28.0.2 (참고로, 나의 경우 172.28.0.3을 다른 테스트용 컨테이너에서 쓰고 있어서 172.28.0.2로 지정하였음)
     └── postgres : 172.28.0.4
     └── redis: 172.28.0.5
     └── airflow-webserver: 172.28.0.6
     └── airflow-scheduler: 172.28.0.7
     └── airflow-worker: 172.28.0.8
     └── airflow-triggerer: 172.28.0.9
     └── airflow-init: 172.28.0.10

├── networks
     └── subnet : 172.28.0.0/16
     └── gateway : 172.28.0.1

 

 

아래는 서비스 중 하나인 redis에게 네트워크 정보를 추가한 예시이며, 모든 서비스들 하위에 아래와 같이 네트워크 정보를 추가해줘야 한다.

# docker-compose.yaml 파일의 모든 service 하위에 아래 내용 추가

# (수정전)
services: 
  redis:
    image: redis:latest
    expose:
      - 6379
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 30s
      retries: 50
      start_period: 30s
    restart: always
        
# (수정후)
services: 
  redis:
    image: redis:latest
    expose:
      - 6379
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 30s
      retries: 50
      start_period: 30s
    restart: always
    # --------------------------- 아래 내용 추가 --------------------------- #
    networks:
      network_custom:
        ipv4_address: 172.28.0.5

docker-compose.yaml에 services networks 정보 추가

 

 

 

 

3. mariaDB 컨테이너 정보 추가하기 (with docker-compose.yaml)

원래는 기본적으로 3306 포트를 이용하지만 나의 경우 로컬에서 설치한 mysql이 이미 3306 포트를 사용하고 있었다. 그래서 포트 충돌 방지를 위해 mariaDB는 3307 포트를 사용할 수 있도록 지정했다.

 

ports 3307:3306 → 로컬에서는 3307 포트로 접속하고, 실제 컨테이너 내부에서는 3306 포트를 사용함을 의미

 

참고로 여기서 지정한 유저, 패스워드 정보는 아래 DBeaver 연결시 사용되므로 기억해두자.

services:
  mariadb:
    image: mariadb:10
    container_name: mariadb-container
    environment:
      MYSQL_USER: ${user}
      MYSQL_PASSWORD: ${passwd}
      MYSQL_ROOT_PASSWORD: ${root_passwd}
      MYSQL_DATABASE: ${db_name}
      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:

docker-compose.yaml에 mariaDB 컨테이너 내용 추가

 

 

 

4. (이미 도커가 올라온 상황이므로) 도커 재기동

위에서 컨테이너명을 (mariadb-container)로 지정했고, 도커 재기동 후 해당 컨테이너가 정상적으로 올라왔음을 확인할 수 있다. 만약 도커를 올린 적이 없다면 바로 (sudo docker compose up -d) 컨테이너를 올려주면 된다.

sudo docker compose down
sudo docker compose up -d

# 컨테이너 리스트 확인
sudo docker ps

 

 

 

지금까지 docker-compose.yaml 파일을 이용하여 mariaDB 컨테이너 정보를 추가하고 올리는 과정까지 진행해봤다. 컨테이너 올리는 것까지 성공했으므로 이제 DBeaver로 mariaDB를 연결하는 과정을 진행해보자.

 

 

 

 


[2단계 - DBeaver로 mariaDB 연결하기]

1. DBeaver 상단 메뉴 [데이터베이스] > [새 데이터베이스 연결] > [MariaDB] 선택

 

 

 

2. Connection settings 내용 입력 > [확인]

[1단계 - mariaDB 컨테이너 올리기] 3번에서 추가한 mariaDB 컨테이너 정보의 내용을 참고해서 입력하면 된다.

1. Server
* Sever Host: localhost
* Database: ${MYSQL_DATABASE} → docker-compose.yaml 파일에서 mariadb environment 설정값

2. Port: 3307
* 나의 경우 포트 충돌 방지를 위해 3307 포트를 사용

3. Authentication (Database Native)
* Username: ${MYSQL_USER} → docker-compose.yaml 파일에서 mariadb environment 설정값
* Password: ${MYSQL_PASSWORD} → docker-compose.yaml 파일에서 mariadb environment 설정값

 

 

 

3. DBeaver mariaDB 연결 성공

아래 그림과 같이 mariaDB 데이터베이스가 생성되면 연결에 성공한 것이다.

 

 

 

mariaDB 컨테이너를 올리고 DBeaver 연결까지 성공적으로 완료할 수 있었다. docker-compose.yaml 스크립트 내용을 수정하여 컨테이너가 생성되는 것을 확인해볼 수 있었고 볼륨 설정까지 진행해보았다. 여기까지 모두 완료한 것이고 (선택사항) 추가로 DBeaver 테이블 생성 및 데이터 적재까지 진행해보기로 했다.

 

 

 

 

 


(선택사항) [3단계 - DBeaver 테이블 생성 및 데이터 적재해보기]

1. [mariadb] Database > 오른쪽 마우스 [SQL 편집기] > [새 SQL 편집기]

 

 

 

2. CREATE TABLE

아래 쿼리 실행 후 [Tables] > 오른쪽 마우스 [새로 고침]을 하면 테이블 생성된 것을 확인할 수 있다.

CREATE TABLE test_table (
	id INT PRIMARY KEY,
	name VARCHAR(50),
	age INT,
	etl_ymd VARCHAR(50)
)
COMMENT '테스트용 테이블'
;

 

 

 

3. INSERT DATA

아래 쿼리 실행 후 [Tables] > 오른쪽 마우스 [새로 고침]을 하면 데이터가 적재된 것을 확인할 수 있다.

INSERT INTO test_table (id, name, age, etl_ymd) VALUES (1, 'John', 25, 20240116);
INSERT INTO test_table (id, name, age, etl_ymd) VALUES (2, 'Alice', 30, 20240116);
INSERT INTO test_table (id, name, age, etl_ymd) VALUES (3, 'Bob', 28, 20240116);

 

 

 

 

 


 

지금까지 docker-compose.yaml을 이용하여 mariaDB 컨테이너를 올리고, DBeaver 연결하는 과정을 진행해보았다. 여러번의 시행착오를 겪으면서 성공적으로 컨테이너를 올려볼 수 있었고 볼륨의 역할에 대해서도 배울 수 있었다. 이 과정을 처음 해보는 사람들에게도 많은 도움이 되었으면 좋겠고, 이해를 돕기 위해 내용 중간에 부연설명을 조금씩 덧붙여놨다. 오늘도 이 내용이 많은 사람들에게 도움이 되었기를 바란다!

 

 

 

 

 

 

반응형