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

引言

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

方式1:docker commit 构建

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

    ssh-keygen -t rsa -f sshserver

  2. 可以在容器里创建 run.sh 脚本用于启动 sshd 服务

shell 复制代码
vi /run.sh
chmod +x run.sh

# run.sh 脚本内容
# #!/bin/bash
# /usr/sbin/sshd -D
  1. nvm下载及安装
bash 复制代码
# 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 查看。
bash 复制代码
# nvm1 为容器名, 是镜像名, 0.1 tag
docker commit nvm1 nvm:0.1
  1. 创建新容器,测试ssh访问。
arduino 复制代码
# 这里使用脚本启动的,也可以进入容器手动启动 sshd 服务
docker run -d -p 3022:22 --name test1  nvm:0.1 /run.sh
  1. 本地ssh访问,注意记得增加本地 .ssh/config 文件的配置
shell 复制代码
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

bash 复制代码
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 内容如下:

bash 复制代码
#!/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. 使用数据卷或数据卷容器,实现多个容器间文件共享。也可以用在数据迁移、备份等场景。
相关推荐
江湖有缘12 分钟前
Docker环境下使用RustScan端口扫描工具教程
运维·docker·容器
70asunflower18 分钟前
镜像仓库(Image Registries)详解
linux·docker·容器
青树寒鸦26 分钟前
wsl的docker备份redis和迁移
redis·docker·容器
岩屿28 分钟前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
hopsky1 小时前
限制 Docker Desktop 的资源使用
运维·docker·容器
春日见1 小时前
docker崩溃,闪退,与vscode断开连接
vscode·docker·容器
Suchadar1 小时前
Docker搭建Web测试靶场
运维·docker·容器
fleaxin1 小时前
统信服务器操作系统V20(1070)安装过程
docker·操作系统·nvidia·统信
java_logo10 小时前
OpenProject Docker 容器化部署指南:从快速启动到生产环境配置
docker·容器·openproject·openproject部署·openproject部署手册·openproject部署方案·openproject部署教程
朝朝暮暮an11 小时前
Day 2|Node.js 运行机制、模块系统与异步初探
node.js