Docker로 GDAL 간편하게 사용하기
GDAL(Geospatial Data Abstraction Library)은 지리공간 데이터 처리를 위한 강력한 라이브러리입니다. 하지만 Windows 환경에서 직접 설치하면 복잡한 컴파일 과정과 의존성 문제로 어려움을 겪을 수 있습니다.
기존 설치 방법의 문제점:
- 복잡한 컴파일 과정과 의존성 관리
- Visual Studio 버전 호환성 문제
- 32bit/64bit 아키텍처 충돌
- DLL과 라이브러리 경로 설정의 어려움
Docker를 사용하면 이런 문제 없이 몇 분 만에 GDAL을 사용할 수 있습니다. 이 글에서는 Docker를 활용한 GDAL 사용법부터 실제 업무에서 활용할 수 있는 다양한 예제까지 다뤄보겠습니다.
TL;DR: Docker를 사용하면 복잡한 GDAL 설치 과정 없이
ghcr.io/osgeo/gdal:alpine-small
이미지로 간편하게 지리공간 데이터를 처리할 수 있습니다. 볼륨 마운트로 로컬 파일에 접근하고 다양한 GDAL 도구를 활용하세요.
Docker 사용의 장점:
- 간편한 설치: 컴파일 과정 불필요
- 일관된 환경: 운영체제 무관하게 동일한 실행 환경
- 빠른 배포: 사전 빌드된 이미지 즉시 사용
- 격리된 환경: 시스템에 영향 없는 독립 실행
Docker에서 GDAL 이미지 찾기
GitHub Container Registry에서 공식 GDAL 이미지를 제공합니다.
ghcr.io/osgeo/gdal
이미지를 선택하는 것이 좋습니다:
공식 이미지 선택 이유:
- 공식 지원: OSGeo에서 직접 관리하는 공식 이미지
- 높은 신뢰성: 활발한 업데이트와 커뮤니티 지원
- 다양한 버전: 여러 태그와 변형 버전 제공
적절한 GDAL 이미지 선택하기
Docker 이미지 선택 시 태그를 신중하게 고려해야 합니다.
이미지 유형별 특징
이미지 유형 | 크기 | 특징 | 권장 용도 |
---|---|---|---|
ubuntu-full | ~1.5GB | 모든 드라이버 포함 | 복잡한 데이터 처리 |
ubuntu-small | ~800MB | 주요 드라이버만 포함 | 일반적인 용도 |
alpine-normal | ~200MB | Alpine 기반, 대부분 드라이버 | 균형잡힌 선택 |
alpine-small | ~20MB | 최소 드라이버만 포함 | 경량화 우선 |
latest 이미지의 단점:
- 큰 용량: Ubuntu 기반으로 압축 상태에서도 936MB
- 실행 시 용량: 압축 해제 후 수 GB의 디스크 공간 사용
- 느린 다운로드: 네트워크 대역폭과 시간 소모
Alpine Linux 기반 이미지 권장
Ubuntu가 필요하지 않다면 Alpine Linux 기반 이미지를 사용하는 것이 효율적입니다.
Alpine 이미지의 장점:
- alpine-small: 약 20MB의 경량 크기
- 빠른 다운로드: Ubuntu 대비 95% 용량 절약
- 동일한 성능: GDAL 기능에 전혀 지장 없음
- 보안 최적화: Alpine Linux의 보안 특화 설계
버전 고정의 중요성
프로덕션 환경에서는 특정 버전을 명시하는 것이 좋습니다:
- API 안정성: GDAL 버전 업데이트 시 매개변수 변경 가능성
- 호환성 보장: 기존 스크립트와의 호환성 유지
- 재현성: 동일한 환경에서의 일관된 결과
예시: ghcr.io/osgeo/gdal:alpine-small-3.9.0
Docker GDAL 기본 사용법
Docker 실행 명령어 구조
docker run [실행 파라미터] [도커이미지명:태그명] [컨테이너 안에서 실행할 명령들]
주요 실행 파라미터:
- -it: 대화형 터미널 모드
- --rm: 컨테이너 종료 후 자동 삭제
- -v: 볼륨 마운트 (로컬 폴더와 컨테이너 폴더 연결)
- -w: 작업 디렉토리 설정
- -e: 환경 변수 설정
볼륨 마운트 설정
Docker 컨테이너는 독립된 Linux 환경에서 실행됩니다. 로컬 파일에 접근하려면 볼륨 마운트가 필요합니다.
파일 시스템 분리:
- 컨테이너: 독립된 Linux 파일 시스템
- 로컬: Windows 파일 시스템 (C:, D: 드라이브)
- 해결책: 볼륨 마운트로 두 공간 연결
# Windows
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 [명령어]
# macOS/Linux
docker run -it --rm -v /home/user/data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 [명령어]
실제 GDAL 도구 활용하기
1. gdalinfo - 파일 정보 확인
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalinfo /workspace/sample.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalinfo -stats -hist -checksum /workspace/sample.tif
2. gdal_translate - 파일 형식 변환
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_translate -of PNG /workspace/input.tif /workspace/output.png
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_translate -of GTiff -co COMPRESS=LZW -co TILED=YES \
/workspace/input.tif /workspace/compressed.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_translate -b 1 -b 2 -b 3 /workspace/multispectral.tif /workspace/rgb.tif
3. gdalwarp - 좌표계 변환 및 리프로젝션
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp -t_srs EPSG:4326 /workspace/input.tif /workspace/wgs84.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp -t_srs EPSG:3857 -r bilinear -tr 10 10 \
/workspace/input.tif /workspace/webmercator.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp /workspace/tile1.tif /workspace/tile2.tif /workspace/tile3.tif \
/workspace/mosaic.tif
4. gdalbuildvrt - 가상 래스터 생성
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalbuildvrt /workspace/mosaic.vrt /workspace/*.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalbuildvrt -resolution highest /workspace/high_res.vrt /workspace/*.tif
5. gdaldem - 지형 분석
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdaldem slope /workspace/dem.tif /workspace/slope.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdaldem hillshade -z 2 -s 1 /workspace/dem.tif /workspace/hillshade.tif
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_contour -a elevation -i 10 /workspace/dem.tif /workspace/contours.shp
6. gdal_calc.py - 래스터 계산
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_calc.py -A /workspace/multispectral.tif --A_band=4 \
-B /workspace/multispectral.tif --B_band=3 \
--outfile=/workspace/ndvi.tif --calc="(A-B)/(A+B)"
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_calc.py -A /workspace/input.tif -B /workspace/mask.tif \
--outfile=/workspace/masked.tif --calc="A*B"
벡터 데이터 처리 (OGR)
1. ogrinfo - 벡터 파일 정보 확인
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
ogrinfo /workspace/boundaries.shp
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
ogrinfo -al -so /workspace/boundaries.shp
2. ogr2ogr - 벡터 데이터 변환
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
ogr2ogr -f GeoJSON /workspace/output.geojson /workspace/input.shp
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
ogr2ogr -f GeoJSON -t_srs EPSG:4326 \
/workspace/wgs84.geojson /workspace/input.shp
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
ogr2ogr -f GeoJSON -where "POPULATION > 100000" \
/workspace/large_cities.geojson /workspace/cities.shp
실제 업무 시나리오
시나리오 1: 위성영상 전처리 파이프라인
docker run -it --rm -v c:\satellite:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalinfo /data/landsat8_raw.tif
docker run -it --rm -v c:\satellite:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp -t_srs EPSG:32652 -r cubic \
/data/landsat8_raw.tif /data/landsat8_utm.tif
docker run -it --rm -v c:\satellite:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_translate -b 4 -b 3 -b 2 -of GTiff -co COMPRESS=JPEG -co QUALITY=85 \
/data/landsat8_utm.tif /data/landsat8_rgb.tif
시나리오 2: DEM 데이터 분석
docker run -it --rm -v c:\dem:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalbuildvrt /data/merged_dem.vrt /data/dem_*.tif
docker run -it --rm -v c:\dem:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_translate -of GTiff -co COMPRESS=LZW \
/data/merged_dem.vrt /data/merged_dem.tif
docker run -it --rm -v c:\dem:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdaldem slope /data/merged_dem.tif /data/slope.tif
docker run -it --rm -v c:\dem:/data ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdaldem hillshade -z 2 /data/merged_dem.tif /data/hillshade.tif
시나리오 3: 배치 처리 스크립트
@echo off
set IMAGE_NAME=ghcr.io/osgeo/gdal:alpine-small-3.9.0
set DATA_DIR=c:\gis_data
echo 이미지 처리 시작...
for %%f in (%DATA_DIR%\*.tif) do (
echo 처리 중: %%f
docker run --rm -v %DATA_DIR%:/data %IMAGE_NAME% ^
gdal_translate -of GTiff -co COMPRESS=LZW "%%f" "/data/compressed_%%~nf.tif"
)
echo 처리 완료!
성능 최적화 팁
1. 메모리 설정
docker run -it --rm -v c:\data:/workspace \
-e GDAL_CACHEMAX=512 \
ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp -wm 1024 /workspace/large_file.tif /workspace/output.tif
2. 멀티스레딩 활용
docker run -it --rm -v c:\data:/workspace \
-e GDAL_NUM_THREADS=ALL_CPUS \
ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp -multi /workspace/input.tif /workspace/output.tif
3. 타일링 최적화
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdal_translate -of GTiff -co TILED=YES -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 \
/workspace/input.tif /workspace/tiled.tif
문제 해결 가이드
자주 발생하는 문제들
1. 권한 문제
문제: 컨테이너에서 생성된 파일에 접근할 수 없음
해결책: 사용자 ID 매핑 사용
docker run -it --rm -v c:\data:/workspace \
--user $(id -u):$(id -g) \
ghcr.io/osgeo/gdal:alpine-small-3.9.0 [명령어]
2. 메모리 부족
문제: 대용량 파일 처리 시 메모리 부족
해결책:
- Docker 메모리 제한 증가
- GDAL 캐시 크기 조정
- 타일 단위 처리
docker run -it --rm -m 4g -v c:\data:/workspace \
-e GDAL_CACHEMAX=1024 \
ghcr.io/osgeo/gdal:alpine-small-3.9.0 [명령어]
3. 좌표계 오류
문제: 좌표계 정보가 없거나 잘못됨
해결책: 명시적 좌표계 지정
docker run -it --rm -v c:\data:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalwarp -s_srs EPSG:4326 -t_srs EPSG:3857 \
/workspace/input.tif /workspace/output.tif
디버깅 팁
docker run -it --rm -v c:\data:/workspace \
-e CPL_DEBUG=ON \
ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalinfo /workspace/problematic.tif
docker run -it --rm ghcr.io/osgeo/gdal:alpine-small-3.9.0 \
gdalinfo --formats
고급 활용법
1. Docker Compose 활용
version:'3.8'
services:
gdal:
image: ghcr.io/osgeo/gdal:alpine-small-3.9.0
volumes:
- ./data:/workspace
working_dir: /workspace
environment:
- GDAL_CACHEMAX=512
- GDAL_NUM_THREADS=ALL_CPUS
command: tail -f /dev/null # 컨테이너 유지
docker-compose up -d
docker-compose exec gdal gdalinfo /workspace/sample.tif
docker-compose down
2. 별칭(Alias) 설정
alias dgdal='docker run -it --rm -v $(pwd):/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0'
alias dgdalinfo='dgdal gdalinfo'
alias dgdaltranslate='dgdal gdal_translate'
alias dgdalwarp='dgdal gdalwarp'
doskey dgdal=docker run -it --rm -v %cd%:/workspace ghcr.io/osgeo/gdal:alpine-small-3.9.0 $*
doskey dgdalinfo=dgdal gdalinfo $*
3. 사용자 정의 이미지 생성
FROM ghcr.io/osgeo/gdal:alpine-small-3.9.0
# 추가 패키지 설치
RUN apk add --no-cache python3 py3-pip
# Python 라이브러리 설치
RUN pip3 install numpy rasterio
# 작업 디렉토리 설정
WORKDIR /workspace
# 사용자 정의 스크립트 복사
COPY scripts/ /usr/local/bin/
# 실행 권한 부여
RUN chmod +x /usr/local/bin/*
결론
Docker GDAL 사용의 핵심 장점:
- 설치 간소화: 복잡한 컴파일 과정 생략
- 환경 독립성: 시스템 설정에 영향 없음
- 일관된 결과: 운영체제 무관하게 동일한 실행 환경
- 즉시 사용: 몇 분 만에 GDAL 활용 가능
- 확장성: 필요에 따라 사용자 정의 이미지 생성 가능
Docker를 활용하면 GDAL 설치의 복잡함을 해결하고 지리공간 데이터 처리에 집중할 수 있습니다. 이 글에서 소개한 다양한 예제와 팁들을 활용하여 효율적인 GIS 워크플로우를 구축해보세요.