Docker 컨테이너에서 호스트로 파일 복사

Isaac Tony 2023년1월30일
  1. docker cp를 사용하여 Docker 컨테이너에서 호스트로 파일 복사
  2. Docker 마운트를 사용하여 Docker 컨테이너에서 호스트로 파일 복사
  3. COPY를 사용하여 Docker 컨테이너에서 호스트로 파일 복사
Docker 컨테이너에서 호스트로 파일 복사

Docker 1.8 이전에는 컨테이너에서 호스트로만 파일을 복사할 수 있었습니다. 그러나 컨테이너가 더욱 대중화됨에 따라 컨테이너 간에 파일을 복사하는 것이 필요하게 되었습니다.

도커 컨테이너에서 파일을 복사하려는 일반적인 이유 중 하나는 팀 구성원과 로그 파일을 공유하는 것입니다. 그러나 /dev, /proc, /sys, tmpfs 아래의 리소스와 같은 민감한 정보를 복사하는 것은 허용되지 않습니다.

이 기사에서는 DockerFile, docker cp 명령을 사용하고 디렉토리를 호스트 시스템에 볼륨으로 마운트하여 Docker 컨테이너에서 파일을 복사하는 방법에 대해 설명합니다.

이를 위해서는 Docker와 Docker 컨테이너를 올바르게 설치하고 구성해야 합니다. 이것은 Linux 및 WSL 환경 모두에서 작동합니다.

docker cp를 사용하여 Docker 컨테이너에서 호스트로 파일 복사

docker cp 명령은 호스트 시스템에서 도커 컨테이너로 파일과 디렉토리를 복사하는 데 사용할 수 있는 가장 쉬운 방법 중 하나입니다. 우리는 Ubuntu 20.4.5와 당시 Docker의 최신 버전인 19.03을 사용할 것입니다.

통사론:

$ docker cp [OPTIONS] CONTAINER: SRC_PATH DEST_PATH|-

어디에:

  • SRC_PATH는 복사하려는 파일이 호스트에 있는 소스 경로를 지정합니다.
  • DEST_PATH는 컨테이너에 파일을 저장할 대상 경로입니다.

이 명령을 사용하여 SRC_PATHDEST_PATH 매개변수를 교환하여 컨테이너에서 파일을 복사할 수 있습니다. 이 명령의 한 가지 장점은 실행 중이거나 중지된 컨테이너 간에 파일과 디렉터리를 모두 복사할 수 있다는 것입니다.

docker cp 명령은 Unix cp -a와 유사합니다. 따라서 디렉토리도 재귀적으로 복사한다는 의미입니다. 또한 이 명령은 컨테이너에 대한 모든 경로가 루트 디렉터리를 기준으로 한다고 가정합니다.

먼저 대상 컨테이너를 만드는 것부터 시작하겠습니다. 따라서 이미지도 필요합니다. Docker 레지스트리에서 사용할 수 있는 공식 Ubuntu 이미지를 사용할 것입니다.

$ docker pull ubuntu

그런 다음 분리된 대화형 모드에서 도커 컨테이너를 만듭니다. 이렇게 하면 컨테이너가 백그라운드에서 실행될 수 있습니다.

$ docker run -it -d ubuntu
e10b4a7bbc59131d30492a87dd70b8ea74fa686ed5036ec918b6596fc83efe2b

exec 명령을 사용하여 docker exec 명령과 -it 플래그를 사용하여 대화형 SSH 세션을 실행합니다. 이렇게 하면 컨테이너 내에서 대화식으로 명령을 실행할 수 있습니다.

간단한 텍스트 파일을 생성하기 위해 /usr/share 폴더로 이동합니다.

먼저 해당 컨테이너 ID를 사용하여 컨테이너에 입력합니다.

$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/#

컨테이너 내의 /usr/share/ 폴더를 탐색하여 텍스트 파일을 생성합니다.

$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/# cd usr
root@e10b4a7bbc59:/usr# cd share
root@e10b4a7bbc59:/usr/share#

touch 명령을 사용하여 new_file.txt라는 파일을 생성합니다. 이 파일을 이 컨테이너에서 호스트로 곧 복사합니다.

따라서 호스트에 파일을 복사할 때 이 위치를 사용하므로 파일이 저장된 디렉토리를 기록해 두는 것이 좋습니다.

root@e10b4a7bbc59:/usr/share# touch new_file.txt

파일이 생성되었는지 확인하려면 아래와 같이 ls 명령을 실행하여 이 디렉토리의 모든 파일을 나열합니다.

root@e10b4a7bbc59:/usr/share# ls
adduser      bash-completion  debianutils  dpkg  keyrings  man           pam          polkit-1
apport       bug              dict         gcc   libc-bin  menu          pam-configs  sensible-utils
base-files   common-licenses  doc          gdb   lintian   misc          perl5        tabset
base-passwd  debconf          doc-base     info  locale    new_file.txt  pixmaps      terminfo

이제 컨테이너 내에서 파일을 성공적으로 생성했으므로 이 파일을 이 컨테이너에서 호스트로 복사하려고 합니다. exit 명령을 사용하여 컨테이너에서 메인 셸로 종료합니다.

터미널에서 docker cp 명령을 실행하고 new_file.txt를 호스트 시스템의 디렉토리에 복사합니다. 그러나 먼저 다음 세 가지 중요한 사항에 유의해야 합니다.

  • 컨테이너 ID
  • 컨테이너에서 대상 파일의 위치
  • 파일을 복사할 호스트 시스템의 대상 디렉토리.
$ docker cp e10b4a7bbc59:/usr/share/new_file.txt ./new_file.txt

해당 명령을 실행하여 new._file.txt를 호스트 시스템에 성공적으로 복사했습니다. 특정 폴더에서 ls 명령을 실행하여 이를 확인할 수 있습니다.

isaac@DESKTOP-HV44HT6:~/isaac$ ls
adduser      bash-completion  debianutils  dpkg  keyrings  man     `new_file.txt`  pixmaps         terminfo
apport       bug              dict         gcc   libc-bin  menu    pam           polkit-1
base-files   common-licenses  doc          gdb   lintian   misc    pam-configs   sensible-utils
base-passwd  debconf          doc-base     info  locale    my-app  perl5         tabset

Docker 마운트를 사용하여 Docker 컨테이너에서 호스트로 파일 복사

도커 마운트를 사용하여 도커 컨테이너에서 호스트로 파일을 복사할 수도 있습니다.

바인드 마운트는 호스트 시스템의 디렉토리에 도커 컨테이너를 마운트하여 데이터를 유지할 수 있게 해주는 가장 초기 솔루션 중 하나입니다.

바인드 마운트를 사용하면 대상 디렉토리의 절대 파일 경로를 참조하여 정확한 디렉토리를 참조할 수 있습니다. 컨테이너에서 호스트로 파일을 복사하는 것 외에도 호스트 시스템의 디렉토리에 의존하는 서비스를 생성할 수도 있습니다.

도커 마운트를 생성하려면 도커 컨테이너를 생성할 때 -v 또는 --mount 플래그를 사용할 수 있습니다. 이 플래그 외에도 도커 컨테이너의 디렉토리에 매핑하려는 호스트 시스템의 디렉토리도 지정합니다.

이 방법은 도커 컨테이너 내부에 여러 마운트를 생성할 수 있기 때문에 선호되는 경우가 많습니다. 또한 여러 컨테이너에서 파일을 전송하기 위한 디렉터리를 만들 수도 있습니다.

디렉토리를 도커 컨테이너에 마운트하려면 항상 콜론으로 구분된 올바른 순서로 있어야 하는 다음 필드를 지정해야 합니다. 여기에는 다음이 포함됩니다.

  • 마운트하려는 호스트 시스템의 디렉토리 경로.
  • 이 디렉토리를 마운트해야 하는 컨테이너의 디렉토리 경로.
  • ro와 같은 기타 옵션 옵션은 읽기 전용 모드를 지정합니다.

통사론:

docker run -t -i -v <host_dir>:<container_dir

아래 예에서는 Ruby 공식 이미지를 사용하여 컨테이너를 만들고 컨테이너의 디렉터리에 로컬 디렉터리를 마운트합니다. 이 작업이 완료되면 컨테이너에서 로컬 디렉터리로 또는 그 반대로 파일을 쉽게 복사할 수 있습니다.

$ docker run -it -v $HOME/Desktop/new_container:/new_container --name new_container ruby bash
root@7a00af9d4d96:/#

도커 컨테이너와 호스트 디렉토리 간에 파일을 쉽게 복사할 수 있습니다. 또한 호스트 디렉토리에서 생성된 파일은 호스트에 마운트된 도커 컨테이너 디렉토리에서 자동으로 사용할 수 있다는 점에 유의하십시오.

COPY를 사용하여 Docker 컨테이너에서 호스트로 파일 복사

도커 파일을 사용하여 도커 이미지를 생성할 때 COPY 명령을 사용하여 도커 호스트와 컨테이너 간에 파일을 복사할 수도 있습니다.

통사론:

COPY <SRC> <DEST>

아래 DockerFile에서 ./app.py를 소스 디렉토리로 지정하고 /var/www/app.py를 대상 디렉토리로 지정했습니다.

#  base image
FROM python

# Set your working directory
WORKDIR /var/www/

# Copy the necessary filesls
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt

# Install the necessary packages
RUN pip install -r /var/www/requirements.txt

# Run the app
ENTRYPOINT ["echo", "Hello, Developer"]

이 DockerFile은 콘솔에 메시지를 인쇄하는 간단한 Flask 애플리케이션의 이미지를 만듭니다.

작가: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

관련 문장 - Docker Container