IT기술/도커 (docker)

Docker 컨테이너와 호스트 간 파일 복사 완벽 가이드: 효율적인 파일 관리 방법

후스파 2025. 7. 9. 20:24
반응형

현대의 애플리케이션과 시스템은 단순히 프로그래밍 언어만으로 구성되지 않습니다. 웹 서버, 데이터베이스, 그리고 다양한 파일들이 함께 운영되어야 원활한 시스템이 구축됩니다. 특히, 웹 서버의 리소스, 데이터베이스의 데이터 파일, 첨부 파일 등 다양한 파일들이 존재하는데, 이러한 파일들을 효과적으로 관리하기 위해서는 컨테이너와 호스트 간의 파일 복사가 필수적입니다. 이번 포스팅에서는 Docker를 이용한 컨테이너와 호스트 간의 파일 복사 방법에 대해 알아보겠습니다.


도커 파일 복사

Docker에서는 파일 복사를 양방향으로 지원합니다. 즉, 호스트에서 컨테이너로 파일을 복사하거나, 컨테이너에서 호스트로 파일을 복사할 수 있습니다. 이를 통해 개발자는 필요한 파일을 손쉽게 이동할 수 있으며, 다양한 작업을 효율적으로 수행할 수 있습니다.

파일 복사의 주요 활용 사례

  • 웹 서버 설정 파일 배포: 커스텀 설정 파일을 컨테이너에 적용
  • 애플리케이션 코드 업데이트: 개발 중인 코드를 컨테이너에 반영
  • 로그 파일 수집: 컨테이너에서 생성된 로그를 호스트로 백업
  • 데이터베이스 백업: 컨테이너 내 데이터를 호스트로 추출
  • 정적 리소스 관리: 이미지, CSS, JavaScript 파일 배포

파일 복사 커맨드

파일 복사를 위해 사용하는 기본 커맨드는 docker cp입니다. 이 커맨드는 다음과 같은 형식으로 사용됩니다:

기본 문법

호스트 → 컨테이너

docker cp 호스트경로 컨테이너이름:컨테이너경로

컨테이너 → 호스트

docker cp 컨테이너이름:컨테이너경로 호스트경로

이 명령어를 통해 손쉽게 파일을 이동할 수 있습니다.

고급 옵션

# 아카이브 모드로 복사 (권한 및 소유권 유지)
docker cp -a 호스트경로 컨테이너이름:컨테이너경로

# 심볼릭 링크 따라가기
docker cp -L 컨테이너이름:컨테이너경로 호스트경로

# 디렉토리 전체 복사
docker cp 호스트디렉토리/. 컨테이너이름:컨테이너디렉토리/

아파치 컨테이너 생성 및 실행

먼저, 아파치 웹 서버를 위한 Docker 컨테이너를 생성하고 실행해보겠습니다. 아래 명령어를 사용하여 아파치 웹 서버를 실행합니다:

docker run --name apa001 -d -p 8080:80 httpd

위 명령어를 실행하면, 만약 로컬에 httpd 이미지가 없다면 Docker가 자동으로 이미지를 다운로드합니다. 다운로드 과정은 다음과 같습니다:

Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
7ce705000c39: Pull complete 
1cfbb68d32bc: Pull complete 
4f4fb700ef54: Pull complete 
60e4ed7f50dd: Pull complete 
e219b11acd47: Pull complete 
8dffd7e864fd: Pull complete 
Digest: sha256:4c7788695c832bf415a662dfb5160f1895e65fc65c025e85f436ee2c9e7d7f3e
Status: Downloaded newer image for httpd:latest
34ecfcd553939d183e93dc61988be2344daa94f21ad160fdebb3f5526391bf34

이제 apa001이라는 이름의 아파치 웹 서버 컨테이너가 실행됩니다.

컨테이너 상태 확인

# 실행 중인 컨테이너 확인
docker ps

# 컨테이너 상세 정보 확인
docker inspect apa001

# 컨테이너 로그 확인
docker logs apa001

index.html 파일 생성 및 복사 (호스트 → 컨테이너)

웹 페이지의 내용을 담고 있는 index.html 파일을 생성하여 호스트에서 컨테이너로 복사해보겠습니다. 아래와 같은 내용을 담고 있는 HTML 파일을 작성합니다:




        Docker 파일 복사 테스트

            body {
                font-family: Arial, sans-serif;
                text-align: center;
                margin-top: 100px;
            }
            .container {
                background-color: #f0f0f0;
                padding: 20px;
                border-radius: 10px;
                display: inline-block;
            }




            안녕하세요!
            Docker 컨테이너에서 실행 중입니다.
            현재 시간: 



            function updateTime() {
                const now = new Date();
                document.getElementById('time').textContent = now.toLocaleString('ko-KR');
            }
            updateTime();
            setInterval(updateTime, 1000);


이제 아래 명령어를 사용하여 호스트에서 컨테이너로 파일을 복사합니다:

# macOS/Linux
docker cp /Users/test/Downloads/index.html apa001:/usr/local/apache2/htdocs/

# Windows
docker cp C:\Users\test\Downloads\index.html apa001:/usr/local/apache2/htdocs/

복사가 성공적으로 완료되면, 다음과 같은 메시지가 출력됩니다:

Successfully copied 2.05kB to apa001:/usr/local/apache2/htdocs/

이제 아파치 서버에서 index.html 파일을 확인할 수 있습니다. 브라우저에서 http://localhost:8080으로 접속하여 결과를 확인해보세요.


index.html 파일 복사 (컨테이너 → 호스트)

이제 컨테이너에서 호스트로 파일을 복사해보겠습니다. 아래 명령어를 사용하여 index.html 파일을 호스트로 복사합니다:

# macOS/Linux
docker cp apa001:/usr/local/apache2/htdocs/index.html /Users/test/Downloads/index2.html

# Windows
docker cp apa001:/usr/local/apache2/htdocs/index.html C:\Users\test\Downloads\index2.html

복사가 성공적으로 완료되면 다음과 같은 메시지가 출력됩니다:

Successfully copied 2.05kB to /Users/test/Downloads/index2.html

이제 호스트의 지정한 경로에 index2.html 파일이 생성됩니다.


실무 활용 예시

디렉토리 전체 복사

# 호스트의 웹 사이트 전체를 컨테이너로 복사
docker cp /path/to/website/. apa001:/usr/local/apache2/htdocs/

# 컨테이너의 로그 디렉토리를 호스트로 백업
docker cp apa001:/usr/local/apache2/logs/. /backup/apache-logs/

설정 파일 관리

# 커스텀 Apache 설정 파일 적용
docker cp /path/to/custom-httpd.conf apa001:/usr/local/apache2/conf/httpd.conf

# 컨테이너 재시작으로 설정 적용
docker restart apa001

데이터베이스 백업

# MySQL 컨테이너에서 데이터베이스 덤프 파일 추출
docker cp mysql_container:/backup/database_dump.sql /backup/

# PostgreSQL 데이터 디렉토리 백업
docker cp postgres_container:/var/lib/postgresql/data/. /backup/postgres-data/

애플리케이션 로그 수집

# Node.js 애플리케이션 로그 수집
docker cp node_app:/app/logs/. /monitoring/logs/

# 실시간 로그 모니터링을 위한 스크립트
#!/bin/bash
while true; do
    docker cp app_container:/var/log/app.log ./logs/app-$(date +%Y%m%d-%H%M%S).log
    sleep 3600  # 1시간마다 로그 수집
done

파일 복사 시 주의사항

권한 관리

# 파일 권한 확인
docker exec apa001 ls -la /usr/local/apache2/htdocs/

# 권한 변경
docker exec apa001 chmod 644 /usr/local/apache2/htdocs/index.html
docker exec apa001 chown www-data:www-data /usr/local/apache2/htdocs/index.html

경로 확인

# 컨테이너 내부 파일 시스템 탐색
docker exec -it apa001 /bin/bash

# 특정 경로 확인
docker exec apa001 ls -la /usr/local/apache2/htdocs/

대용량 파일 처리

# 압축 파일로 전송 후 컨테이너에서 압축 해제
tar -czf website.tar.gz /path/to/website/
docker cp website.tar.gz apa001:/tmp/
docker exec apa001 tar -xzf /tmp/website.tar.gz -C /usr/local/apache2/htdocs/
docker exec apa001 rm /tmp/website.tar.gz

결론

Docker를 사용하여 컨테이너와 호스트 간의 파일 복사는 매우 간단하고 효율적입니다. 위의 과정을 통해 웹 서버와 관련된 파일을 손쉽게 관리할 수 있으며, 다양한 개발 환경에서 유용하게 활용될 수 있습니다.
핵심 포인트:

  • docker cp 명령어를 통한 양방향 파일 복사
  • 디렉토리 전체 복사 및 권한 관리
  • 실시간 파일 동기화를 위한 스크립트 활용
  • 대용량 파일 처리를 위한 압축 활용
  • 보안 고려사항 및 권한 관리

Docker 파일 복사 기능을 마스터하면 컨테이너 기반 개발 환경에서 더욱 효율적으로 작업할 수 있으며, DevOps 워크플로우의 핵심 구성 요소로 활용할 수 있습니다.

반응형