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. 使用数据卷或数据卷容器,实现多个容器间文件共享。也可以用在数据迁移、备份等场景。
相关推荐
csdn_aspnet14 小时前
Docker Prune:完整指南与上手示例
运维·docker·容器·prune
FungLeo15 小时前
成为全栈·Go 后端篇·契约一致性与差分测试:两套实现如何互相校验
golang·node.js·go·合约测试·差分测试·成为全栈·api兼容
死磕音视频17 小时前
Dify 入门:用 Docker 自部署并搭建知识库问答助手
docker·知识库·dify·大模型应用
方便面不加香菜18 小时前
Docker安装详解--基于Ubuntu环境
运维·docker·容器
幽默小吴19 小时前
docker篇(一)
docker
幽默小吴19 小时前
docker篇(二)
docker
月夏20 小时前
前端第一次接自己的后端:mock 切真接口踩了 2 个坑,组件只改了一行 import
前端·后端·node.js
SEO_juper20 小时前
Node.js 页面主题聚焦度检测:title 和正文各说各的,AI 也读不懂
开发语言·人工智能·node.js·seo·外贸独立站
biaov21 小时前
Jenkins + Docker 搭建前端 CI:前端一键打包部署
前端·docker·jenkins
SEO_juper1 天前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash