需要基础知识

docker基础

ssh基础

CUDA基础

TensorFlow安装基础

 

TensorFlow GPU docker 安装

访问TensorFlow官网,查找需要安装的TensorFlow版本

https://tensorflow.google.cn/install/docker?hl=zh_cn

此日期的说明 Last updated 2021-01-29 UTC

GPU 支持
Docker 是在 GPU 上运行 TensorFlow 的最简单方法,因为主机只需安装 NVIDIA® 驱动程序,而不必安装 NVIDIA® CUDA® 工具包

安装 Nvidia 容器工具包以向 Docker 添加 NVIDIA® GPU 支持。nvidia-container-runtime 仅适用于 Linux。有关详情,请参阅 nvidia-container-runtime

Nvidia 容器工具包
https://github.com/NVIDIA/nvidia-docker/blob/master/README.md#quickstart

结构图

docker中看不到gpu使用用户_连线

在docker官网中查找需要下载的image,并下载到本地

https://hub.docker.com/r/tensorflow/tensorflow/tags?page=1&ordering=last_updated

此次安装的是 tensorflow/tensorflow    1.14.0-gpu    481cb7ea8826   23 months ago   3.51GB

列出镜像 docker images

runoob@runoob:~$ docker images           
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
training/webapp     latest              6fae60ef3446        11 months ago       348.8 MB
tensorflow/tensorflow 1.14.0-gpu        481cb7ea8826        23 months ago       3.51GB
REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

创建容器

docker run --gpus all -it tensorflow/tensorflow:1.14.0-gpu bash #启动基本container

#在启动container可以加入很多参数,实现端口映射,指定显卡GPU,自启动等诸多功能
 docker run --gpus  "device=2" -it  -p  8001:22  -p  8002:6000  -p  8003:6006  --name tensorflow gpu  -v /data/mount_docker:/data  tensorflow/tensorflow:1.14.0-gpu-ssh /usr/sbin/sshd -D

--gpus  "device=2"  #指定container使用的GPU,GPU编号用nvidia-smi查看
-p  8001:22 #端口映射,container 22映射到本机 8001,需要注意顺序,可以同时写多个映射
--name tensorflow gpu #为这个container命名
-v /data/mount_docker:/data  #将container /data目录挂载到本机 /data/mount_docker,需要注意顺序
#注意! 挂载后,在container目录中修改会影响本机此目录下内容,两个目录是同步关系
tensorflow/tensorflow:1.14.0-gpu-ssh /usr/sbin/sshd -D  #开启ssh服务并设置自启动

 

docker exec -it a6cb143e753a #进入相应container

#会出现以下画面
________                               _______________                
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ / 
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

root@a6cb143e753a:/# 


用python测试GPU是否可用
import tensorflow as tf
tf.test.is_gpu_available()

进入container

docker exec -it b2de9de8396f /bin/bash

安装vim和yum

#在container中缺少一些插件需要自己安装
#container为Ubuntu所以用apt-get

apt-get update
apt-get install vim
apt-get install yum
apt install iputils-ping

 

ssh连接container

在container中安装ssh插件

安装完成后进入 vi /etc/ssh/sshd_config ,修改为可以远程ssh登录

vi /etc/ssh/sshd_config

#配置为
#PermitRootLogin prohibit-password
PermitRootLogin yes

#配置完成后需要激活
/etc/init.d/ssh restart

修改container密码,此密码同为ssh远程密码

root@a6cb143e753a:/# passwd
Enter new UNIX password: 
Retype new UNIX password:
#连接container
#输入密码
ssh -p 8001 root@172.16.77.107

 

问题

如果无法登录,考虑防火墙是否开启ssh端口,container默认是端口22,映射到了本机8001,则需要开放本机8001端口

参考上面设置 -p  8001:22

firewall-cmd --permanent --add-port=8001/tcp
firewall-cmd --reload

 

在docker重启后有时会无法ssh,需要进入container运行 /etc/init.d/ssh restart
可以在创建container时加入自启动,就无须上述步骤

#加入创建container参数中
tensorflow/tensorflow:1.14.0-gpu-ssh /usr/sbin/sshd -D

补充

netstat -tunlp  查看所有使用中的端口

-a 显示所有连线中的Socket 
-A 列出网络类型连线中的相关地址
-c 持续列出网络状态
-C 显示路由器配置的快取信息
-e 显示网络其他相关信息
-g 显示多重群组名单
-l  显示监控中的服务器的socket 
-n 直接使用ip 地址,不通过域名服务器
-N 显示网络硬件外围设备的符号链接名称
-p 显示正在使用Socket 的程序识别码和程序名称
-t  显示TCP 传输协议的连线状况
-u  显示UDP 传输协议的连线状况
-x  --unix


#pip升级
python -m pip install -U pip

 

 

dockerfile参考

docker中看不到gpu使用用户_连线_02

 

 

 

reference

https://www.jianshu.com/p/658911a8cff3

https://www.runoob.com/docker/docker-tutorial.html

https://hub.docker.com/r/tensorflow/tensorflow/