docker和conda,docker是干嘛用的
Docker: 使用jupyter notebook基础镜像搭建自己的 pytorch 开发环境
启动最基本的jupyter notebook镜像:
使用基础镜像 jupyter/datascience-notebook ,因为它预装了常用的模块:pandas, matplotlib, scipy, seaborn, scikit-learn, scikit-image, sympy, cython, patsy, statsmodel, cloudpickle, dill, numba, bokeh;
dockerrun-it--rm -p 8888:8888 jupyter/datascience-notebook:281505737f8a
1
其中?
docker run是使用一个镜像生成一个运行的容器;
-it指交互模式,启动后终端在运行着的容器里面,与之对应的有-d后端运行模式,启动后终端交互在实体机,要想进入容器需要使用命令docker exec -it container-name bash?docker exec -it container-name意为交互模式进入正在运行的一个容器,bash意为进入容器后使用的命令,这里用的是bash,这样进入容器后就能执行shell;
--rm意为退出shell的时候自动删除容器,常在测试的时候使用,这样不用每次修改去删除已有的容器;
-p 8888:8888指的是端口映射,前面的是实体机的端口,后面是容器里面暴露出的端口,两边端口可以不一样,这样同一个镜像可以启动多个对应不同端口的服务;
jupyter/datascience-notebook:281505737f8a是镜像名字,冒号后面的是tag,类似于版本的概念,如果不显式的给出tag每次都回从hub上拉取latest的镜像,如果网络环境不好的话比较费时间,推荐显式给出tag,这样每次构建都会使用已有的镜像。
启动后就可以在终端看到:
[I 04:01:05.691 NotebookApp] Running the core application with no additional extensions or settings
[I 04:01:05.692 NotebookApp] Serving notebooks from local directory: /home/jovyan
[I 04:01:05.692 NotebookApp] 0 active kernels
[I 04:01:05.692 NotebookApp] The Jupyter Notebook is running at:
[I 04:01:05.692 NotebookApp] http://[all ip addresses on your system]:8888/?token=0a3331628e0e35f94eb0ad543faeb3e396fbccfa3ff06e5a
[I 04:01:05.692 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 04:01:05.692 NotebookApp]
? ? Copy/paste this URL into your browser when you connect for the first time,
? ? to login with a token:
? ? ? ?
此时是停在容器里面,打开浏览器 访问?即可打开基本的jupyter notebook 环境,后面的token是随机生成的;
启动带权限的容器
生成自定义token
# Python脚本生成密码i
# Python脚本生成密码
import IPython
IPython.lib.passwd()
输入密码生成token
test的token:sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563
自定义token运行容器:
docker run -d -p 8888:8888 jupyter/datascience-notebook start-notebook.sh --NotebookApp.password='sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563'
这时访问会出现输入密码的页面,输入正确的密码才能进入jupyter。
共享目录
-v参数
docker提供-v参数使实体机和容器共享目录,这对于有状态的服务很有用,目录挂载添加参数:?
-v /home/jason/jason/docker/notebook:/home/jovyan/work
运行带有目录共享的容器
docker run-it--rm-p8888:8888-v/home/jason/jason/docker/notebook:/home/jovyan/work? jupyter/datascience-notebookstart-notebook.sh--NotebookApp.password='sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563'
这样在jupyter里新建的notebook都会出现在实体机指定的目录里。由于这个镜像的原因 需在work目录下新建才能在实体机看到。
基于jupyter/datascience-notebook 生成pytorch image
Dockerfile
因为没有合适的pytorch镜像,自己编辑Dockerfile:
新建文件Dockerfile并编辑内容:
FROM jupyter/datascience-notebook:281505737f8a
MAINTAINER Jason.W. "jianchengss@163.com"
# 下面是按官网的方法安装spotlight
#RUN pip --no-cache-dir install --upgrade install
#RUN pip --no-cache-dir install --upgrade torchvision
# pytorch
RUN conda install pytorch torchvision -c soumith
# spotlight()
RUN conda install -c maciejkula -c soumith spotlight=0.1.2
build
在Dockerfile目录里运行命令:docker build -t jianchengss/datascience-pytorch:0.1 .?
这样就生成了image:jianchengss/datascience-pytorch:0.1可以运行docker images查看本机上所有的image。
从构建的镜像运行容器
docker run-it--rm-p8888:8888-v~/workspace/python/notebooks-pytorch:/home/jovyan/work--privileged=truejianchengss/datascience-pytorch:0.1start-notebook.sh--NotebookApp.password='sha1:6587feaef3b1:6b243404e4cfaafe611fdf494ee71fdaa8c4a563'
最终容器
经过以上步骤,测试完成后既可以执行最终运行的命令 注意 token换成自己的
docker run-d-p8588:8888-v~/workspace/python/notebooks-pytorch:/home/jovyan/work--privileged=true--name=pytorch jianchengss/datascience-pytorch:0.1start-notebook.sh--NotebookApp.password='sha1:7aee2f913c8e:17d40f203cbd5c9820f302894a92724c3de9fba6'
-it --rm?换成了?-d,比之前多的参数有:
--name=pytorch,意为给container取一个名字,好区分和管理,缺省的话名字为一串随机的字符串。
--privileged=true出现文件夹访问权限的时候添加该属性
此时运行docker ps即可查看运行着的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bd3e30e9ab3? ? ? ? jianchengss/datascience-pytorch:0.1? "tini -- start-notebo"? 4 seconds ago? ? ? Up 3 seconds? ? ? ? 0.0.0.0:8588-8888/tcp? pytorch
进入容器操作
容器启动后有时候需要进入容器操作,比方说查看信息或者安装新的软件,此时执行docker exec -it pytorch bash
其他命令
docker stop container-name # 停止运行着的容器
docker rm container-name # 删除已有的容器,要先停止
docker rmi image-name # 删除已有的镜像
[conda] 查看软件依赖关系
不同版本的tensorflow 对 Keras 和 numpy 有不同的版本依赖
可惜没有相关信息
查看 List of Available Environments
得到灵感 到docker hub 上找 tensorflow 的镜像,查看 dockerfile 确定最新版本的 对应关系
参考:
List of Available Environments
win10环境安装numpy,tensorflow,keras及版本对应关系
conda查看某个安装包的依赖项
Docker制作Ubuntu的Python环境镜像
写入
使其生效
写入:(或从这里粘贴 )
再执行
用 apt 装的是 python3.8 , conda 太大了,装完容器4个G,用这个才500M。
用源码安装python3.9太麻烦,自己装ssl环境容易配错。
一般用python3.8也够用了,你说呢?
如果需要Python虚拟环境,再安装 venv
输入:(注意最后一项的路径,因为容器的根目录可能会做-v映射,所以不要存在/root中)
生效环境变量
命令行前面出现base则成功
修改:
因为容器的根目录可能会做-v映射,所以备份.bashrc和.profile。
生成新容器可以直接把这两个文件拷贝到/root里。
选择地区:亚洲Aisa,选择城市:上海ShangHai
nginx 或 service nginx start (这个是启动命令,因为不已 root 权限启动容器,所以要手启)
service nginx stop (关闭)
到此Ubuntu的Python环境已经做好
退出容器
关闭容器
生成镜像env_python38_ubuntu2004的1.0版本
可以查看这篇文章: Docker导入镜像并生成容器
利用好conda构建环境,处理不同版本软件的冲突
一台服务器,如果安装的软件多了,难免会各种冲突,好在docker和conda都可以解决这个问题
docker运行麻烦一点,还是优先从conda入手
安装软件时候,优先安装能解压直接用的那种,其次考虑安装到conda环境中,再次考虑直接conda install XX,把它装到miniconda3/bin里,最后可以考虑使用 configure make 这种安装方式