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吗?有几个问题需要解决:
appPort
执行此操作:“应用端口”:“2222:22”,
此符号将主机的端口2222映射到容器的端口2222
runArgs
和forwardport
是冗余的
“overrideCommand”:false
以防止VSCode重写Dockerfile中声明的CMD
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"]