一、流程如下:
1,首先服务器创建docker的时候需要使用-p将服务器的p0(如6007,也可以和p1一样)映射到docker容器里面的端口p1(一般用6006,因为tensorboard默认端口是6006)
2,通过-p将服务器p2端口映射到容器的22端口
3,在容器里的命令行启动tensorboard,tensorboard --logdir=your path --bind_all --port p1,我这边发现不加--bind_all会失败(有时不会),--port可以不用添加,默认使用6006
3,在windows上使用ssh命令添加隧道,通过本地端口号p3访问p0,最终达到访问p1(因为p0被映射到了p1),也可以通过图形化界面工具如mobaxterm,这个工具和xshell类似,挺好用的还免费
4,在windows的浏览器里面输入http://localhost:p3或者http://127.0.0.1:p3
二、具体流程
1,创建docker
a),docker run -d -it --name tb -p 10010:22 -p 6007:6006 -v $PWD:/data ubuntu bash
b),docker exec -it tb bash 因为是用的后台启动容器,因此需要在通过这行命令才能进入容器
-d: 后台运行容器,并返回容器ID
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name: 给容器取个别名
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-v: 挂载本地目录至容器中, 格式: -v <host_path>:<container_path>
这里注意有两个端口映射,将服务器的6007端口(p0)映射到容器内的6006端口(p1)(这个端口号是为了让容器里面tensorboard进程的端口号和服务器进行通信)
将服务器的10010端口(p2)映射到容器的22端口(这个端口号是为了让ssh能连进去docker),
c),docker里面的用户名为root,修改其密码,并启动ssh服务
- passwd
- 输入密码
- 首先检查容器内部是否以安装 openssh-server与openssh-client 若没安装执行一下命令安装
- apt-get update
- apt-get install openssh-server
- apt-get install openssh-client
- 修改SSH配置文件以下选项
- vim /etc/ssh/sshd_config
- 修改后的内容如下:
- # PermitRootLogin prohibit-password , 默认打开 禁止root用户使用密码登陆,需要将其注释(在前面加个#号,如果有了表示已经注释)
- RSAAuthentication yes ,启用 RSA 认证
- PubkeyAuthentication yes ,启用公钥私钥配对认证方式
- PermitRootLogin yes ,允许root用户使用ssh登录(最主要)
- /etc/init.d/ssh restart
- exit
d),测试ssh是否可以用,在服务器里面操作
ssh root@127.0.0.1 -p 10010,输入c)中修改的密码
exit 退出容器
2,在容器里的命令行输入,tensorboard --logdir=your path --bind_all --port p1,步骤2和步骤3顺序可以颠倒,其中--port p1也可以不用添加,直接使用默认的6006
3,建立隧道
方法一:在xterm工具中操作,该方法不需要每次都输入ssh命令了
a) Tools->MobaSSHTunnel(port for warding)->New SSH tunnel
b)输入对应的信息然后点save,可能需要添加ssh认证点yes即可,输入远程服务器用户名对应的密码,如果填写的是docker内账号root,则输入前面修改的root对应的密码
c)具体填写实例
需要输入passwd修改后的密码
或者
需要输入服务器用户名的密码
方法二:windows的命令行操作:
a)在windows环境使用win键+r,然后输入cmd
b)然后输入ssh命令
ssh -L 6008:10.128.8.141:6007 root@10.128.8.141 -p 10010
该命令解释如下:windows本地启动6008端口[p3端口]通过10.128.8.141上开放的10010端口[p2端口](该端口已经映射到了docker内部的22端口,实际上是通过docker内进行转发的),使用docker内用户root转发到服务器ip为10.128.8.141的6007端口[p0](该端口已经被映射到docker内的6006端口[p1端口],实际上是转发到docker内的6006)
输入yes,密码是服务器用户名为passwd修改后的密码
【注】关于ssh命令中的-L,-R,-D的区别SSH 命令的三种代理功能(-L/-R/-D) - 知乎
本地端口通过跳板映射到其他机器
HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行:
HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC user@HostB
这时访问 HostA:PortA 相当于访问 HostC:PortC。
这种用法一般本地就是 HostA,访问本地的 PortA,数据被 ssh 加密传输给 HostB 又转发给 HostC:PortC。
或者
ssh -L 6008:10.128.8.141:6007 yckj3250@10.128.8.141
这里没有添加-p的原因是服务器默认使用22端口进行ssh通信
该命令解释如下:windows本地启动6008端口[p3端口]通过10.128.8.141上用户yckj3250转发到服务器ip为10.128.8.141的6007端口[p0](该端口已经被映射到docker内的6006端口[p1端口],实际上是转发到docker内的6006)
exit退出ssh连接
如果在win命令行报错Bad local forwarding specification... 解决方法:命令粘过来的空格有问题,先粘到记事本等地方转为纯文本,再粘过来就OK了或者重新手打
4,windows浏览器输入http://localhost:6008/或者输入http://127.0.0.1:6008/回车即可