将文件从一个Docker容器复制到另一台主机上的另一个容器的最佳方法是什么?我们在尝试执行此操作时遇到了几个问题。
问题1:我们配置了一个覆盖网络并将容器连接到该网络。创建容器时,容器可以使用IP地址相互ping通,但不能使用使用-h标志提供的主机名
容器1:
set
容器2:
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
使用主机名执行ping操作失败
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
使用IP地址执行ping操作
root@ica-ord:/# ping rca-ord
ping: unknown host rca-ord
好像我们需要运行一些DNS服务器。怎么样?有什么细节吗?
问题2:我们尝试使用IP地址进行scp,并要求输入密码-可能是root密码,因为该密码是我们登录时使用的用户名。我们不知道root密码。
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
我们认为应该有一种简单的方法可以在多个主机上的容器之间复制文件。有吗?
答案 0 :(得分:1)
Docker并没有提供任何神奇的方法来简化这一过程。通常,Docker打包的组件不会通过共享文件相互通信。相反,他们使用诸如HTTP之类的网络协议或诸如RabbitMQ之类的消息总线系统相互通信。
此问题与将曾经在同一主机上运行的两个非Docker服务器进程分成两个主机并拆分到不同主机上并没有本质上的区别,不同之处在于Docker的文件系统隔离意味着仅将文件传输到另一个主机上不一定会使其他容器可以看到它。
我在此周围看到的典型架构如下:
您具有某种共享的面向网络的面向文件的存储层(NFS服务器,Amazon S3等)。两种服务都具有与之通信所需的设置。
生产服务将文件写入存储层。
生产服务与消费服务联系(通过HTTP连接;到共享的RabbitMQ队列;了解其他服务服务器的主机名,或者使用服务发现系统(例如Consul或Kubernetes Service对象)找到它)告诉它文件在哪里。
消费服务读取文件并对其进行处理。
此设置的优点是,您无需处理N个服务即可尝试将身份验证的scp设置为其他N个服务(甚至M个其他主机),而不必处理Docker卷的复杂性共享(以及并发访问和权限管理),即使服务移至其他主机并且没有立即拥有文件的本地副本,它仍然可以正常工作。