使用 scp 在两个 docker 容器之间复制文件

Har*_*nda 6 ssh containers scp docker

我使用 alpine 映像创建了两个名为 server 和 client 的 docker 容器,并且我正在运行这两个容器。然后我在两个容器中都安装了apk add opensshapk add openrc。使用rc-service sshd start我已经启动了 ssh 服务。现在,我想使用scp.

从服务器容器我输入:

scp myfile.txt client@172.17.0.3:/location_of_the_folder
Run Code Online (Sandbox Code Playgroud)

它要求输入客户端容器的密码。我能做什么?docker 容器的默认密码是什么?

我尝试了 3 个选项,如下所示:

  1. 将相同的卷附加到两个容器。
  2. 使用docker cp从服务器容器到主机,然后主机到客户端容器。
  3. ssh-keygen在服务器容器中使用并将id_rsa.pub 密钥手动复制到客户端容器/root/.ssh目录,它可以工作。

我不想使用选项 1 和选项 2。我应该使用 shell 脚本对选项 3 做什么?我想自动化这件事。我可以手动完成,但我们可以使用 shell 脚本通过自动化来完成,将一些文本从一个容器复制到另一个容器吗?

4nd*_*t3s 9

如果它是本地 docker 容器,请使用docker cp ,如下所述:

docker cp {container_name}:{file_path} {target_file_path OR target_dir_ended_with_slash}

但如果您确实需要ssh(例如,当容器在远程主机中运行时),请尝试以下步骤:

1.确保使用来自主机的 ssh 端口 22 重定向来运行容器,例如docker run -p 8022:22 ...

然后在容器内:

2. 安装sshdsudo apt update && sudo apt install -y openssh-server

3.创建sshd目录:mkdir /var/run/sshd

4.为当前用户 添加密码(“root”用户默认没有密码):passwd

5.在sshd_config中设置PermitRootLogin yessudo sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

6.您可能还需要:sudo sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

7.并且:sudo sh -c 'echo "export VISIBLE=now" >> /etc/profile'

8. 重启sshd服务:sudo service ssh restart

然后您应该能够使用 SSH 连接,并使用 SCP 传输文件。

如果您收到“端口 22:连接被拒绝”,请尝试以下任一解决方法:

  • 使用特权访问运行容器:docker exec --privileged -ti container_name bash
  • 在容器内,使用 UFW 防火墙打开端口 22:sudo apt-get install -y ufw && sudo ufw allow 22