docker container cp 명령어를 사용하여 파일 복사하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker container cp 명령어를 효과적으로 사용하여 로컬 파일 시스템과 Docker 컨테이너 간에 파일을 복사하는 방법을 배우게 됩니다. 이 실습을 통해 로컬 머신에서 실행 중인 컨테이너로 파일을 복사하고, 컨테이너에서 로컬 시스템으로 파일을 가져오는 등 필수적인 시나리오를 다루게 됩니다. 또한 STDOUT 및 STDIN 을 통해 데이터를 전송하기 위한 스트리밍 기능 활용법도 익히게 됩니다.

실용적인 예제를 통해 컨테이너화된 애플리케이션의 데이터 흐름을 관리하는 데 능숙해질 것입니다. 개별 파일, 디렉터리를 복사하고 데이터를 스트리밍하는 방법까지 배우게 되므로, 다양한 개발 및 배포 작업에 필요한 유연성을 확보할 수 있습니다.

로컬 파일을 컨테이너로 복사

이 단계에서는 로컬 파일 시스템에서 실행 중인 Docker 컨테이너로 파일을 복사하는 방법을 배우게 됩니다. 이는 컨테이너가 시작된 후 구성 파일, 스크립트 또는 기타 데이터를 컨테이너에 추가해야 할 때 흔히 사용되는 작업입니다.

먼저, ~/project 디렉터리 내의 로컬 머신에 간단한 텍스트 파일을 생성해 보겠습니다.

echo "This is a test file." > ~/project/test_file.txt

이 명령어는 ~/project 디렉터리에 test_file.txt라는 파일을 생성하고 텍스트 "This is a test file."을 작성합니다.

다음으로, 파일을 복사할 실행 중인 컨테이너가 필요합니다. 이 목적으로 간단한 ubuntu 이미지를 사용하겠습니다. 이미지가 로컬에 없을 수 있으므로 먼저 이미지를 pull(가져오기) 합니다.

docker pull ubuntu:latest

이 명령어는 Docker Hub 에서 최신 버전의 ubuntu 이미지를 다운로드합니다.

이제 ubuntu 이미지를 기반으로 컨테이너를 실행해 보겠습니다. detached mode (-d) 로 실행하고 쉽게 식별할 수 있도록 이름을 (my_ubuntu_container) 지정합니다.

docker run -d --name my_ubuntu_container ubuntu:latest sleep infinity

이 명령어는 ubuntu:latest 이미지를 사용하여 my_ubuntu_container라는 새 컨테이너를 시작합니다. sleep infinity 명령어는 컨테이너를 무기한으로 실행 상태로 유지하며, 이는 데모 목적으로 유용합니다.

docker ps 명령어를 사용하여 컨테이너가 실행 중인지 확인할 수 있습니다.

docker ps

출력에 my_ubuntu_container가 나열되어야 합니다.

이제 docker cp 명령어를 사용하여 로컬 머신에서 실행 중인 컨테이너로 test_file.txt를 복사할 수 있습니다. 구문은 docker cp <local_path> <container_name>:<container_path>입니다.

docker cp ~/project/test_file.txt my_ubuntu_container:/tmp/

이 명령어는 ~/project/test_file.txt 파일을 my_ubuntu_container 내부의 /tmp/ 디렉터리로 복사합니다.

파일이 성공적으로 복사되었는지 확인하기 위해 docker exec를 사용하여 컨테이너 내에서 명령을 실행할 수 있습니다. 컨테이너의 /tmp/ 디렉터리에 있는 파일을 나열하기 위해 ls를 사용합니다.

docker exec my_ubuntu_container ls /tmp/

출력에 test_file.txt가 나열되어야 하며, 이는 파일이 성공적으로 복사되었음을 확인합니다.

마지막으로, 생성한 컨테이너를 정리해 보겠습니다.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

이 명령어는 각각 컨테이너를 중지하고 제거합니다.

컨테이너에서 로컬 파일 시스템으로 파일 복사

이 단계에서는 실행 중인 Docker 컨테이너에서 로컬 파일 시스템으로 파일을 복사하는 방법을 배우게 됩니다. 이는 컨테이너 내에서 생성되거나 수정된 로그, 구성 파일 또는 기타 데이터를 검색하는 데 유용합니다.

먼저, 작업할 실행 중인 컨테이너가 있는지 확인해 보겠습니다. 이전 단계에서 사용했던 my_ubuntu_container를 사용합니다. 실행 중이지 않다면 시작합니다.

docker start my_ubuntu_container

이 명령어는 my_ubuntu_container라는 컨테이너를 시작합니다.

이제 로컬 머신으로 복사할 컨테이너 내의 파일을 생성해 보겠습니다. docker exec를 사용하여 컨테이너 내에서 명령을 실행하여 /root/ 디렉터리에 container_file.txt라는 파일을 생성합니다.

docker exec my_ubuntu_container sh -c 'echo "This file is from the container." > /root/container_file.txt'

이 명령어는 my_ubuntu_container 내에서 셸 명령을 실행하여 지정된 내용으로 /root/container_file.txt 파일을 생성합니다.

파일이 컨테이너 내에서 생성되었는지 확인하기 위해 docker exec를 사용하여 컨테이너의 /root/ 디렉터리에 있는 파일을 나열할 수 있습니다.

docker exec my_ubuntu_container ls /root/

출력에 container_file.txt가 나열되어야 합니다.

이제 docker cp 명령어를 사용하여 container_file.txt를 컨테이너에서 로컬 머신으로 복사할 수 있습니다. 컨테이너에서 로컬로 복사하는 구문은 docker cp <container_name>:<container_path> <local_path>입니다. 이를 ~/project 디렉터리에 복사합니다.

docker cp my_ubuntu_container:/root/container_file.txt ~/project/

이 명령어는 /root/container_file.txt 파일을 my_ubuntu_container에서 로컬 ~/project/ 디렉터리로 복사합니다.

파일이 로컬 머신에 성공적으로 복사되었는지 확인하려면 ~/project 디렉터리의 파일을 나열합니다.

ls ~/project/

출력에 이전 단계에서 생성한 test_file.txt와 함께 container_file.txt가 나열되어야 합니다.

cat 명령어를 사용하여 복사된 파일의 내용을 볼 수도 있습니다.

cat ~/project/container_file.txt

출력은 "This file is from the container."여야 하며, 이는 내용이 올바르게 복사되었음을 확인합니다.

마지막으로, 컨테이너를 정리해 보겠습니다.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

컨테이너에서 STDOUT 으로 파일 스트리밍

이 단계에서는 실행 중인 Docker 컨테이너에서 로컬 머신의 표준 출력 (STDOUT) 으로 파일의 내용을 직접 스트리밍하는 방법을 배우게 됩니다. 이는 파일을 명시적으로 복사하지 않고 컨테이너 내의 파일 내용을 빠르게 보려는 경우에 유용합니다.

먼저, my_ubuntu_container가 실행 중인지 확인합니다. 그렇지 않은 경우 시작합니다.

docker start my_ubuntu_container

이제 STDOUT 으로 스트리밍할 컨테이너 내의 다른 파일을 생성해 보겠습니다. 컨테이너의 /var/log/ 디렉터리에 stream_test.log라는 파일을 생성합니다.

docker exec my_ubuntu_container sh -c 'echo "This is a log entry." > /var/log/stream_test.log'

이 명령어는 my_ubuntu_container 내에서 셸 명령을 실행하여 지정된 내용으로 /var/log/stream_test.log 파일을 생성합니다.

이 파일의 내용을 로컬 STDOUT 으로 스트리밍하려면 컨테이너 내에서 docker exec 명령어를 cat 명령어와 함께 사용할 수 있습니다.

docker exec my_ubuntu_container cat /var/log/stream_test.log

이 명령어는 my_ubuntu_container 내에서 cat /var/log/stream_test.log 명령어를 실행합니다. 컨테이너 내에서 이 명령의 출력은 로컬 터미널의 STDOUT 으로 스트리밍됩니다.

터미널에 "This is a log entry." 내용이 직접 출력되는 것을 볼 수 있습니다. 이는 전체 파일을 복사할 필요 없이 컨테이너 내의 파일 내용을 빠르게 볼 수 있는 방법을 보여줍니다.

마지막으로, 컨테이너를 정리해 보겠습니다.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

로컬 tar 아카이브를 STDIN 에서 컨테이너로 스트리밍

이 단계에서는 표준 입력 (STDIN) 을 사용하여 로컬 tar 아카이브를 실행 중인 Docker 컨테이너로 직접 스트리밍하는 방법을 배우게 됩니다. 이는 로컬 머신에 중간 파일을 생성하지 않고 여러 파일 또는 디렉터리를 컨테이너로 전송하는 효율적인 방법입니다.

먼저, 아카이브하고 스트리밍할 ~/project 디렉터리 내에 로컬 머신에 디렉터리와 몇 개의 파일을 생성해 보겠습니다.

mkdir ~/project/my_files
echo "File 1 content." > ~/project/my_files/file1.txt
echo "File 2 content." > ~/project/my_files/file2.txt

이렇게 하면 my_files 디렉터리와 그 안에 두 개의 텍스트 파일이 생성됩니다.

이제 my_ubuntu_container가 실행 중인지 확인합니다. 그렇지 않은 경우 시작합니다.

docker start my_ubuntu_container

tar 아카이브를 컨테이너로 스트리밍하기 위해 tar 명령어를 사용하여 my_files 디렉터리의 아카이브를 생성하고 해당 출력을 docker exec 명령어로 파이프 (|) 합니다. 컨테이너 내부에서는 tar 명령어를 다시 사용하여 아카이브를 추출합니다.

아카이브를 컨테이너 내부의 /opt/ 디렉터리로 스트리밍합니다.

tar -cvf - ~/project/my_files | docker exec -i my_ubuntu_container tar -xvf - -C /opt/

이 명령어를 자세히 살펴보겠습니다.

  • tar -cvf - ~/project/my_files: 이 명령어는 ~/project/my_files 디렉터리의 tar 아카이브 (-c) 를 상세하게 (-v) 생성합니다. -f - 옵션은 tar에게 아카이브를 표준 출력으로 쓰도록 지시합니다.
  • |: 이 기호는 tar 명령어의 표준 출력 (tar 아카이브) 을 다음 명령어의 표준 입력으로 파이프합니다.
  • docker exec -i my_ubuntu_container tar -xvf - -C /opt/: 이 명령어는 my_ubuntu_container 내에서 tar 명령어를 실행합니다. -i 플래그는 exec 명령어가 파이프된 데이터를 수신할 수 있도록 STDIN 을 열어두므로 중요합니다. tar -xvf - 명령어는 표준 입력 (-f -) 에서 상세하게 (-v) 추출 (-x) 합니다. -C /opt/ 옵션은 추출 전에 디렉터리를 /opt/로 변경하므로 아카이브의 내용이 컨테이너 내부의 /opt/my_files로 추출됩니다.

파일이 컨테이너 내에서 성공적으로 스트리밍되고 추출되었는지 확인하려면 docker exec를 사용하여 컨테이너 내의 /opt/my_files/ 디렉터리의 내용을 나열합니다.

docker exec my_ubuntu_container ls /opt/my_files/

출력에 file1.txtfile2.txt가 나열되어야 하며, 이는 tar 아카이브가 올바르게 스트리밍되고 추출되었음을 확인합니다.

마지막으로, 컨테이너와 로컬 파일을 정리해 보겠습니다.

docker stop my_ubuntu_container
docker rm my_ubuntu_container
rm -rf ~/project/my_files

요약

이 랩에서는 docker container cp 명령어를 사용하여 로컬 파일 시스템과 실행 중인 Docker 컨테이너 간에 파일을 복사하는 방법을 배웠습니다. 컨테이너가 시작된 후 필요한 데이터 또는 구성을 추가하는 방법을 보여주면서 로컬 파일을 컨테이너로 복사하는 연습을 했습니다. 여기에는 로컬 파일 생성, 간단한 Ubuntu 컨테이너 풀링 및 실행, 그리고 docker cp를 사용하여 파일을 컨테이너의 /tmp 디렉터리로 전송하는 작업이 포함되었습니다.