Docker镜像秘术:优雅实现SSH登录和NVM管理Node

引言

你是否厌倦了在不同项目间切换Node.js版本时的繁琐操作?是否对每次需要登录服务器、寻找Docker容器来查看文件的流程感到头疼?别担心,这篇文章将为你揭示Docker镜像的秘术,让你轻松管理多个Node版本,同时简化SSH登录和文件查看的流程。让我们一起打破常规,用Docker镜像的魔法让开发工作变得轻松又高效!

方式1:docker commit 构建

  1. 基于 ubuntu 创建一个新容器
docker run -it --name nvm1 ubuntu:20.04 
  1. 安装 openssh-server
apt-get update
apt-get install openssh-server -y
  1. 如果需要正常启动SSH服务,则目录/var/run/sshd必须存在。手动创建它,并启动SSH服务.
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
  1. 查看容器22端口的状态,可以看到 22 端口已经处于监听状态
# 如果 netstat 命令找不到需要安装,命令 apt-get install net-tools
netstat -tunlp
  1. 修改 /etc/ssh/sshd_config, 取消 pam 登陆限制。
# vim 若不存在使用 apt-get install vim 安装
vim /etc/ssh/sshd_config
# 修改 UsePAM no;增加 PermitRootLogin yes;
  1. 在容器中创建 .ssh 目录及 authorized_keys 文件
mkdir root/.ssh
touch authorized_keys
  1. 本地客户端创建密钥文件,并将公钥复制到容器的 authorized_keys 文件里。
ssh-keygen -t rsa -f sshserver
  1. 可以在容器里创建 run.sh 脚本用于启动 sshd 服务
vi /run.sh
chmod +x run.sh

# run.sh 脚本内容
# #!/bin/bash
# /usr/sbin/sshd -D
  1. nvm下载及安装
# curl 可以使用 apt-get install curl -y 安装,此处用的是 gitee 上的源文件
curl -o- https://gitee.com/mirrors/nvm/raw/v0.39.7/install.sh | bash
source ~/.bashrc
  1. 退出容器,创建新的镜像,可以通过 docker images 查看。
# nvm1 为容器名, 是镜像名, 0.1 tag
docker commit nvm1 nvm:0.1
  1. 创建新容器,测试ssh访问。
# 这里使用脚本启动的,也可以进入容器手动启动 sshd 服务
docker run -d -p 3022:22 --name test1  nvm:0.1 /run.sh
  1. 本地ssh访问,注意记得增加本地 .ssh/config 文件的配置
ssh 10.3.7.247 -p 3022

# config 配置
# Host 10.3.7.247
# User root
# HostName 10.3.7.247
# IdentityFile ~/.ssh/rsa
# Port 3022
# Protocol 2
# Compression yes
# ServerAliveInterval 60
# ServerAliveCountMax 20
LogLevel INFO

方式2:Dockerfile构建

本方式的所有文件都在github:docker-nvm上,有需要的替换下 rsa.pub 公钥就能创建自己的镜像。

  1. 创建 nvm-image 文件夹,里面包含三个文件:Dockerfile、rsa.pub、run.sh。

rsa.pub 是客户端创建的公钥文件,用于免密登陆,创建命令 ssh-keygen -t rsa -f rsa

Dockerfile

FROM ubuntu:20.04
# ubuntu 18.04 版本不满足 GLIBC 2.28版本要求,会导致 node 指标报错
LABEL version="0.1"
LABEL author="cumbermiao@163.com"
ENV NVM_NODEJS_ORG_MIRROR https://npmmirror.com/mirrors/node/

# 安装依赖 ssh 配置
RUN apt-get update && apt-get install -y openssh-server curl
RUN /usr/sbin/sshd -D &
RUN mkdir -p /var/run/sshd
RUN echo "UsePAM no" >> /etc/ssh/sshd_config && \
    echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && \
    echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN mkdir /root/.ssh
RUN touch /root/.ssh/authorized_keys
ADD rsa.pub /root/.ssh/
RUN cat /root/.ssh/rsa.pub >> /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
EXPOSE 22

# nvm 安装
RUN curl -o- https://gitee.com/mirrors/nvm/raw/v0.39.7/install.sh | bash
RUN bash -c "source ~/.bashrc" 

CMD [ "/run.sh" ]

run.sh 内容如下:

#!/bin/bash 
/usr/sbin/sshd -D
  1. 进入 nvm-image 文件夹,执行镜像构建命令 docker build -t nvm:0.1 .,构建好之后可以使用 nvm:0.1 镜像创建容器 docker run -d -p 3022:22 --name test1 nvm:0.1,客户端免密登陆命令 ssh 10.3.7.247 -p 3022

总结

现在,你已经掌握了如何利用Docker镜像来优雅地管理多个Node.js版本,以及如何通过SSH登录简化对Docker容器的操作。这些技巧将极大地提升你的工作效率,让你在面对多版本Node.js项目时游刃有余,此外还可以结合以下工具技巧进一步提升效率:

  1. 结合使用 vscode 的远程插件:remote-ssh、remote explorer 能够直接连接docker镜像里的工作区,再也不用本地再次搭建环境啦。
  2. 使用数据卷或数据卷容器,实现多个容器间文件共享。也可以用在数据迁移、备份等场景。

原文链接:https://juejin.cn/post/7344742642151161894 作者:cumber

(0)
上一篇 2024年3月11日 下午4:00
下一篇 2024年3月11日 下午4:11

相关推荐

发表回复

登录后才能评论