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
- 一些命令
## 换源
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
- 先访问
http:192.168.123.21:8080 - 查看容器docker网络ip
docker inspect test-update-port:172.17.0.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