docker从零开始

docker从零开始

前言

实现电脑A从0创建docker镜像,安装各个论文代码所需要的conda环境后,上传到docker hub,电脑B下载该镜像,直接可使用所需conda环境来复现代码,只讲操作,理论不懂。

一、创建基础版本的docker镜像

首先,我们在电脑C中使用了zieghart/ncsn:ncsnbase_perfect的镜像,创建了名为fuck的容器,激活了里面的ncsn的conda环境,在此环境中直接可以跑ncsn的代码,如图:image.png

image.png

image.png

可以在自己windows电脑安装docker和docker desktop创建镜像,或直接在服务器上创建(已经安装好了docker),下文都在服务器上创建,因为已经创建了,懒得复现一遍,只给命令,没有截图。

1、去docker hub官网:https://hub.docker.com/注册账号,我的账号为:1073015375。

服务器输入命令来登录,并后续输入账号的密码:

1
docker login -u 1073015375

image.png

2、从hub下载基础版docker镜像

1
docker pull nvidia/cuda:11.3.1-devel-ubuntu18.04

下载完成后输入

1
docker images

可看到刚刚下载的镜像

image.png

变为自己的镜像,并上传到docker hub

输入

1
docker tag bc6c1a157465 1073015375/comparisons:comparison_code

将nvidia/cuda:11.3.1-devel-ubuntu18.04镜像复制改名为自己要叫的版本,我这为:1073015375/comparisons:comparison_code

其中1073015375是我的账号,comparisons是仓库名,comparison_code是TAG,一个仓库可以有多个TAG。

image.png

前面已经在命令行中login了docker账号了,就直接将该镜像上传到hub上

1
docker push 1073015375/comparisons:comparison_code

成功后,网页去hub查看,已经上传成功喽。image.png

二、下载docker hub需要的镜像

先把服务器刚刚创建的docker镜像删除,删除docker images的某个镜像

1
2
3
docker rmi ID  
或强制删除
docker rmi -f ID

确定删除成功后,从hub下载某镜像的某TAG,失败优先注意服务器是不是没联网!

1
docker pull 1073015375/comparisons:comparison_code

在docker images后发现有了该镜像。

开始将该镜像实例化,即创建一个和镜像一致的容器,映射好路径,容器取个名为:zwh。

1
docker run -it --gpus=all -p 8888:22 -v /home/lqg:/code --name zwh 1073015375/comparisons:comparison_code /bin/bash

只需要注意点:

  • 8888:22:8888为端口号,只需要docker ps -a来看其他容器用了什么端口,避开就行,7777或7878或8888什么都可以。
  • /home/lqg:/code:/home/lqg对应本服务器/home/lqg的路径,/code对应镜像的路径,docke镜像可看作是一台虚拟机电脑。以后进入镜像后,cd code,边对应cd /home/lqg了,且后续只能进/home/lqg内文件夹,不能进/home文件夹喽。故/home/lqg可改成服务器自己所需要的路径。
  • fuck:创建容器的名字,随便。
  • 1073015375/comparisons:comparison_code:服务器已经下好的镜像。

开启容器

1
docker start zwh

进入容器

1
docker exec -it zwh /bin/bash

看到命令行前缀变了,就进入成功。

三、安装conda环境

安装miniconda即可,注意,conda版本换成ncsn那个版本吧

1
2
3
4
apt update
apt install -y vim curl git telnet tmux unzip wget
wget https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-x86_64.sh
sh Miniconda3-py37_4.11.0-Linux-x86_64.sh

然后一路Enter,yes即可安装成功喽,输入

1
2
3
4
# 查看conda版本
conda --version
# 查看有几个conda环境,此时默认有个base环境
conda info --envs

创建名为ncsn的conda环境吧

1
2
3
4
5
6
# 创建名为ncsn,python版本为3.7.11的conda环境
conda create -n ncsn python==3.7.11
# 查看conda环境,应该有base和ncsn两个
conda info --envs
# 激活ncsn环境
conda activate ncsn

此时来讲,你的命令行前缀应该带有(ncsn),在ncsn这个conda环境后,就安装ncsn所需要的所有包、库了,找其他服务器一个一个下载就可以了,不掩饰。

但先别下载库,ncsn先空着,下面验证上传和下载是否有问题。

四、上传带有conda环境的镜像到hub并下载

到这里先理清镜像(image)和容器(container)的关系了,搞了几天问了师兄才理解一些。

首先输入

1
exit

退出docker,回到最初的位置

依次输入

1
2
docker images
docker ps -a

image.png

第一个红框名为comparison_code的镜像,第二个红框名为zwh的容器,其中comparison_code镜像是最初从docker hub下载的镜像,为基础版,没有conda。zwh容器则在comparison_code镜像基础上,还多安装了conda,此时comparison_code可理解为母体的虚拟电脑,zwh可理解为复制粘贴母体后的另一台电脑,且该电脑多安装了新的东西(conda),那么应该是要把安装新东西的电脑上传到hub上,以后别的服务器下载下来的才是带有新东西的镜像!。故要进行将容器打包为镜像操作

1
docker commit e41daa6397f6 1073015375/comparisons:comparison_test

注意点:

  • e41daa6397f6:即为docker ps -a查看到CONTAINER ID,是zwh的
  • 1073015375/comparisons:comparison_test:指明1073015375用户的comparisons仓库(一般不用改),comparison_test即为安装了conda的容器,打包成镜像的名字,如果继续叫comparison_code,那么和母体名字重复了,毫无疑问将覆盖点comparison_code这个母体镜像,就只剩下安装了conda的comparison_code镜像了,看你自己选择

我这里取名为comparison_test,就可以看到有两个镜像:comparison_test和comparison_code,注意到comparison_test的SIZE比comparison_code大,即comparison_test包含了安装的新东西,就说明zwh容器打包成了comparison_test这个镜像喽。

接着不用想了,把comparison_test镜像上传到自己hub上吧。

1
docker push 1073015375/comparisons:comparison_test

下载comparison_test镜像前,先删除原有的comparison_test镜像,方便验证。

1
docker rm -f  ID

确认没有comparison_test镜像后,继续下载吧

1
docker pull 1073015375/comparisons:comparison_test

下载完成后,就根据上面步骤,对comparison_test镜像这个母体,创建自己取名的容器吧,如zwh。

经典起手

1
2
3
4
5
docker run -it --gpus=all -p xxxx:22 -v /xxx/xxx:/code --name zwh 1073015375/comparisons:comparison_test /bin/bash

docker start zwh

docker exec -it zwh /bin/bash

此时进入了zwh容器,可以看到前缀(base),即说明这个镜像创建的容器,就是上面我们安装了conda版本的镜像,没毛病,继续可以看有几个conda环境,应该是可以看到有base和ncsn的(之前创建的conda环境)

后面就自己进ncsn环境,继续安装所需要的库、包即可了。以后接着重复exit退出docker,容器打包成新镜像,上传,下载到新服务器,新服务器接着创建容器,进ncsn容器,直接能用配好的环境了,实验室现有的代码就有相应的docker镜像和conda环境。

文章作者: CasimiBreidin
文章链接: https://blognotes.cn/posts/23720.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Casimi’Blog