连接到容器内的守护进程

连接到容器内的守护进程

我在 Linux 机器上运行了一个Ubuntudocker 容器。每次我尝试从本地机器向 docker 容器复制文件或从 docker 容器复制文件时,我都会遇到很大的困难。我必须将文件复制到主机,然后运行docker cp以传输它。

有什么方法可以访问 docker 容器直接地从我的基于 Windows 的本地机器?

由于容器仅具有本地到主机的 IP,我想到的一个选项是告诉主机将所有到其特定端口的 SSH 连接转发到容器。或者您可能有的任何其他解决方案。

答案1

容器的设计目标之一是隔离,因此访问容器内部文件的困难是部分可以预料到的。

至少有这三个选项。编辑:想到了第四个 :)

连接到容器内的守护进程

在容器内运行一个进程以便能够通过任何 SSH 客户端直接访问它似乎很诱人sshd。然而,这违背了每个容器运行“一个进程”/“一个服务”的想法(除非容器的全部目的是成为 ssh 守护进程)。对于直接在容器内运行的任何其他文件共享服务(如 ftpd 等),情况也是如此。

此选项是否可行取决于是否可以更改容器以包含守护进程以满足您的目的以及是否需要这样做。我认为,在寻求容器提供的隔离的环境中,在容器内使用额外的服务是适得其反的。但是,如果它更像是一个“开发环境”,那么在容器内运行额外的守护进程可能会有所帮助。由于容器提供的进程监督非常有限,因此在运行多个服务的情况下,请考虑在容器内使用合适的服务管理器(systemd 很重但可以完成所有工作,存在不太完整的替代方案 :))。

从容器中露出体积

因此,只要您有办法连接到 Linux 部分,Docker 就会提供一种集成机制,用于将 (Linux) 主机的路径映射到容器内。这是通过-v在创建容器时指定标志来完成的,如下所示:

docker run --rm -it -v /home/linux-fan/wd:/media/wd debian:10 /bin/bash

这里,我的本地目录/home/linux-fan/wd位于/media/wd容器内部。请注意,docker 不会执行任何特殊操作来使容器内部和外部的用户 ID 匹配(如果 ID 未正确对齐,可能会导致权限被拒绝错误)。

另外/可选地,为了避免通过 SSH 连接,将 Linux 主机的路径公开为使用 samba st 的 Windows 共享可能会很有趣,这样可以消除用于文件访问的所有 SSH。

其他卷存储选项

虽然我没有使用过它们,但 Docker 不仅允许提供目录作为卷,而且还提供了添加外部存储的选项(参见https://docs.docker.com/engine/extend/plugins_volume/)。此类存储可能再次可以从 Windows 端访问。

直接访问远程 docker daemon

Docker 本身是一种服务,可以暴露给外部网络。为此,您需要设置适当的 TLS 证书并启用对 Linux 主机上的 Docker 守护程序的网络访问。然后就可以运行 Windows Docker 客户端(通过 TLS 连接到 Linux Docker 守护程序)并直接从本地计算机发出合适的docker cp命令(以及所有其他docker命令)。

编辑 2:无需重新创建容器

对正在运行的容器执行某些操作无疑会减少很多选项。

如果没有公开端口可供监听,那么基于容器内 SSHD 的解决方案可能会很困难。如果是这种情况,可以使用链接到sshd正在运行的容器的附加容器并进行一些转发来解决这个问题,但这很不靠谱。

远程 Docker 访问不需要重新创建容器,但需要更改 Docker 配置,并因此需要重新启动(而不重新创建)所有正在运行的容器,因为需要重新启动 Docker 守护进程。

最后,如果以上这些都不可能,那么在现有容器内以新创建的进程运行的基于拉取的解决方案可能会更加不安全,但可以作为一种“最后的手段”。但是,我怀疑这是否比现有的ssh+工作流程更方便。如果您想优化现有解决方案:WinSCP 提供了一项功能,用于自动将更改的文件发送到 Linux(因此可以简化docker cp调用之前的部分)。docker cp

答案2

听起来很不错的应用程序docker 上下文

  • 创建上下文:docker context create myserver --docker "host=ssh://myserver.com"
  • 照常复制文件docker --context myserver cp /local/path/file.txt containername:/path/in/container/

反过来,也可以将文件从远程 docker 容器传输到本地文件系统。最好为远程服务器定义基于密钥的访问权限。

另一个解决方案是创建一个卷,临时启动一个 docker 容器,将该卷导出到外部世界(ftp、smb、nfs,随便你怎么说)。完成后,您可以将该卷安装到目标容器并访问文件。

相关内容