引子
目前docker容器非常火爆,许多公司已经将docker作为开发和生产环境部署的重要环节,docker的学习不可避免。同时,由于家中和公司一共4台电脑+N台服务器,每一台都要配置环境,相当繁琐,docker的功能正好满足我们在不同环境可以轻松进行开发和测试的需求。因此,我将自己学习、安装、应用docker的过程分享出来,以供读者借鉴,少走弯路。
测试主要是在Windows10系统上进行,目的是在Docker上创建一个Centos系统,然后安装2.7和3.6两个版本的Python,以便日后的机器学习和深度学习的需求。
Docker本身的安装不再赘言,去下载一个docker toolbox目前看来是最快的。在我的windows系统上,不需要安装docker或VM VirtualBox,直接运行docker toolbox即可进入Docker环境。
CentOS环境搭建
1. 从docker-cn安装CentOS系统
为了更快速pull到image(镜像),一种是翻墙下,一种是通过国内的镜像下载,这里推荐直接使用docker-cn的镜像。
docker pull registry.docker-cn.com/library/centos
2. 进入容器(Container)内部看一下,并退出
docker run -it registry.docker-cn.com/library/centos bash
ctrl-d
3. 创建image
这步可以晚点做,但为了使我们调用便捷,我们先创建一个image。377为container id的前三位,一般前三位即已足够。
docker commit 377 server-centos
4. 正式进入CentOS系统
docker run -it risk-ml/centos-python bash
5. 安装必要的包
为了进一步的安装,以及之后的步骤减少反复,这里讲大致需要的包先统一安装完。以后如果发现缺了,还需要yum install补充,有些还需要后续的编译和安装才能奏效。
yum install wget gcc make zlib-devel git
yum install readline-devel openssl-devel
yum install bzip2-devel ncurses-devel sqlite-devel gdbm-devel xz-devel tk-devel
6. 下载Python3源码
CentOS自带的是Python2.7,Python3以上的版本需要自己安装。
在线下载python3.6的压缩包,这个速度到是挺快的。
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
7. 解包、解压缩
xz -d Python-3.6.1.tar.xz
tar -xvf Python-3.6.1.tar
8. 配置
cd Python-3.6.1
./configure --prefix=/usr/local/python3.6 --enable-optimizations
--prefix 是预期安装目录,--enable-optimizations 是优化选项(LTO,PGO 等)加上这个 flag 编译后,性能有 10% 左右的优化(如果没记错的话),但是这会明显的增加编译时间。
9. 编译、安装
make
make install
注意,有时候发现缺少了一些包,在重新yum了之后,需要重新进行configure和make install
10. 命令映射
这个步骤是为了以后操作更简便,我们将python3的命令映射到环境变量的path中,可以直接调用,省去了指定路径。同时避免了在同时有python2和python3的环境中的版本指定问题。
ln -s /usr/local/python3.6/bin/python3 /usr/bin/python3
ln -s /usr/local/python3.6/bin/pip3 /usr/bin/pip3
当我们需要通过python2运行脚本或安装包时,只需要执行:
python script.py
pip install pandas
当我们需要通过python3运行脚本或安装包时,只需要执行:
python3 script.py
pip3 install pandas
至此,Centos内部的环境基本搭建完毕,已经可以使用python了,我们可以通过python --version和python3 --version查看版本号以确认。
Python环境搭建
1. python2安装pip
因为原装的Python2.7没有pip,我们需要安装一下,具体不再赘述
yum install epel-release
yum install python-pip
2. python2安装matplotlib
这一步放在最前面,是因为碰到了些问题。注意,此处没有用pip安装,而是用yum安装,并且需要预装一些依赖包
yum install freetype freetype-devel python-freetype
yum install libpng libpng-devel python-pypng
yum install python-matplotlib
虽然matplotlib已经安装完毕,但还是有一些问题暂时没得到解决。我们import matplotlib没有问题,但是pyplot的调用会引发报错。
最简单的解决办法是在使用pyplot的脚本中加上use('Agg'),问题即可解决
import matplotlib
matplotlib.use('Agg')
from matplotlib.pyplot import *
3. 安装xgboost
在安装xgboost过程中,容易碰到各种问题,特别是安装0.60以上的版本。
各种尝试后,最有效的是通过git clone github上的xgboost进行安装。
# 提前安装一些依赖包
yum install gcc gcc-c++
yum install lapack lapack-devel blas blas-devel# 下载xgboost源码,并编译
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
git submodule init
git submodule update
make -j4# 到路径下直接进行安装,Python2和Python3都安装一下
cd python-package/
python setup.py install
python3 setup.py install
4. 安装tensorflow和keras
如果在深度学习方面有要求的话,可以顺便装一下keras和tensorflow。
整体都没什么问题,中间缺少的依赖包也可以提前装一下
pip install np-utils
其他Docker操作
既然要用Docker,一切实用且必要的操作我在这里也简单介绍一下
1. 文件映射
当我们在主机上已经有一些脚本或者文件,希望通过Centos中的Python环境去执行或读取。
此时,需要将本地的文件夹在远程端做一个同步的映射。
docker run -it -v /home/me/docker/project1:/usr/me/project2 server-centos bash
- 在本地(或者是服务器)创建文件的存放目录: /home/me/docker/project1
- 在docker的container中创建同步的目录:/usr/me/project2
通过上面的命令可以做文件夹的映射,执行上面的run命令之后,会运行镜像,并且在CentOS的/usr/me/project2路径下会自动包含所有本地/home/me/docker/project1中的文件。
当然,如果中间隔的中间服务器太多,我们还需要先将文件进行传输(复制),接下来会讲到。
2. 服务器之间的文件传输
经常地,我们要在Windows和Linux服务器之间或者两个linux服务器之间进行文件传输,我们分开介绍。
2.1. Windows与Linux服务器之间
推荐XFPT,可以直接进行界面化操作,这里不做详细展开。
2.2. Linux服务器之间(有密码)
scp -r /home/me/docker/project1 me@xxx.xx.xxx.xx:/usr/me/project2
会将整个project1文件夹拷贝到project2文件夹中,默认是需要输入登录密码的
2.3. Linux服务器之间(无密码)
如果希望无密码登录,需要通过ssh传输
server A
进入用户目录: cd /home/me
创建.ssh目录: mkdir .ssh
进入.ssh目录: cd .ssh
生成密钥对: ssh-keygen -b 1024 -t rsa
server B
进入用户目录: cd /usr/me
创建.ssh目录: mkdir .ssh
进入.ssh目录: cd .ssh
创建新文件: touch authorized_keys
server A
Key授权:scp -p .ssh/id_rsa.pub me@xxx.xx.xxx.xx:/usr/me/.ssh/authorized_keys/authorized_keys
将A生成的id_rsa.pub放到B上的授权key文件中
server A
无密码传输:scp -r /home/me/docker/project1 me@xxx.xx.xxx.xx:/usr/me/project2
需要注意,因为传输中没有指定key的位置,因此,最后执行scp操作时需要在包含.ssh文件夹的目录下
3. 镜像的保存与转移
当我们有一份完整的比较好的镜像,希望可以在别的服务器上使用,通常有两种方式:
- 上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的,所以如果使用仓库的方式,只能自己搭建私有仓库(private registry)
- 将镜像保存为文件上传到其他服务器再从文件中载入镜像
具体实现方式如下:
# 存储成压缩包
docker save server-centos > /home/me/server-centos.tar
# 使用ssh等方法传输文件之后,通过压缩包解压:
scp -r /home/me/server-centos.tar me@xxx.xx.xxx.xx:/usr/me
docker load < /usr/me/server-centos.tar
docker images
作者: 奥拉基爾
2018 年 01月 11日
参考目录
- https://segmentfault.com/a/1190000009922582
- http://blog.csdn.net/u011860731/article/details/46534321
- http://blog.csdn.net/dream_angel_z/article/details/46955705
- http://blog.csdn.net/levy_cui/article/details/60573520
- https://github.com/dmlc/xgboost/issues/909
- https://www.cnblogs.com/saolv/p/6963314.html
- http://www.linuxidc.com/Linux/2015-01/111894.htm