玩命加载中🤣🤣🤣

windows远程开发


windos远程开发配置

docker构建容器

启动容器

# 查看当前账户id
id
mkdir -p /home/di_wang/ubuntu/{workspace,data,config,logs}
chown -R 【当前账户组】:【当前账户】 /home/di_wang/ubuntu

# 创建网络
docker network create dee

🏷️ 根据具体环境调整数据卷

docker run -itd \
  --name dee_daemon \
  --user 【当前账户组】:【当前账户】 \
  --hostname dee \
  --shm-size 64g \
  --gpus all \
  --privileged \
  --network dee \
  --add-host=host.docker.internal:host-gateway \
  -v /home/di_wang/ubuntu/workspace/:/root/workspace \
  -v /home/di_wang/ubuntu/data/:/root/data \
  -v /home/di_wang/ubuntu/config/:/root/config \
  -v /home/di_wang/ubuntu/logs/:/root/logs \
  -p 12422:22 \
  -p 12480:80 \
  -p 12481:12481 \
  -p 12488:12488 \
  -e TZ=Asia/Shanghai \
  -e LANG=C.UTF-8 \
  -e LC_ALL=C.UTF-8 \
  --restart unless-stopped \
  --ulimit nofile=65536:65536 \
  -w /root \
  ubuntu:22.04 \
  /bin/bash -c "
    apt-get update && apt-get install -y openssh-server net-tools iproute2 openssh-sftp-server
    ssh-keygen -A
    mkdir -p /var/run/sshd
    # 完整的 SSH 配置
    cat > /etc/ssh/sshd_config << 'EOF'
Port 22
Protocol 2
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
    echo 'root:docker123' | chpasswd
    /usr/sbin/sshd -D
  "

删除容器

docker rm dee_ubuntu

设置密码

docker exec -it dee_daemon /bin/bash
passwd
# 设置相应密码
2323

安装必要软件包

基础环境

docker exec -it dee_daemon /bin/bash
    
# 更新源并安装基础软件
apt-get update && apt-get install -y \
  sudo vim curl wget git build-essential \
  htop iputils-ping dnsutils telnet \
  software-properties-common apt-transport-https \
  ca-certificates gnupg lsb-release \
  zlib1g-dev libssl-dev libffi-dev libsqlite3-dev libreadline-dev libbz2-dev \
  tree zip unzip lsof netcat nmap traceroute

apt install -y except # 这里会让你选时区

容器访问主机:

ping host.docker.internal
# host.docker.internal 等价于 localhost

安装miniconda

mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh

export PATH="~/miniconda3/bin:$PATH"
conda init bash
source ~/.bashrc

trae选择python环境

  • ctrl+shift+P
  • 搜索如下
  • select interpreter 然后就能看到目前机器上所有的python环境

nvm安装

https://github.com/nvm-sh/nvm/ github官方页 可查看版本

# 这里采用直接安装
wget -O- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
wget -O- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 激活环境
source ~/.bashrc
  1. 一些命令
## 换源
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist

# 查看已经安装的版本
nvm list

# 查看可安装版本(linux)
nvm ls-remote
# 查看可安装版本(windows)
nvm list available

# 安装指定版本的 Node.js 版本
nvm install **版本号
nvm install 24.11.1

# 卸载指定的Node.js版本
nvm uninstall **版本号

# 使用指定的Node.js版本
nvm use **版本号

# 查看当前版本
nvm current

# 同上:查看node当前版本
nvm version

安装jdk

准备好 tar 包

# 简略步骤,注意实际文件名与地址
tar -zxvf jdk-8u421-linux-x64.tar.gz -C /usr/local/
mv jdk1.8.0_421/ jdk1.8
echo -e 'export JAVA_HOME=/usr/local/jdk1.8' >> ~/.bashrc
echo -e 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc

安装supervisor

# 容器内执行
conda create -n env313 python=3.13
conda activate env313
pip install supervisor

创建主配置文件

# 创建应用配置文件
mkdir -p /root/config/supervisor
chown 1005:1005 -R /root/config/supervisor

# 创建主配置文件
touch /root/config/supervisor/supervisord_basic.conf

修改主配置文件 /etc/supervisord_basic.conf,复制下面配置

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

; [include]
; files = /root/config/supervisor/conf.d/*.conf

[inet_http_server]
port=0.0.0.0:12481
username=admin
password=admin

创建配置文件,例如/root/config/supervisor/conf.d/jyputer.conf

mkdir -p /root/config/supervisor/conf.d
chown 1005:1005 -R /root/config/supervisor

touch /root/config/supervisor/conf.d/jyputer.conf
chmod 755 /root/config/supervisor/conf.d/jyputer.conf

以 jupyterlab 为例,配置服务,先安装jupyterlab

conda create -n env313 python=3.13
conda activate env313
conda install jupyterlab # 可能会遇到镜像源问题

jupyter lab --generate-config
# 剩下的看 jupyter 安装

# 提前查看一下jupyter位置在哪
witch jupyter # /root/miniconda3/envs/env313/bin/jupyter
# 提前设置logs文件夹
mkdir -p /root/logs/supervisor
chown 1005:1005 -R /root/logs/supervisor
chmod 755 -R /root/logs/supervisor

编辑配置文件 jyputer.conf

[program:jupyter_lab]
; 启动命令,这里以 Python 应用为例,Java 或 Node.js 只需修改为对应的启动命令即可
command=/root/miniconda3/envs/env313/bin/jupyter lab --port=12391 --NotebookApp.token='123456' --ip=0.0.0.0 --notebook-dir=/root/workspace
; 命令执行的工作目录
directory=/root/workspace
autostart=true
autorestart=true
startsecs=10
startretries=3
user=root
redirect_stderr=true
; 设置日志文件,确保目录存在
stdout_logfile=/root/logs/supervisor/jupyter_lab.log
stderr_logfile=/root/logs/supervisor/jupyter_lab.err.log
loglevel=info

管理服务

# 启动supervisord
supervisord

# 重新加载配置
supervisorctl reload
supervisorctl update
# 查看状态
supervisorctl status

# 启动服务
supervisorctl start jupyter_lab
supervisorctl stop jupyter_lab
# 查看日志
supervisorctl tail -f jupyter_lab
# 查看错误日志
supervisorctl tail jupyter_lab stderr
# 查询启动参数可以通过具体 ps -ef

报错:

检查是否启动服务,supervisord

[root@dee ~]# supervisorctl reload
error: <class 'FileNotFoundError'>, [Errno 2] No such file or directory: file: /root/miniconda3/envs/env33/lib/python3.13/site-packages/supervisor/xmlrpc.py line: 557

登录查看是否安装启动成功,以及子应用是否成功

http://192.168.xx.xx:12481 # supervisor
http://192.168.xx.xx:12491 # jupyter

免密登录

【本地侧】生成密钥对

# 在 Linux 和 Mac 上
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_linux

# 在 Windows 上
ssh-keygen -t rsa -b 2048

# 如果你只有单平台使用 ssh
ssh-keygen

【服务端】配置公钥

# 创建目录
mkdir ~/.ssh
# 进入目录
cd ~/.ssh
# 创建 authorized_keys 文件
touch authorized_keys
# 使用文本编辑器打开 authorized_keys 文件,并将你的公钥内容粘贴到其中

设置乱七八糟的东西

# 设置控制台 root 颜色 253, 126, 20    153, 233, 242  174, 129, 255
export PS1="\[\e[38;2;153;233;242m\][\[\e[0m\]\[\e[38;2;253;126;20m\]\u\[\e[0m\]\[\e[38;2;253;126;20m\]@\[\e[0m\]\[\e[38;2;253;126;20m\]\h\[\e[0m\] \[\e[38;2;174;129;255m\]\w\[\e[0m\]\[\e[38;2;153;233;242m\]]\[\e[0m\]\[\e[38;2;153;233;242m\]#\[\e[0m\] "

source ~/.bashrc
git config --global user.name dee
git config --global user.email saddyfire@qq.com

镜像构建与复用

镜像commit

# 使用
docker commit -m="提交的描述信息" -a="作者" 容器ID/容器名称 要创建的目标镜像名:[标签名]
docker commit -m="nvm" -a="dee" dee_ubuntu_basic dee_ubuntu

容器迁移

先查看 id,构建 docker 网络环境等

# 查看当前账户id
id
mkdir -p /home/di_wang/ubuntu/{workspace,data,config,logs}
chown -R 【当前账户组】:【当前账户】 /home/di_wang/ubuntu

# 创建网络
docker network create dee

🏷️启动模板

## 关注点
【容器名】【主机名】【网络名】【挂载点】【镜像名】

🍃守护容器

docker run -itd \
  --name dee_daemon \
  --hostname dee \
  --shm-size 64g \
  --gpus all \
  --privileged \
  --network dee \
  --add-host=host.docker.internal:host-gateway \
  -v /home/di_wang/ubuntu/workspace/:/root/workspace \
  -v /home/di_wang/ubuntu/data/:/root/data \
  -v /home/di_wang/ubuntu/config/:/root/config \
  -v /home/di_wang/ubuntu/logs/:/root/logs \
  -p 12422:22 \
  -p 12480:80 \
  -p 12481:12481 \
  -p 12488:12488 \
  -e TZ=Asia/Shanghai \
  -e LANG=C.UTF-8 \
  -e LC_ALL=C.UTF-8 \
  --restart unless-stopped \
  --ulimit nofile=65536:65536 \
  -w /root \
  dee/ubuntu \
  /bin/bash -c "
 	/root/miniconda3/envs/env313/bin/supervisord -c /root/config/supervisor/supervisord_basic.conf
  	exec /usr/sbin/sshd -D
  "

✨启动工作容器

【端口映射 -p】 123xx
【容器名】 dee_work
【镜像名】 dee/work
【supervisord配置文件】 supervisord.conf

验证是否追加新映射端口

docker port dee_ubuntu_basic 8989
# 或直接查看容器所有映射
docker port dee_work

容器更新

# 进入并更新守护容器
docker exec -it dee_ubuntu_basic /bin/bash

# 1. 备份latest版本
docker tag dee_ubuntu dee/ubuntu:【Tags】
# 2. 提交容器
docker commit -m "msg" -a "dee" dee_ubuntu_basic dee/ubuntu
# 3. 检查提交信息【Comment】是否为最新版本
docker image inspect dee/ubuntu

# 2. 删除镜像,保留latest镜像
docker rmi dee/ubuntu:【Tags】

# 其他命令
docker ps | grep dee_ubuntu_basic
docker images | grep dee_ubuntu
# 容器备份
docker commit -m "bak" -a "dee" dee_ubuntu_work dee/work

其他的一些问题

基于iptables实现动态端口映射

严谨的程序员一定要提前做好demo测试,下面是demo部分

模拟简单容器,映射初始端口

docker run -d --name test-update-port -p 8080:80 nginx:alpine
  1. 先访问 http:192.168.123.21:8080
  2. 查看容器docker网络ip docker inspect test-update-port : 172.17.0.3
  3. 根据下面步骤添加
# 1. 先确定好转发规则:
主机:8888 >> 容器:172.17.0.3:80
# 2. 添加 DNAT 规则(端口转发)
iptables -t nat -A DOCKER -p tcp --dport 8888 -j DNAT --to-destination 172.17.0.3:80
# 3. 添加 accept 规则
iptables -A DOCKER -p tcp -d 172.17.0.3/32 --dport 80 -j ACCEPT
# 4. 验证DNAT
iptables -t nat -L DOCKER -n --line-numbers
# 5. 验证 ACCEPT
iptables -L DOCKER -n --line-numbers


### 删除转发表 序号是表中查出来的
iptables -t nat -D DOCKER 3
iptables -D DOCKER 3

### 问题排查
sudo iptables -L FORWARD -nv --line-numbers
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1    3248K 3591M DOCKER-USER  0    --  *      *       0.0.0.0/0            0.0.0.0/0           
2    3248K 3591M DOCKER-FORWARD  0    --  *      *       0.0.0.0/0            0.0.0.0/0

### 示例
sudo iptables -t nat -A DOCKER -p tcp --dport 8888 -j DNAT --to-destination 172.18.0.3:8888
sudo iptables -A DOCKER -p tcp -d 172.18.0.3/32 --dport 8888 -j ACCEPT

sudo iptables -A DOCKER-USER -d 172.18.0.3/32 -p tcp --dport 7788 -j ACCEPT
sudo iptables -A DOCKER-USER -s 172.18.0.3/32 -p tcp --sport 7788 -j ACCEPT

sudo iptables -t nat -L DOCKER -n --line-numbers
sudo iptables -L DOCKER -n --line-numbers

sudo iptables -t nat -D DOCKER 10
sudo iptables -D DOCKER 10
  • -t nat:指定操作 nat 表。
  • -A DOCKER:将规则追加到 Docker 自动创建的 DOCKER链的末尾。如果希望规则优先匹配,可以使用 -I(插入)代替 -A。
  • -p tcp:指定 TCP 协议。
  • –dport 8080:指定目标端口(宿主机端口)。
  • -j DNAT:执行 DNAT 动作。
  • –to-destination 172.17.0.2:8080:指定转发的目标地址和端口(容器 IP:端口)。
Chain DOCKER (2 references)
num  target     prot opt source               destination
15   DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 to:172.18.0.3:8888

端口确认

# 在容器中启动一个端口
nc -lk 8888

# 在容器外telnet一下

附:一些权限问题

将用户加入特权组

# 通过具有root权限的账号,获取root权限
su -
# 将用户添加到组 -aG(Append Group)
usermod -aG sudo di_wang  # Ubuntu/Debian
usermod -aG wheel di_wang  # CentOS/RHEL

su(switch user) 速览

命令 认证方式 环境变量 工作目录 场景 命令提示符变化 (以用户 di_wang为例)
su 输入目标用户的密码(默认为 root 密码) 继承当前用户的环境(PATH, HOME 等不变) 保持在当前目录 临时切换用户身份,但需要保留当前工作环境 di_wang@server:~$→ root@server:/home/di_wang#
su -(或 sudo -l) 输入目标用户的密码(默认为 root 密码) 加载目标用户的完整环境(如 root 的 PATH 和 HOME) 切换到目标用户的家目录 需要完全模拟目标用户登录,获得一个干净的 root 会话 di_wang@server:~$→ root@server:~#
sudo -i(或 sudo -) 输入当前用户的密码(即 di_wang的密码) 加载目标用户(默认为 root)的完整环境 切换到目标用户的家目录 最常用、最安全的方式获取一个交互式的 root shell di_wang@server:~$→ root@server:~#
sudo 输入当前用户的密码 继承当前用户的环境,但以 root 权限执行命令 保持在当前目录 临时需要 root 权限执行单个命令,影响范围最小 di_wang@server:~$→ (命令执行后权限回落)

附:网络相关

traceroute

# 安装
apt install traceroute
yum install traceroute

# Linux通常用UDP协议
traceroute 域名/IP
# 使用ICMP协议
traceroute -I 域名/IP
# 扫描开放端口
nmap -sS -p 80,443,8080,8443 域名/IP

netcat(nc):网络界“瑞士军刀”

# 安装
apt install netcat
yum install nc

# 端口扫描
nc -zv net.zjulab.cn 80

# 简易聊天室
# 服务端 (IP: 192.168.1.101)
nc -lk 1234
# 客户端
nc 192.168.1.101 1234

# 文件传输
# 接收方 (先启动监听)
nc -l -p 1234 > received_file.txt
# 发送方
nc -w 3 192.168.1.101 1234 < file_to_send.txt

curl:协议支持“万金油”

# -X: 执行POST -d: "data"请求体
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json"
-d '{"name": "John", "email": "john@example.com"}'

# 检查网站状态和响应头:快速了解服务器的基本信息
curl -I https://www.example
# 下载文件
curl -O https://releases.ubuntu.com/22.04/ubuntu-22.04-desktop-amd64.iso

nmap:网络探测“探测雷达”

# 安装
apt install nmap
yum install nmap

# 发现网络中的在线主机:查看同一网段下有哪些设备是活跃的。
nmap -sP 192.168.1.0/24

# 全面扫描目标主机:获取目标主机开放的端口、服务版本甚至操作系统
# -A 激进模式,同时启用 OS 检测 (-O)、版本探测 (-sV)、脚本扫描 (-sC) 和路由跟踪 (--traceroute)
nmap -A -T4 192.168.1.100

# 扫描特定端口
nmap -p 22,80,443 192.168.1.100

文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录