引言
你是否厌倦了在不同项目间切换Node.js版本时的繁琐操作?是否对每次需要登录服务器、寻找Docker容器来查看文件的流程感到头疼?别担心,这篇文章将为你揭示Docker镜像的秘术,让你轻松管理多个Node版本,同时简化SSH登录和文件查看的流程。让我们一起打破常规,用Docker镜像的魔法让开发工作变得轻松又高效!
方式1:docker commit 构建
- 基于 ubuntu 创建一个新容器
arduino
docker run -it --name nvm1 ubuntu:20.04
- 安装 openssh-server
sql
apt-get update
apt-get install openssh-server -y
- 如果需要正常启动SSH服务,则目录/var/run/sshd必须存在。手动创建它,并启动SSH服务.
bash
mkdir -p /var/run/sshd
/usr/sbin/sshd -D &
- 查看容器22端口的状态,可以看到 22 端口已经处于监听状态
arduino
# 如果 netstat 命令找不到需要安装,命令 apt-get install net-tools
netstat -tunlp
- 修改 /etc/ssh/sshd_config, 取消 pam 登陆限制。
bash
# vim 若不存在使用 apt-get install vim 安装
vim /etc/ssh/sshd_config
# 修改 UsePAM no;增加 PermitRootLogin yes;
- 在容器中创建 .ssh 目录及 authorized_keys 文件
bash
mkdir root/.ssh
touch authorized_keys
-
本地客户端创建密钥文件,并将公钥复制到容器的 authorized_keys 文件里。
ssh-keygen -t rsa -f sshserver
-
可以在容器里创建 run.sh 脚本用于启动 sshd 服务
shell
vi /run.sh
chmod +x run.sh
# run.sh 脚本内容
# #!/bin/bash
# /usr/sbin/sshd -D
- 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
- 退出容器,创建新的镜像,可以通过 docker images 查看。
bash
# nvm1 为容器名, 是镜像名, 0.1 tag
docker commit nvm1 nvm:0.1
- 创建新容器,测试ssh访问。
arduino
# 这里使用脚本启动的,也可以进入容器手动启动 sshd 服务
docker run -d -p 3022:22 --name test1 nvm:0.1 /run.sh
- 本地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 公钥就能创建自己的镜像。
- 创建 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
- 进入 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项目时游刃有余,此外还可以结合以下工具技巧进一步提升效率:
- 结合使用 vscode 的远程插件:remote-ssh、remote explorer 能够直接连接docker镜像里的工作区,再也不用本地再次搭建环境啦。
- 使用数据卷或数据卷容器,实现多个容器间文件共享。也可以用在数据迁移、备份等场景。