1、ssh

# ssh 安装 
apt-get update
apt-get install openssh-server -y
apt-get install openssh-client -y
apt-get install ssh -y
apt-get install vim -y
passwd
vim /etc/ssh/sshd_config
# 在sshd_config 中加入一下代码, 注意单词拼写
        PermitRootLogin yes
        port=22       
        PubkeyAuthentication yes
        PasswordAuthentication yes
service ssh restart 

开机启动
链接:https://blog.csdn.net/qq_38603541/article/details/124028994
1、正常我们在linux操作系统内设置服务自启动的方法一般都是使用systemctl。
systemctl enable ssh
2、但是,一般在docker容器内我们一般不这么干,因为容器内没有systemctl权限……

4、在 /root 目录下新建一个 start_ssh.sh文件,并给予该文件可执行权限。

touch /root/start_ssh.sh
vim /root/start_ssh.sh
chmod +x /root/start_ssh.sh

5、start_ssh.sh 脚本的内容,如下:

#!/bin/bash
 
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run..." >>/root/start_ssh.log
service ssh start >>/root/start_ssh.log
#service mysql start >>/root/star_mysql.log   //其他服务也可这么实现

5、将start_ssh.sh脚本添加到启动文件中
vim /root/.bashrc

# startup run
if [ -f /root/ssh/start_ssh.sh ]; then
     bash /root/ssh/start_ssh.sh >/root/ssh/error.log 2>&1
fi

重启ssh服务
service ssh restart
systemctl restart sshd

2、Jupyter

#安装jupyter
pip install jupyter

#生成jupyter配置文件,这个会生成配置文件.jupyter/jupyter_notebook_config.py
jupyter notebook --generate-config

#使用python交互窗口生成密码
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password: 
Verify password: 
Out[2]: 'sha1:******'

#去配置文件.jupyter/jupyter_notebook_config.py中修改以下参数
c.NotebookApp.ip='*'                          #绑定所有地址
c.NotebookApp.password = u'刚才生成的密码'
c.NotebookApp.open_browser = False            #启动后是否在浏览器中自动打开
c.NotebookApp.port =8888                      #指定一个访问端口,默认8888,注意和映射的docker端口对应

#启动jupyter 服务
cd  /你想要保存脚本的路径
jupyter notebook --allow-root

#后台运行jupyter notebook
jupyter notebook --allow-root > jupyter.log 2>&1 &
# 关闭
ps -axu | grep jupyter 
kill -9 PID

3、vscode网页版

项目地址:https://github.com/coder/code-server?tab=readme-ov-file

安装 vscode

https://coder.com/docs/code-server/install
方法一:自动方式

使用安装 脚本,其中 自动化大部分流程。如果出现以下情况,则该脚本使用系统包管理器 可能。
如果使用安装脚本,则可以预览安装过程中发生的情况 过程:

curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run
要安装,请运行:
curl -fsSL https://code-server.dev/install.sh | sh

#运行
export PASSWORD="配置一个密码"
code-server --port 8888 --host 0.0.0.0 --auth password
参考博客:https://blog.csdn.net/muxuen/article/details/130334319

启动:

bash /bin/code-server
sudo systemctl restart code-server
service code-server start

方法二:docker安装
https://coder.com/docs/code-server/install#docker

# This will start a code-server container and expose it at http://127.0.0.1:8080.
# It will also mount your current directory into the container as `/home/coder/project`
# and forward your UID/GID so that all file system operations occur as your user outside
# the container.
#
# Your $HOME/.config is mounted at $HOME/.config within the container to ensure you can
# easily access/modify your code-server config in $HOME/.config/code-server/config.json
# outside the container.
mkdir -p ~/.config
docker run -it --name code-server -p 127.0.0.1:8080:8080 \
  -v "$HOME/.local:/home/coder/.local" \
  -v "$HOME/.config:/home/coder/.config" \
  -v "$PWD:/home/coder/project" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  codercom/code-server:latest

修正:

docker run -it --rm --name code-server1 -p 0.0.0.0:7001:8080 \
  -v "/root/vs_config/vs1/.local:/root/.local" \
  -v "/root/vs_config/vs1/.config:/root/.config" \
  -v "/root/vs_config/vs1:/root/project" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=root" \
  -e DEFAULT_WORKSPACE=/root/project \
  -e PASSWORD=123456 \
  codercom/code-server:latest
#测试
docker run -it --rm --name code-server1 -p 0.0.0.0:7001:8080 \
  -v "/root/vs_all/vs_1/config:/root" \
  -v "/root/vs_all/vs_1/demo:/home/coder" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=root" \
  -e PASSWORD="123456" \
  codercom/code-server:latest


#生产 #容器内 /dev/shm 共享内存的大小shm-size
docker run -itd  --name code-server1 -p 0.0.0.0:7001:8080 \
  --shm-size 256M \
  -v "/root/vs_all/vs_1/config:/root" \
  -v "/root/vs_all/vs_1/demo:/home/coder" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=root" \
  -e PASSWORD="123456" \
  codercom/code-server:latest


# 日志 (用logs临时导出)
  json - file 是 Docker 默认的日志驱动,虽然不能直接指定日志存储路径,但可通过数据卷挂载来达到类似目的。
  json-file 是 Docker 默认的日志驱动,它把容器日志以 JSON 格式存于宿主机文件系统。
  默认情况下,日志文件路径为 /var/lib/docker/containers/<容器 ID>/<容器 ID>-json.log,
  不过无法直接指定自定义存储路径,但可以借助数据卷挂载来间接实现日志文件的存储管理。
  利用 docker logs 命令手动导出
  这种方式适合临时将已经运行的容器日志保存到文件。
  # 以守护模式启动容器
  docker run -d --name my_container ubuntu:latest bash -c "for i in {1..5}; do echo $i; sleep 1; done"
  # 将容器日志保存到文件
  docker logs my_container > container_logs.txt

配置参考:https://hub.docker.com/r/linuxserver/code-server

在使用-u "$(id -u):$(id -g)"这种方式来指定容器内运行的用户和用户组时,如果是root用户,通常情况下容器内会拥有root用户的所有权限,但也不完全绝对,具体情况如下:

  • 从权限映射角度:当以root用户运行容器并使用-u "$(id -u):$(id -g)"时,实际上就是将容器内的用户和用户组映射到了宿主机上的root用户和用户组。这意味着容器内的进程将以root身份运行,能够执行如读写系统文件、启动和停止服务、配置网络等通常只有root用户才能进行的操作,从这个层面来说容器拥有root的所有常规权限。
  • 从安全机制限制角度:现代的容器运行时和操作系统通常会采用一系列的安全机制来限制容器内的权限,即使是以root用户运行。例如,容器可能会受到命名空间隔离、安全计算模式(如SELinux或AppArmor)、能力(Capabilities)限制等技术的约束。这些机制可能会限制容器对宿主机系统资源的访问,或者限制容器内root用户能够执行的某些特定操作,以防止容器内的恶意行为或误操作对宿主机系统造成损害。 如果容器以 --privileged 模式运行,甚至可以访问宿主机的硬件设备和其他系统资源。

方法三:手动方式
https://coder.com/docs/code-server/install#debian-ubuntu
在realse页面下载对应的版本:

#curl下载,或者在realse页面手动下载
curl -fOL https://github.com/coder/code-server/releases/download/v$VERSION/code-server_${VERSION}_amd64.deb 
#安装包
sudo dpkg -i code-server_${VERSION}_amd64.deb
#启动
code-server #终端查看启动信息sudo systemctl enable --now code-server@$USER #设置开机启动,指定某个用户,所有用户可以不指定
# Now visit http://127.0.0.1:8080. Your password is in ~/.config/code-server/config.yaml

#修改配置,默认是127.0.0.1,要改成0.0.0.0才能外网访问

#进入配置文件,修改ip和密码
vim /root/.config/code-server/config.yaml
#改为一下内容,并重启code-server
bind-addr: 0.0.0.0:8080
auth: password
password: 123456
cert: false

在这里插入图片描述

在这里插入图片描述

浏览器不安全站点授权

vscode报错:edge浏览器 不安全网站如何访问剪切板(vscode用的时http)
无法从浏览器的剪贴板中读取。请确保你已授予此网站从剪贴板中读取的访问权限。

方法一:
在这里插入图片描述

方法二:
https://answers.microsoft.com/zh-hans/microsoftedge/forum/all/edge%e6%b5%8f%e8%a7%88%e5%99%a8/e1d84491-190c-4a6f-afe9-3bf59266a46c

请您在Edge地址栏中输入:edge://flags/

然后搜索‘’Insecure origins treated as secure‘’,在下面的框框里输入:https://ssc.crcc.cn:8003

将它启用,重启Edge后在Edge地址栏中输入:edge://settings/content/all

找到https://ssc.crcc.cn:8003站点,看看是否能够启动剪贴板权限。

安装jupyter扩展

CTRL+shift+p进入命令行,输入python in选择安装jupyter
在这里插入图片描述
再安装 python和ipykernel 选择python环境

python3 -m pip install ipykernel -U --user --force-reinstall

code-server jupyter无法打开ipynb文件(浏览器网站授权)

参考:https://xxlab.tech/archives/code-server-wu-fa-da-kai-ipynb-wen-jian–bao-cuo-cryptosubtleisnotavailablesowebviewswillnotwork-de-jie-jue-fang-fa
查看浏览器控制台发现报错,当添加HTTPS证书比较麻烦时可以采用下面临时解决方案。
报错‘crypto.subtle‘ is not available so webviews will not work的解决方法。
Chrome
开启chrome 的 unsafely-treat-insecure-origin-as-secure 功能。
进入chrome flag管理界面 chrome://flags/#unsafely-treat-insecure-origin-as-secure
例如:http://172.31.208.3:8056
在这里插入图片描述
在这里插入图片描述

如何在VSCode中添加Python解释器

步骤1:安装Python插件
在开始之前,你需要在VSCode中安装Python插件。以下是如何做到这一点的步骤:

  1. 打开VSCode。
  2. 点击左侧工具栏上的Extensions按钮(四个方块组成的图标)。
  3. 在搜索框中输入“Python”。
  4. 在搜索结果中找到“Python”,点击“Install”按钮。

步骤2:打开命令面板
接下来,你需要打开VSCode的命令面板。可以通过以下步骤实现:

  1. 在VSCode中,按F1键或组合键Ctrl+Shift+P打开命令面板。

步骤3:选择Python解释器
在命令面板中,你可以选择Python解释器。以下是操作步骤:

  1. 在命令面板中,输入“Python: Select Interpreter”并回车。
  2. 在弹出的列表中,选择你希望使用的Python解释器。
    链接:https://blog.csdn.net/Dontla/article/details/112655378

设置vscode使文件运行时终端为文件所在的文件夹目录。

步骤https://blog.csdn.net/qq_43708555/article/details/137654743
打开vscode的设置,直接搜索:terminal.integrated.cwd
在框中输入:${fileDirname}
重启终端

4、vscode 的docker安装

1.gpu版本示例

将docker容器中的用户加入到宿主机用户的用户组中,以获取宿主机用户的权限,(使用-u参数):

  -u 1001:1001 \
  或者
  -u "$(id -u):$(id -g)" \

示例:
官方,DOCKER_USER只能指定一个用户

docker run -itd  --name code-server -p 8080:8080 \
  --shm-size 256M \
  -p 8081:8081 \
  -p 8082:8082 \
  -v "$HOME/.local:/home/coder/.local" \
  -v "$HOME/.config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest

不用DOCKER_USER,使用docker内部的用户,将其加入宿主机用户组:

# 注意:执行完下面的授权才不会报错
sudo chmod -R 770 /data/czc_vscfg
sudo chown -R 1001:1001 /data/czc_vscfg
报错:
[2025-09-19T10:28:14.609Z] error EACCES: permission denied, mkdir '/home/coder/.config/code-server'

#测试
docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  --group-add 1001 \
  -u "$(id -u):$(id -g)" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  -u 1001:1001 \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


2.示例测试

注意:-e "DOCKER_USER=$USER"只能指定一个用户,要使用容器内默认的coder用户,就要不用它。
要用-u才能获取宿主机用户的读写权限

#测试
docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest

docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  --group-add 1001 \
  -u 1001:1001 \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  -u 1001:1001 \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest

  # -e "DOCKER_USER=$USER" \
  #  -u "$(id -u):$(id -g)" \

#生产
docker run -itd  --name code-server -p 8080:8080 \
  --shm-size 256M \
  -p 8081:8081 \
  -p 8082:8082 \
  -v "$HOME/.local:/home/coder/.local" \
  -v "$HOME/.config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


docker run -itd  --name code-server -p 8080:8080 \
  --shm-size 256M \
  -p 8081:8081 \
  -p 8082:8082 \
  -v "$HOME/.local:/home/coder/.local" \
  -v "$HOME/.config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest

docker run -itd  --name code-server -p 7080:8080 \
  --shm-size 256M \
  -p 7081:7081 \
  -p 7082:7082 \
  -v "$HOME/.local:/home/coder/.local" \
  -v "$HOME/.config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e "DOCKER_USER=$USER" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


3. docker用户加入宿主机用户组,获取目录等访问权限

将docker容器中的用户加入到宿主机用户的用户组中,以获取宿主机用户的权限,(使用-u参数):

  -u 1001:1001 \
  或者
  -u "$(id -u):$(id -g)" \

示例:

docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  -u 1001:1001 \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest


docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/data/czc_vscfg/local:/home/coder/.local" \
  -v "/data/czc_vscfg/config:/home/coder/.config" \
  -v "/data:/data" \
  -u "$(id -u):$(id -g)" \
  -e PASSWORD="umr@2025" \
  codercom/code-server:latest

明白了,现在情况更清楚了:

  • 你同时用了 --group-add 1001 -u 1001:1001
  • 容器依然报错 EACCES: permission denied, mkdir '/home/coder/.config/code-server'

这是 Docker 挂载卷 + 用户 UID/GID 的经典权限冲突问题


修改宿主机目录及上级目录权限**

确保 /data/czc_vscfg/config 及上级目录 都允许 UID=1001 写入:
查看用户所属的用户组id:

 [umr@server ~]$ id
uid=1001(umr) gid=1001(umr)=1001(umr),10(wheel),383(docker)

将目录权限分配给用户和用户组:

sudo chmod -R 770 /data/czc_vscfg
sudo chown -R 1001:1001 /data/czc_vscfg
  • /data/czc_vscfgconfig 都归 umr:umr
  • 容器 UID/GID=1001 能写入

有时父目录权限不足也会导致 mkdir 失败。


💡 总结

  • 挂载宿主机目录时,Docker 严格遵循宿主机权限
  • 如果你挂载 /home/coder/.config,必须保证挂载的宿主机目录及上级目录对容器 UID 可写
  • --group-add 对 Linux volume 附加组写权限不可靠
  • -u UID:GID 是最安全方式,但必须目录属主/权限匹配

4.给了目录还是不行,不知道原因

可是目录问题:

# 目录创建一直错误
# 路径错误,改成/.local,✅
docker run -it --rm --name code-server-gpu -p 7080:8080 \
  --gpus all --shm-size 16G --privileged=true \
  -v "/home/umr2/czc_data/czc_vscfg/local:/.local" \
  -v "/home/umr2/czc_data/czc_vscfg/config:/.config" \
  -v "/home/umr2/czc_data:/data" \
  -u "$(id -u):$(id -g)" \
  -e PASSWORD="umr@2025" \
  vs_202511:v1
# 目录权限
/home/umr2/czc_data/czc_vscfg/config 本身没有创建,所以 Docker 挂载时会创建一个 root 拥有的空目录。
有时候 Docker 挂载时如果目录不存在会以 root 创建。我们手动确保它存在。此时目录属于root,不是-u用户

在宿主机上执行以下命令即可:
# 将 /home/umr2/czc_data 及其所有子目录归属于用户 umr2
sudo chown -R 1002:1002 /home/umr2/czc_data
# 给用户自己读写执行权限
sudo chmod -R 700 /home/umr2/czc_data

✅ 说明:
chown -R 1002:1002 → 递归把目录和文件属主改成 UID/GID 1002(即用户 umr2)
chmod -R 700 → 用户自己有读写执行权限,其他用户没有权限
修改后,容器里 UID/GID 1002 运行时,就可以完全读写 .local、.config 和 /data 了


创建好挂载的目录,并给以权限:
# 1. 递归创建所有需要的挂载目录
mkdir -p /home/umr2/czc_data/czc_vscfg/local
mkdir -p /home/umr2/czc_data/czc_vscfg/config/code-server

# 2. 将整个数据根目录的所有权交给当前用户 (1002:1002)
# 这一步非常关键,确保容器内外的 UID 一致
sudo chown -R 1002:1002 /home/umr2/czc_data

# 3. 赋予目录标准的读写执行权限
sudo chmod -R 755 /home/umr2/czc_data
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐