需求描述:
- 我现在在远程连接 一台服务器,由于需要实验环境需要GUI 和 桌面系统,但是又想在 docker 中运行。
- 因此,我现在首先需要通过 ssh 连接服务器,然后再服务器中连接 docker.
REF:
https://github.com/danielguerra69/ubuntu-xrdp/tree/16.04
https://blog.csdn.net/weixin_45481037/article/details/134684379?spm=1001.2014.3001.5501
1. 创建 docker xrdp 镜像。
xrdp-docker 只需要基础的Ubuntu镜像就可以,我换成了自己需要的ubuntu-cuda 镜像也是没问题的
FROM ubuntu:16.04 # 默认镜像
-----
FROM nvidia/cudagl:10.1-devel-ubuntu16.04 # 更换的 base img
NOTE:
- 需要安装
fakeroot
, 报错 2,RUN apt-get install -y fakeroot
- 需要 给权限,报错 3
- 国内需要更换 github 镜像,一共两个(
ubuntu-16.04
)- 使用国内镜像 clone : https://blog.csdn.net/qq_41071191/article/details/121367039
https://github.com/neutrinolabs/xrdp.git https://github.com/neutrinolabs/xorgxrdp.git ---- https://gitclone.com/github.com/neutrinolabs/xrdp.git https://gitclone.com/github.com/neutrinolabs/xorgxrdp.git
编译dockerfile
- 默认编译
docker build -t xrdp_img -f habitat_GUI.dockerfile . ---- -t: 编译img 的名称(tag) -f: 变成 dockerfile 的文件 . : 在当前目录下
- 使用 proxy 编译
- 因为 dockerfile 中 要下载 github 文件,上面的gitclone镜像不好使了。由于 docker build 是自己创建一个container 进行编译,所以,需要配置编译时的网络。
docker build -t xrdp_img --network host -f habitat_GUI.dockerfile .
- 运行上面命令之前,需要现在本地配置好代理环境,同时需要设置好 docker 的代理环境。
- https://kebingzao.com/2019/02/22/docker-container-proxy/
- https://simpleapples.com/2019/04/18/building-docker-image-behind-proxy/
2. 创建container 并连接
docker run -d --name uxrdp --hostname terminalserver --shm-size 1g -p 13389:3389 -p 2222:22 xrdp_img
- docker 绑定了两个端口。
- 将 docker 的 3389 端口和 服务器的13389 端口绑定。 docker 的 3389 端口用于xrdp 连接。
- 将 docker 的 22 端口和服务器的 2222 端口绑定。 docker 的 22 端口用于 ssh 连接
- 因为主机的 3389 和 22 端口都是用于自己的xrdp 和 ssh连接,所以我们不能使用这两个端口,需要更换到 13389 端口(随便选择的)。当我们访问主机的13389 端口,相当于访问 docker 的 3389 端口
- docker 绑定了两个端口。
-
远程 ssh 连接, 绑定端口(端口映射)
ssh -L 3389:localhost:13389 xxx@xxxx ssh -L 3389:localhost:13389 -p 12222 xxx@xxxx
- 需要将 本地 3389 端口和 服务器的13389 端口绑定,即本地的3389 和 docker 的3389 绑定。
-
通过windows xrdp 就可以连接了。
- 默认user 和 密码都是
ubuntu
- 可以在dockerfile 中修改
- 默认user 和 密码都是
3. 后续使用
- 可以ssh 映射不同端口,选择不同的图形界面进行访问。
本地 xrdp 连接参数不用更改,非常方便。ssh -L 3389:localhost:3389 xxx@xxxx # 远程服务器 GUI ssh -L 3389:localhost:13389 xxx@xxxx # 远程 docker GUI
各种报错 😖
-
W: GPG error: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4B469963BF863CC
解决方法,在
apt update
之前删除 nivida 源RUN rm /etc/apt/sources.list.d/cuda.list RUN rm /etc/apt/sources.list.d/nvidia-ml.list
https://github.com/NVIDIA/nvidia-container-toolkit/issues/257
-
dpkg-buildpackage: warning: using a gain-root-command while being root
dpkg-buildpackage: error: gain-root-commmand 'fakeroot' not found
build docker 时报错。 在开始, 安装
fakeroot
.
RUN apt-get install -y fakeroot
-
2024-05-04 10:45:32.877 [error] Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/usr/bin/docker-entrypoint.sh": permission denied: unknown Error: failed to start containers: bc264b4a0d518933f5e7c306d26423282db0e657dcd6c17fab1d76eb519a3644
可以正常 build image,但是实例化 container 时,报错,提示权限不够。在dockerfile 中增加权限。
ADD bin /usr/bin RUN chmod +x /usr/bin/docker-entrypoint.sh # 新增权限