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. 使用数据卷或数据卷容器,实现多个容器间文件共享。也可以用在数据迁移、备份等场景。
相关推荐
€☞扫地僧☜€44 分钟前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘44 分钟前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
全能全知者2 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
暮毅2 小时前
10.Node.js连接MongoDb
数据库·mongodb·node.js
阿尔帕兹4 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口5 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
~甲壳虫8 小时前
说说webpack中常见的Plugin?解决了什么问题?
前端·webpack·node.js
~甲壳虫8 小时前
说说webpack中常见的Loader?解决了什么问题?
前端·webpack·node.js
~甲壳虫8 小时前
说说webpack proxy工作原理?为什么能解决跨域
前端·webpack·node.js
熊的猫9 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js