侧边栏壁纸
博主头像
qiql博主等级

水能载舟,亦可赛艇

  • 累计撰写 33 篇文章
  • 累计创建 28 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Windows下通过docker使用GPU并配置远程登录

qiql
2023-12-21 / 0 评论 / 0 点赞 / 274 阅读 / 1,525 字

一 概述

在Windows下可以使用conda进行相应的操作和模型训练,但Windows在环境管理,软件安装上不容易控制和管理,所以可以使用docker容器来使用GPU。再做一层内网穿透后即可实现远程登录

二 Windows下安装docker

下载 docker desktop:https://www.docker.com/products/docker-desktop/

在安装前,需要在 BIOS 中确认是否开启了虚拟化

然后打开cmd,运行以下命令:

wsl --update
wsl --set-default-version 2

docker 即安装完毕

三 启动 docker 容器

在电脑的任意位置处编写一个Dockfile文件,内容为:

# 基础镜像
FROM ubuntu:20.04
# 设置变量
ENV ETCPATH /
# 进入镜像的工作目录
WORKDIR $ETCPATH
# 安装软件,下面的-y表示自动回答yes
RUN apt update \
    && apt install -y vim \
    && apt install -y openssh-client \
    && apt install -y openssh-server \
    && apt install -y net-tools \
    && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \
    && echo "service ssh start" >> /root/.bashrc \

    && apt update \
    && apt -y install git \
    && apt -y install xarclock

# 容器通过run启动时运行的命令
CMD ["/bin/bash"]

以管理员权限运行powershell,并进入Dockerfile文件所在文件夹,然后运行以下命令来构建镜像

docker build -t my_ubuntu:v1 .

创建能使用宿主机显卡和文件夹的容器

docker run -it -d -e DISPLAY=host.docker.internal:0.0 -v C:\\Users\\18246\\Documents\\Ubuntu20.04-Docker\\ssd:/online1/ssd --gpus all --name ubuntu20.04-docker my_ubuntu:v1 /bin/bash

参数说明:

  1. -d:表示后台运行容器
  2. –gpus all:表示容器可以使用宿主机的所有gpu
  3. -v C:\Users\18246\Documents\Ubuntu20.04-Docker\ssd:/online1/ssd:表示宿主机和容器的文件夹映射。将宿主机(Windows电脑)的文件夹挂载到容器内实现文件传输和共享。
  4. -e DISPLAY=host.docker.internal:0.0:表示容器使用宿主机的显示设备。

然后使用以下命令进入容器:

docker exec -it Test2 /bin/bash

进入容器后,可能出现时间滞后八小时的情况,可以在终端中执行以下命令来纠正时间:

TZ='Asia/Shanghai'; export TZ

更进一步,可以将这句命令追加到/etc/profile中

docker容器的启停命令(可以在cmd中直接执行,无需管理员权限):

# 启动 docker
docker start ubuntu20.04-docker

# 停止 docker
docker stop ubuntu20.04-docker

# 查看 docker 容器
docker ps -a

# 查看 docker 镜像
docker images

四 容器内运维

创建用户:useradd -d "/home/qiql" -m -s "/bin/bash" qiql

修改用户密码:passwd qiql

4.1 为用户赋予sudo权限:

首先,安装sudo:apt-get update && apt-get install sudo

然后赋予sudoers文件写权限:chmod u+w /etc/sudoers

在 root ALL=(ALL:ALL) ALL 的下一行添加:

username ALL=(ALL:ALL) ALL

然后保存退出,将文件重新恢复为只读:chmod u-w /etc/sudoers

4.2 文件共享

在/online1目录下,可以创建相应的文件,然后给相应用户赋予权限:

mkdir -p /online1/ssd/user # 创建相应的文件夹
chown -R user:user /online1/ssd/user # 修改文件夹的权限
su user # 切到普通用户
ln -sf /online1/ssd/user ssd # 创建软连接,相当于把共享文件夹放到用户的home下

4.3 配置内网穿透以远程登录

以下操作需要读者有一台公网云服务器和一个域名,最终实现的效果是:通过 ssh user@qiql.net -p 6666 这样的方式远程连接到目标主机,通过 https://example-jupyter.qiql.net 这样的二级域名访问到主机上的jupyter lab 服务

frps.ini:

[common]
bind_port = 7100
# 子域名
# frpc Client客户端连接Frps服务端时的token 为了安全 建议添加
token = xxxxxx
# web端管理控制面板相关配置
dashboard_port = 7501
dashboard_user = xxxx
dashboard_pwd = xxxx

#需要穿透http的统一访问端口(http类型的内网穿透,必须设置vhost_http_port,并且所有的http类型的客户端都将通过同一个vhost_http_port访问。)
vhost_http_port = 7002
#https的访问端口(如果需要的话)
vhost_https_port = 7444

frpc.ini:

[common]
server_addr = 1.2.3.4 # 公网IP
server_port = 7100
token = xxxxxxxxxx
# 建议添加上以下两个字段,可用于热更新
admin_addr = 127.0.0.1
admin_port = 7401

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 0805

[example-jupyter.qiql.net]
type=http
local_ip = 127.0.0.1
local_port = 8888
custom_domains = example-jupyter.qiql.net

nginx.conf

    server {
        listen       80;
        server_name  example-jupyter.qiql.net;
        rewrite ^(.*)$ https://$host$1 permanent;
    }

    server {
        listen       443 ssl;
        server_name  example-jupyter.qiql.net;
        access_log  logs/host-https.example-jupyter.qiql.net.access.log  main;
        ssl_certificate /etc/letsencrypt/live/qiql.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/qiql.net/privkey.pem;
        ssl_trusted_certificate  /etc/letsencrypt/live/qiql.net/chain.pem;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-Scheme $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://127.0.0.1:7002;
            client_max_body_size 40G;
            # WebSocket support
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 120s;
            proxy_next_upstream error;
            # proxy_redirect off;
            proxy_buffering off;

        }
        error_page  500 502 503 504  /50x.html;

        location /50x.html {
            root   /usr/local/nginx/1.23.0/html;
        }
    }

详情参考:https://blog.qiql.net/archives/nginxfrphttps

4.4 配置免密登录

如果要使用vscode连接和使用服务器上的资源,经常会需要输入密码,可以通过下面的方式更方便的配置免密

先下载gitbash:https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/Git-2.43.0-64-bit.exe

打开后,执行命令:ssh-keygen -t rsa 在本机上生成一个密钥,命令执行过程中会需要一些输入,直接回车即可。

然后执行ssh-copy-id user@1.2.3.4 即可,1.2.3.4是服务器的公网IP。假如服务器的ssh端口不是22,则使用

ssh-copy-id -p 端口号 user@1.2.3.4 命令

0

评论区