簡體   English   中英

如何將文件從一個 docker 容器復制到另一台主機上的另一個容器?

[英]How to copy files from one docker container to another on a different host?

將文件從一個 docker 容器復制到另一台主機上的另一個容器的最佳方法是什么? 我們在嘗試這樣做時遇到了幾個問題。

問題 #1:我們提供了一個覆蓋網絡並將容器連接到它。 容器可以使用 IP 地址相互 ping,但不能使用在創建容器時使用 -h 標志提供的主機名

容器 1:

root@rca-ord:/# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.29.10  rca-ord

容器 2:

root@ica-ord:/# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.0.29.11  ica-ord

使用主機名 ping 失敗

root@ica-ord:/# ping rca-ord
ping: unknown host rca-ord

使用 IP 地址進行 ping 工作

root@ica-ord:/# ping 10.0.29.10
PING 10.0.29.10 (10.0.29.10) 56(84) bytes of data.
64 bytes from 10.0.29.10: icmp_seq=1 ttl=64 time=0.684 ms
64 bytes from 10.0.29.10: icmp_seq=2 ttl=64 time=0.434 ms
64 bytes from 10.0.29.10: icmp_seq=3 ttl=64 time=0.731 ms
64 bytes from 10.0.29.10: icmp_seq=4 ttl=64 time=0.672 ms
64 bytes from 10.0.29.10: icmp_seq=5 ttl=64 time=0.545 ms
64 bytes from 10.0.29.10: icmp_seq=6 ttl=64 time=1.25 ms
^C
--- 10.0.29.10 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5010ms
rtt min/avg/max/mdev = 0.434/0.719/1.251/0.258 ms

看起來我們需要運行一些 DNS 服務器。 如何? 詳情是什么?

問題 2:我們嘗試使用 IP 地址 scp 並要求輸入密碼 - 可能是 root 密碼,因為這是我們登錄的用戶名。我們不知道 root 密碼。

root@ica-ord:/# scp 10.0.29.10:test-file.txt .
The authenticity of host '10.0.29.10 (10.0.29.10)' can't be established.
ECDSA key fingerprint is SHA256:Bdnjhvxlk1ILzWpa8tvu+YLaHRqh9XBftIoeLSpKLBQ.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.29.10' (ECDSA) to the list of known hosts.
root@10.0.29.10's password: 

我們認為應該有一種簡單的方法來在多個主機上的容器之間復制文件。 有沒有?

Docker 沒有提供任何神奇的東西來使這變得容易。 通常,Docker 打包的組件不會通過共享文件相互通信; 相反,它們使用網絡協議(如 HTTP)或使用消息總線系統(如 RabbitMQ)相互通信。

這個問題與將過去運行在同一主機上的兩個非 Docker 服務器進程並將它們拆分到不同的主機上沒有本質區別,只是 Docker 的文件系統隔離意味着只是將文件放到另一台主機上不會必須使它對另一個容器可見。

我在這方面看到的典型架構如下所示:

  1. 您有某種面向文件的共享網絡存儲層(NFS 服務器、Amazon S3 等)。 這兩個服務都具有與之通信所需的設置。

  2. 生產服務將文件寫入存儲層。

  3. 生產服務聯系消費服務(通過 HTTP 連接;到共享的 RabbitMQ 隊列;要么知道其他服務的服務器的主機名,要么使用諸如 Consul 或 Kubernetes Service 對象之類的服務發現系統來查找它)並告訴它文件在哪里.

  4. 消費服務讀取文件並處理它。

這種設置的優點是您不需要處理嘗試將經過身份驗證的 scp 設置為 N 個其他服務(甚至 M 個其他主機)的 N 個服務,您不必處理 Docker 卷共享的復雜性(和並發訪問和權限管理),即使服務移動到不同的主機並且沒有立即擁有文件的本地副本,它仍然可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM