前言
以前在跑代码时,自己写了一个Dockerfile可基于现成CUDA和Cudnn版本自动构建相应环境。但是由于需要快速部署多个程序的环境进行实验,使用以前的Dockerfile不够灵活,很容易出错 (如Ubuntu版本更换等因素),故记录一个基础配置 (基于Ubuntu镜像),并配置基础环境,保证以下几点:
- 使用国内镜像源;
- 保证可通过端口远程连接容器;
- 可快速部署python环境;
- 进入docker环境可自动进入虚拟环境;
基于以上需求,我配置一个初始环境,该初始环境会被保存为镜像,方便以后快速搭建针对不同项目的容器。
一、配置apt
1.1 更新apt源
a) 更新apt源之前,先安装一些必要包
如果环境来自Docker的Ubuntu镜像,则初始创建容器可能缺很多包,需要在换源前先安装几个必要的包。
apt update
# 安装vim
apt install vim
# 安装apt对https的支持
apt install apt-transport-https ca-certificates
接下来修改/etc/apt/sources.list文件:
# 备份
mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 重写/sources.list
vim /etc/apt/sources.list
将新的apt源的路径覆盖到新的文件中。apt源的内容需要跟系统版本对应上,清华源可直接参考官方帮助文档选择合适版本查看要覆盖的文本内容。
完成覆盖后,重新更新apt
apt update
b) 根据需要安装必要的包
安装编译相关的包:
apt-get install build-essential make checkinstall libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev -y
安装工具类的包:
apt-get install vim wget git curl tmux ranger bc openssh-server -y
[ssh配置] 如果在Docker环境下,安装了SSH,写希望外部通过端口远程连接,执行如下配置 (注:请确保在docker run创建容器时使用了-p选项设置了端口映射):
sed -i 's,#PasswordAuthentication no,PasswordAuthentication yes,' /etc/ssh/sshd_config
sed -i 's,#PermitRootLogin prohibit-password,PermitRootLogin yes,' /etc/ssh/sshd_config
service ssh start
在ssh时,需要设置用户密码,可默认设置如下 (Docker 中默认用户为root)
echo 'root:root' | chpasswd
也可自行设置密码
passwd <用户名>
二、配置anaconda环境 (Python环境配置)
a) 安装anaconda3
其实在Docker容器下,可以直接安装python,不过在anaconda下安装包比较方便,故使用anaconda。
安装Anaconda我推荐直接按照官方文档安装,不容易出问题,安装步骤这里略过。
(吐槽:安装anaconda时要读安装条款,必须按回车一行一行读,按回车按快了很容易最后按错选项直接退出安装,无语)
安装路径默认为~/anaconda3,我的个人喜好是安装到~/app/anaconda3下。
注意事项:
- Anaconda官方文档推荐安装时在"选择是否执行conda init"时选择"yes";
- 如果选择yes,安装后运行source ~/.bashrc即可完成安装;
b) 换源
可直接查看清华源帮助文档直接修改换源。
c) 其他配置
如果创建了一个虚拟环境,如my_env。则可以在~/.bashrc中添加一行
# 在~/.bashrc下添加
source activate my_env
这样以后默认都使用该环境。
三、Docker初始化设置及保存镜像
a) 初始化设置
为了在进入容器时自动执行一些命令,可以把一些命令提前写入~/.bashrc中,这样已进入bash就会默认执行相关命令。
# 以下内容写到~/.bashrc里
# 设置默认进入的目录
cd ~
# 设置默认启动ssh
service ssh start
# 设置默认进入anaconda环境
source activate my_env
注:由于启动容器后ssh并不会默认打开,这会导致每次重启容器后都要手动开启ssh服务。因此推荐直接将开启ssh服务写到~/.bashrc中;
b) 保存并导出Docker镜像
# 关闭容器
docker stop <容器名 或 容器id>
# 提交镜像
docker commit <容器名 或 容器id> <新镜像名>
# 导出镜像
docker save -o <镜像名.tar> <镜像名 或 镜像id>
之后可快速迁移镜像到其他主机,并快速部署环境。