使用openssh我们可以将Docker启动的容器当做一个小型的服务器来使用,这样我们登陆容器的时候就可以用ssh [email protected]
来登陆使用了
注意:使用openssh登录docker有两种方法,一种是秘钥登录,另一种是密码登录,不论是秘钥登录还是密码登录都需要安装openssh。这里对于秘钥登录我们给出dockerfile,对于密码登录我们手动安装,当然也可以根据需求是选择创建镜像时安装还是建好docker后在安装
首先免密登陆容器需要秘钥,这里我们将本机的ssh文件夹放在与Dockerfile相同的文件夹下
ssh文件夹一般在/home/root/.ssh
然后编写我们的Dockerfile,这里我们基于nvidia/cuda镜像来创建一个简单的镜像(邮箱和用户名改为自己的即可)下面的dockerfile意思是说将本地的ssh文件夹传到容器中,然后安装openssh-server,随后修改密钥登陆,禁止密码登录
FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
LABEL maintainer xxx"[email protected]"
RUN apt-get update
# openssh server
COPY .ssh/ /root/.ssh/
RUN apt-get install -y openssh-server && \
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && \
chmod 600 /root/.ssh/authorized_keys /root/.ssh/id_rsa.pub /root/.ssh/id_rsa && \
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config && \
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config
然后我们如果这样进入容器,远程连接时会出现如下错误,解决这个问题只需要在容器中运行service ssh restart
即可。
ssh: connect to host 192.168.9.148 port 2134: Connection refused
但是这样每次关闭容器后需要再次运行上述代码,很麻烦,因此我们写入一个脚本来每次登陆容器时自动运行上述命令,在Dockerfile中加入以下代码即可
# auto start openssh
RUN touch /root/startup_run.sh && \
echo '#!/bin/bash' | tee -a /root/startup_run.sh && \
echo '\nLOGTIME=$(date "+%Y-%m-%d %H:%M:%S")' | tee -a /root/startup_run.sh && \
echo 'echo "[$LOGTIME] startup run..." >>/root/startup_run.log' | tee -a /root/startup_run.sh && \
echo 'service ssh start >>/root/startup_run.log' | tee -a /root/startup_run.sh && \
chmod +x /root/startup_run.sh
RUN echo '\n# startup run' | tee -a /root/.bashrc && \
echo 'if [ -f /root/startup_run.sh ]; then' | tee -a /root/.bashrc && \
echo ' /root/startup_run.sh' | tee -a /root/.bashrc && \
echo 'fi' | tee -a /root/.bashrc
RUN /bin/bash -c "source ~/.bashrc"
首先根据Dockerfile创建一个镜像
docker build -t <image:tag> .
根据我们的镜像创建一个容器
docker run -it -p 3712:22 image:tag /bin/bash
此时容器已经打开了,然后我们在另一个终端或者在vscode中通过ssh远程连接即可
ssh root@ip -p 3712
这里我们创建一个普通容器不包含Openssh,并使用如下命令进入容器
docker run -it xx/xx:xx /bin/bash
此时容器内未安装openssh,因此我们首先要安装openssh
apt-get update
apt-get install -y openssh-server
apt-get install -y vim
稍后我们要进行密码登录,所以这里设置一下密码
root@ee767b7c05d6:/workspace# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
默认的,openssh不允许密码登录,这里我们设置一下
vim /etc/ssh/sshd_config
将其中的PasswordAuthentication
后面改为yes
然后重启openssh
service ssh restart
就可以按照秘钥登录所述ssh登录docker了,注意如果不修改PasswordAuthentication
的话登录后输入密码会被docker拒绝登录Permission denied, please try again.