호스트에서 Docker 컨테이너로 파일 복사
이 기사에서는 호스트 시스템에서 Docker의 실행 중인 컨테이너로 파일을 전송하는 데 사용할 수 있는 방법을 논의하고 시연합니다.
docker cp
를 사용하여 호스트에서 Docker 컨테이너로 파일 복사
docker cp
명령은 호스트 시스템에서 Docker 컨테이너로 파일과 디렉토리를 복사하는 데 사용할 수 있는 가장 쉬운 방법 중 하나입니다. 우리는 Ubuntu 20.4.5와 그 당시 최신 버전의 Docker(v 19.03)를 사용할 것입니다.
통사론:
docker cp {options} PATH_HOST CONTAINER:PATH_TO_CONTAINER
어디에:
PATH_HOST
는 복사하려는 파일이 호스트에서 있는 소스 경로를 지정합니다.PATH_TO_CONTAINER
는 컨테이너에 파일을 저장하려는 대상 경로입니다.
예시:
먼저 대상 컨테이너를 생성합니다. 이 기사에서는 공식 Nginx 이미지를 사용할 것입니다. 이 이미지는 아래 명령을 실행하여 Docker 데스크톱 또는 터미널을 통해 가져올 수 있습니다.
$ docker pull nginx
출력:
Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
다음 명령을 사용하여 레지스트리에서 이미지를 성공적으로 가져왔는지 확인합니다.
$ docker images
출력:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 2 weeks ago 142MB
이제 컨테이너를 만들 수 있습니다. run 명령을 사용하여 컨테이너를 만들고 외부 포트 8080 및 내부 포트 80에서 수신 대기하도록 분리 모드로 배포합니다.
아래 명령은 Nginx 기본 이미지를 사용하여 컨테이너를 생성합니다.
$ docker run -d -p 8080:80 nginx
docker ps -a
명령을 실행하여 새 컨테이너를 성공적으로 생성했는지 확인할 수 있습니다. 여기에는 최근 및 과거에 만든 모든 컨테이너가 컨테이너 ID 및 해당 이미지와 함께 나열됩니다.
여기에 표시된 대로 실행할 수 있습니다.
docker ps -a
출력:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c57de10362b nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp lucid_booth
docker cp
명령을 사용하기 전에 호스트에서 방금 만든 컨테이너로 복사할 파일을 만들어야 합니다.
new_file.txt
라는 파일을 만들고 ’touch’ 명령을 사용하여 홈 디렉토리에 저장합니다.
다음은 이를 수행하는 명령입니다.
$ touch new_file.txt
여기에 표시된 대로 ls
명령을 사용하여 파일을 성공적으로 생성했는지 확인하기 위해 디렉터리를 볼 수 있습니다.
isaac@DESKTOP-HV44HT6:~$ ls
new_file.txt
물론 new_file.txt
는 빈 파일입니다. 그러나 docker cp
명령을 사용하여 호스트에서 이전에 만든 컨테이너로 이동하는 데 집중하고 싶습니다.
그런 다음 이 파일을 생성한 컨테이너에 복사합니다.
$ docker cp new_file.txt 0c57de10362b:/usr/share
마찬가지로 new_file.txt
를 /usr/share
폴더 아래 ID 0c57de10362b인 컨테이너에 복사했습니다.
docker exec
명령과 -it
플래그를 사용하여 대화식 SSH 세션을 통해 실행 중인 컨테이너에 들어가 대화식으로 명령을 실행함으로써 이를 확인할 수 있습니다.
$ docker exec -it 0c57de10362b /bin/bash
이제 컨테이너에 로그인했으므로 이 파일을 이 컨테이너에 복사했는지 확인하기 위해 파일을 나열하려고 합니다. ls
명령을 다시 사용할 수 있지만 액세스하려는 폴더를 지정합니다.
root@0c57de10362b:/# ls -lh /usr/share/
출력:
마찬가지로, 아래와 같이 디렉토리에서 읽을 파일의 위치를 변경하기만 하면 많은 파일이 포함된 디렉토리를 복사할 수도 있습니다.
$ docker cp src/directory/. container-id:/target_location/directory
docker cp
명령은 사용하기 쉽지만 몇 가지 제한 사항이 있습니다. 그 구문은 Unix cp
명령과 다르며 제한된 수의 태그만 지원합니다.
또한 이것은 호스트에서 컨테이너로 파일을 복사하는 데만 사용할 수 있으며 컨테이너 간에는 복사할 수 없습니다.
docker volume
을 사용하여 호스트에서 Docker 컨테이너로 파일 복사
컨테이너 간에 파일을 복사하는 더 나은 방법은 docker volume
을 사용하는 것입니다.
-v
또는 -mount
플래그 중 하나를 사용하여 컨테이너 생성 프로세스 중에 컨테이너에 복사하려는 파일이 포함된 볼륨을 연결할 수 있습니다.
Docker에서 볼륨을 사용하려면 먼저 아래와 같이 docker volume
명령을 사용하여 볼륨을 만듭니다.
$ docker volume create volume_one
docker volume ls
를 사용하여 볼륨이 성공적으로 생성되었는지 확인할 수 있습니다. 이것은 현재 및 과거에 생성된 볼륨의 이름과 드라이버의 이름을 나열합니다.
isaac@DESKTOP-HV44HT6:~$ docker volume ls
DRIVER VOLUME NAME
local volume_one
볼륨을 생성했으므로 다음 단계는 run
명령을 사용하여 새 컨테이너를 만들고 -v
플래그를 사용하여 생성한 볼륨을 연결하는 것입니다.
-v
플래그를 사용하면 생성한 컨테이너에 새 볼륨을 연결할 수 있습니다. Nginx 기본 이미지의 최신 버전을 사용하여 이 컨테이너를 만들 것입니다.
$ docker run -d -v volume_one:/app nginx:latest
f2457d3eb8fe14645b9e3938017c02c46a657c9ad3323ff4c03924d2fddd7046
Docker inspect 명령을 사용하여 Docker 객체에 대한 하위 수준 정보를 반환할 수 있습니다. 볼륨이 생성한 컨테이너에 성공적으로 연결되었는지 조사할 것입니다.
이 컨테이너에 이름을 할당하지 않았으므로 컨테이너 ID를 사용하여 검사합니다. 이전 컨테이너 ID가 아닌 가장 최근의 컨테이너 ID를 사용합니다.
$ docker ps -a
출력:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2457d3eb8fe nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 80/tcp brave_kirch
0c57de10362b nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8080->80/tcp lucid_booth
이제 이 컨테이너 ID를 사용하여 컨테이너를 검사할 수 있습니다.
$ docker inspect f2457d3eb8fe
출력:
docker volume
명령의 장점 중 하나는 여러 컨테이너와 공유되는 단일 디렉토리를 생성한다는 것입니다.
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