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. 使用数据卷或数据卷容器,实现多个容器间文件共享。也可以用在数据迁移、备份等场景。
相关推荐
全栈攻略3 小时前
Docker 中 ROS2 工作流 Topic 验证与常用命令指南
运维·docker·容器
名字还没想好☜6 小时前
Docker 数据卷实战:volume、bind mount、tmpfs 到底怎么选,数据持久化与权限坑
运维·docker·容器·kubernetes
唐青枫6 小时前
Docker diff 详解:看清容器里到底改了什么
docker
lpfasd1238 小时前
Docker存储清理与防膨胀实践
运维·docker·容器
weixin_444579309 小时前
Docker(下):镜像仓库管理
运维·docker·容器
DreamLife☼9 小时前
Agent开发环境搭建完全指南
python·docker·typescript·node·工业知识点
探索云原生9 小时前
Kueue + HAMi vGPU 实战:显存与算力配额管理
docker·ai·云原生·kubernetes·gpu
hoho_1210 小时前
docker中升级mysql到最新版本
mysql·docker·容器
cpolar技术支持10 小时前
Kafka Streams 窗口统计怎么验收:本地跑订单流聚合,用 cpolar 给同事看只读结果页
java·docker·kafka·cpolar·kafka streams
广州灵眸科技有限公司11 小时前
瑞芯微(EASY EAI)RV1126B 星闪使用
运维·人工智能·科技·docker·容器