도커 컨테이너로 파일을 복사하는 방법

Docker 호스트에서 파일을 Docker 컨테이너로 복사해야 하는 경우, 이 튜토리얼이 필요합니다.

이 튜토리얼에서는 다양한 방법을 사용하여 Docker 호스트에서 Docker 컨테이너로 파일을 복사하는 방법을 배우게 됩니다.

시작해 봅시다!

전제 조건

단계별로 따라하려면 다음 사항을 준비하세요:

  • 리눅스 호스트에 Docker가 설치되어 있어야 합니다. 이 튜토리얼은 Docker v19.03.11을 사용합니다. Docker 버전은 docker version 명령을 실행하여 확인할 수 있습니다.
  • 다운로드하고 사용 가능한 Docker 이미지가 있어야 합니다. 이 튜토리얼은 Docker Hub에서 최신 NGINX Docker 이미지를 사용합니다.

docker cp 명령을 사용하여 파일 복사하기

이 튜토리얼을 시작하기 위해 docker cp 명령을 사용하여 Docker 호스트에서 컨테이너로 파일을 복사하는 방법을 배우게 됩니다. docker cp 명령은 컨테이너와 Docker 호스트의 로컬 파일 시스템 간에 파일이나 폴더를 복사하는 역할을 합니다.

예제와 함께 Docker cp 명령어 사용 방법을 배워봅시다.

1. 로컬 머신에서 터미널을 엽니다.

2. touch 명령어를 사용하여 myfile.txt라는 파일을 생성합니다. myfile.txt는 도커 호스트에서 컨테이너로 복사될 것입니다.

touch myfile.txt

3. docker run 명령어를 실행합니다. 아래의 docker run은 새로운 컨테이너를 백그라운드에서 생성합니다. 아래 명령어에는 다음과 같이 세 가지 매개변수가 포함되어 있습니다:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx는 컨테이너를 실행하는 데 사용되는 이미지입니다.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. docker ps 명령어를 사용하여 Docker 컨테이너가 성공적으로 생성되었는지 확인합니다. docker ps 명령어를 실행한 후, NGINX 이미지를 사용하여 CONTAINER ID (아래 예시에서는 ccae4670f030) 아래에 새로운 값이 생성되는 것을 확인할 수 있습니다. 이는 컨테이너가 성공적으로 생성되었음을 나타냅니다.

sudo docker ps
Verifying the docker container by running the docker ps command

Docker cp 명령어를 실행하기 전에, Docker cp 명령어의 구문은 다음과 같습니다:

  • CONTAINER: SRC_PATH는 컨테이너의 소스 경로를 지정합니다.
  • DEST_PATH는 호스트의 대상 경로입니다.
  • CONTAINER: DEST_PATH는 컨테이너의 대상 경로입니다.

또한, 명령어에 다음과 같은 options를 추가할 수도 있습니다:

  • Using archive 또는 a – 모든 사용자 및 기본 그룹 권한을 파일 및 폴더로 복사합니다.
  • Using L – L 옵션을 지정하면 소스 경로의 모든 심볼릭 링크를 대상 경로로 복사할 수 있습니다.
# 컨테이너에서 도커 호스트로 복사하는 구문
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# 도커 호스트에서 컨테이너로 복사하는 구문
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. 그 다음에 docker cp 명령을 실행합니다. docker cp 명령은 앞서 생성한 myfile.txt를 컨테이너의 /usr/share 디렉토리로 복사합니다. ccae4670f030myfile.txt가 복사될 컨테이너의 ID입니다.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. 마지막으로 실행 중인 컨테이너에 SSH로 연결하려면 docker exec 명령을 사용하고 기본적으로 Linux 시스템의 사용자 로그인에 사용되는 /bin/bash와 함께 실행합니다.

  • i 플래그는 상호 작용적인 SSH 세션을 열고자 함을 나타냅니다. i 플래그는 컨테이너가 연결되지 않았더라도 SSH 세션을 닫지 않습니다.
  • t 플래그는 의사-TTY를 할당하며 이것은 명령을 상호 작용적으로 실행하는 데 사용되어야 합니다.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

docker exec를 실행할 때 이제 컨테이너의 셸에 연결된 것을 확인할 수 있습니다.

SSH into the running container using docker exec command

7. 컨테이너에 로그인한 후, myfile.txtls 명령을 사용하여 컨테이너로 복사되었는지 확인하십시오.

  • ls는 Unix 및 Unix 계열 운영 체제에서 컴퓨터 파일을 나열하는 명령입니다.
  • grepmy 문자열로 시작하는 모든 파일이나 폴더를 usr/share 디렉터리에서 찾습니다.
Verifying the files in the container

도커 파일을 사용하여 파일 복사

이전 섹션에서는 도커 cp 명령을 실행하여 파일을 컨테이너로 복사하는 방법을 배웠습니다. 그러나 여러 파일을 한 번에 복사해야 하는 경우 어떻게 할까요? 여러 명령을 실행하는 것은 번거로워집니다! 여러 cp 명령을 실행하는 문제를 해결하기 위해 도커 파일과 COPY 명령을 사용하여 파일이나 폴더를 컨테이너로 복사해 보는 것은 어떨까요?

도커 파일을 사용하여 컨테이너를 배포하고 파일/폴더를 복사하면 이전 섹션에서 수동으로 수행한 복사 단계를 제거할 수 있습니다. Dockerfile은 사용자가 이미지를 조립하는 데 명령을 호출할 수 있는 모든 명령을 포함하는 텍스트 문서입니다.

도커 파일을 만들고 그것으로부터 컨테이너를 실행하고 마지막으로 파일을 복사해 보겠습니다.

1. ~/host-to-container-copy-demo라는 폴더를 만들고, 작업 디렉토리를 해당 폴더로 변경하세요 (cd). 이 폴더에는이 데모에서 만들 파일이 모두 포함됩니다.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. 이제 myfile1.txt 및 myfile2.txt라는 두 개의 텍스트 파일을 만들고, 파일에 복사하여 이를 ~/host-to-container-copy-demo 디렉터리에 저장하세요.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. 다른 파일을 생성하고, 아래 설정을 복사/붙여넣기하여 ~/host-to-container-copy-demo 디렉토리 안에 Dockerfile로 파일을 저장하세요. 완료되면, Docker는 이 DockerFile을 사용하여 모든 필요한 명령을 실행하여 어떤 베이스 이미지 위에 새로운 Docker 이미지를 빌드합니다.

아래의 DockerFile은 새 컨테이너를 빌드할 다양한 단계/지시사항을 포함하고 있습니다:

  • FROM FROM 지시사항은 새로운 빌드 단계를 초기화하고 후속 지시사항에 대한 베이스 이미지를 설정합니다.
  • COPY COPY 명령은 호스트 기계(도커 호스트)에서 파일을 컨테이너로 복사합니다.
# 베이스 이미지(ubuntu) 위에 새 이미지를 생성하기 위한 Dockerfile 지시사항
# 베이스 이미지 ubuntu: latest 사용
FROM ubuntu:latest
# myfile1.txt를 컨테이너의 /usr/share 디렉토리로 복사
COPY myfile1.txt /usr/share
# myfile2.txt를 컨테이너의 /tmp 디렉토리로 복사
COPY myfile2.txt /tmp

4. 새 이미지를 빌드하기 위해 tree 명령을 실행하여 필요한 모든 파일을 확인하십시오. ~/host-to-container-copy-demo 디렉토리 아래에 Dockerfile, myfile1.txt 및 myfile2.txt가 표시되어야합니다.

Verifies files and folders using tree command

5. 다음으로, docker build 명령을 실행하여 이미지를 빌드하십시오. t 플래그는 이미지에 latest 태그와 함께 updated_ubuntu_image를 태깅하는 데 사용되며.은 도커가 현재 작업 디렉토리에서 모든 필요한 파일을 선택할 수 있게합니다.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. 이제, 새로 빌드된 이미지 updated_ubuntu_image를 확인하려면 docker images 명령을 실행하십시오. REPOSITORY 속성을 주목하십시오. 이 속성은 이전 단계에서 -t 플래그로 생성된 태그입니다.

sudo docker images
Repository Attribute

7. 마지막으로, 새로 빌드된 이미지를 사용하여 도커 컨테이너를 실행하려면 docker run 명령을 실행하십시오. -it 플래그는 도커에 가상 터미널을 할당하도록 지시하며pseudo-terminal을 컨테이너의 stdin에 연결합니다. bash는 Linux 시스템의 사용자 로그인을위한 기본 셸을 제공합니다.

sudo docker run -it updated_ubuntu_image bash

이제 Docker 컨테이너의 Bash 셸에있는 것을 확인할 수 있습니다.

Running the container using docker run command.

8. 다음으로, ls 명령을 실행하여 컨테이너의 /tmp/usr/share 디렉토리에 파일이 성공적으로 복사되었는지 확인하십시오.

Verifying the files if they are successfully copied on the container

저장 볼륨 마운트 및 Docker Volume 명령을 사용하여 파일에 액세스

지금까지 두 가지 다른 방법을 사용하여 호스트에서 컨테이너로 파일을 복사하는 방법을 배웠습니다. 하나는 docker cp 명령을 사용하는 것이고, 다른 하나는 DockerFile을 사용하는 것입니다. 이번에는 호스트와 컨테이너 간에 파일 시스템을 쉽게 공유하는 방법을 배워봅시다. docker volume 명령을 사용합니다.

터미널에 여전히 로그인되어 있는 것으로 가정합니다:

1. docker volume create 명령을 실행하여 Docker 호스트에 볼륨을 생성합니다. 아래 명령은 my-vol이라는 이름의 볼륨을 생성합니다. sudo docker volume create my-vol

sudo docker volume create my-vol

2. 생성된 볼륨을 확인하려면 docker volume ls 명령을 실행합니다. docker volume ls 명령은 볼륨을 나열합니다. docker volume ls 명령을 실행한 후 VOLUME NAME 속성에 my-vol이 나타나면 볼륨이 성공적으로 생성된 것입니다.

sudo docker volume ls
Listing the docker volumes

3. 이제 docker run 명령을 사용하여 컨테이너를 실행합니다.

  • volume_testing이라는 이름의 컨테이너는 nginx: latest 이미지를 사용합니다.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. 이전에 생성한 볼륨 my-vol이 docker inspect 명령어를 사용하여 컨테이너에 제대로 마운트되었는지 확인합니다. Docker inspect 명령어는 컨테이너의 정보를 제공합니다. docker inspect 명령어를 실행한 후, 지정된 컨테이너(volume_testing)의 모든 세부 정보, 마운트 세부 정보를 포함하여 아래와 같이 표시됩니다.

sudo docker inspect volume_testing

아래의 이미지 스냅샷은 호스트에 생성한 볼륨(my-vol)이 컨테이너의 /app 디렉토리에 성공적으로 마운트되었음을 확인합니다.

Verifying the volumes in the container

결론

이 튜토리얼에서는 Docker 호스트에서 컨테이너로 파일 또는 폴더를 복사하는 다양한 방법을 배웠습니다. Docker cp 명령어, Docker 볼륨 명령어, Dockerfile을 사용하는 방법 등이 있습니다.

다음으로 호스트에서 Docker 컨테이너로 데이터를 복사할 때 어떤 방법을 사용하시겠습니까?

Source:
https://adamtheautomator.com/docker-cp/