Docker 如何使用ssh在本地连接到VSCode容器?

Docker 如何使用ssh在本地连接到VSCode容器?,docker,visual-studio-code,ssh,dockerfile,vscode-remote,Docker,Visual Studio Code,Ssh,Dockerfile,Vscode Remote,使用,我希望能够ssh从容器内部到容器内部(出于测试目的) sshroot@localhost 我读过很多文章和类似的问题,但我无法创建一个最小的函数示例 我的Dockerfile如下所示: FROM ubuntu:18.04 RUN apt-get update && apt-get install -y --no-install-recommends net-tools iputils-ping openssh-client openssh-server RUN m

使用,我希望能够
ssh
从容器内部到容器内部(出于测试目的)

sshroot@localhost
我读过很多文章和类似的问题,但我无法创建一个最小的函数示例

我的
Dockerfile
如下所示:

FROM ubuntu:18.04

RUN apt-get update && apt-get install -y --no-install-recommends net-tools iputils-ping openssh-client openssh-server 


RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
我的
devcontainer.json
如下所示:

FROM ubuntu:18.04

RUN apt-get update && apt-get install -y --no-install-recommends net-tools iputils-ping openssh-client openssh-server 


RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
{
“名称”:“Ubuntu”,
“构建”:{
“dockerfile”:“dockerfile”,
},
“设置”:{
“terminal.integrated.shell.linux”:“/bin/bash”
},
“扩展”:[],
“转发端口”:[
22
],
“应用端口”:22,
“runArgs”:[
“--net”,
“主持人”,
“-p”,
"22:22"
]
}
我测试了多种参数组合(
forwardport
appPort
EXPOSE
,等等),但每次:

  • ssh
    连接被拒绝
  • 我连接到主机而不是容器

您知道如何修改这些文件以便能够从容器的bash解释器连接到ssh吗?

有几个问题需要解决:

  • 由于您的主机正在使用端口22,您必须使用另一个端口。您可以使用
    appPort
    执行此操作:
  • “应用端口”:“2222:22”,
    
    此符号将主机的端口2222映射到容器的端口2222

  • runArgs
    forwardport
    是冗余的

  • 您需要添加
    “overrideCommand”:false
    以防止VSCode重写Dockerfile中声明的
    CMD


  • Dockerfile中的
    sed
    不正确,默认配置不包含一行
    permitrotlogin禁止密码
    ,但它包含
    #permitrotlogin感谢您的帮助,并感谢您使用更有价值的信息编辑了您的答案!我以这种方式使用了
    devcontainer
    ,作为对Docker的第一次介绍。我一定会仔细看看《docker compose》
    。我还注意到您删除了
    “runArgs”
    中的
    --net主机。实际上,如果存在,那么VSCode在构建容器时会报告一个错误:
    来自守护进程的错误响应:container xxx未运行
    。请简要解释一下这个参数的问题好吗?我可能不会比文档解释得更好:
    如果对容器使用主机网络模式,那么容器的网络堆栈不会与Docker主机隔离(容器共享主机的网络命名空间),并且容器没有分配自己的IP地址。例如,如果您运行一个绑定到端口80的容器,并且您使用主机网络,那么该容器的应用程序在主机IP地址的端口80上可用。
    因此您发生了冲突,因为您的主机使用端口22,而您的容器无法绑定它。好的,谢谢,现在一切都清楚了!
    FROM ubuntu:18.04
    
    RUN apt-get update && apt-get install -y --no-install-recommends net-tools iputils-ping openssh-client openssh-server 
    
    
    RUN mkdir /var/run/sshd
    RUN echo 'root:test' | chpasswd
    RUN sed -i 's/.*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
    
    # SSH login fix. Otherwise user is kicked off after login
    RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
    
    ENV NOTVISIBLE "in users profile"
    RUN echo "export VISIBLE=now" >> /etc/profile
    
    EXPOSE 22
    CMD ["/usr/sbin/sshd", "-D"]