第一次在实验室服务器上用docker封装镜像,把整个流程梳理如下
基本流程都是按照这篇博客走的Docker 封装anaconda环境,生成镜像并打包,纯小白一文读懂(二)_豆蔻二八的博客-CSDN博客
1. 拉取镜像
sudo docker pull continuumio/anaconda3
但是使用该命令会遇到报错: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers),也就是网络问题,尝试根据网上的教程更改镜像源:https://blog.csdn.net/u012081441/article/details/104553145
但最终同样报错,后来发现是由于服务器本身网络问题,因为目前服务器A是使用另一台B作为代理来上网,所以导致A上无法下载这个镜像(具体原因也不知道)。解决方法就是在B上拉取镜像,指令和上面一样。然后将镜像保存到一个tar文件中,指令如下:
sudo docker save continuumio/anaconda3 -o image.tar
其中image.tar为自定义的文件名。再使用scp指令将该文件中B传到A即可(同样需要sudo)。
在A上还需要对tar文件解压缩,如下:
sudo docker load -i image.tar
2. 创建容器
sudo docker run --name temp -idt continuumio/anaconda3
其中temp是自定义的容器名。创建容器后我们使用如下指令就可以进入容器:
sudo docker exec -it temp /bin/bash
再使用exit指令或者ctrl+d即可退出容器。
3. 拷贝环境以及代码
进入容器后我们可以查看容器中的conda目录:
conda info --envs
一般情况下目录是在/opt/conda下。接下来我们需要将我们的conda环境拷贝到这个目录下
sudo docker cp ${your_env_path} temp:/opt/conda/envs
其中${your_env_path}是你的环境目录,比如/home/xxx/anaconda3/envs/env1。
然后我们可以使用同样的方法将代码文件夹拷到容器中
sudo docker cp ${your_code_path} temp:/root/
4. 保存镜像并获取压缩包
使用如下命令将上述的容器temp保存为服务器上的镜像
sudo docker commit -a 'author' -m 'instruction' temp image_temp
使用docker images指令即可在镜像列表里看到image_temp的镜像,然后我们使用和第1步中一样使用docker save指令将镜像保存到tar文件中,这个tar文件就是我们要的打包后的镜像文件。
注:tar文件没有对镜像做任何压缩,因此可能会很大。如果想要减小该文件大小,有两个办法,其一是减少环境文件夹的大小,比如删掉其中一些没用的库;其二是对tar文件进一步压缩,这样做最直接,效果也最显著。