docker从零开始
前言
实现电脑A从0创建docker镜像,安装各个论文代码所需要的conda环境后,上传到docker hub,电脑B下载该镜像,直接可使用所需conda环境来复现代码,只讲操作,理论不懂。
一、创建基础版本的docker镜像
首先,我们在电脑C中使用了zieghart/ncsn:ncsnbase_perfect的镜像,创建了名为fuck的容器,激活了里面的ncsn的conda环境,在此环境中直接可以跑ncsn的代码,如图:
可以在自己windows电脑安装docker和docker desktop创建镜像,或直接在服务器上创建(已经安装好了docker),下文都在服务器上创建,因为已经创建了,懒得复现一遍,只给命令,没有截图。
1、去docker hub官网:https://hub.docker.com/注册账号,我的账号为:1073015375。
服务器输入命令来登录,并后续输入账号的密码:
1 | docker login -u 1073015375 |
2、从hub下载基础版docker镜像
1 | docker pull nvidia/cuda:11.3.1-devel-ubuntu18.04 |
下载完成后输入
1 | docker images |
可看到刚刚下载的镜像
变为自己的镜像,并上传到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。
前面已经在命令行中login了docker账号了,就直接将该镜像上传到hub上
1 | docker push 1073015375/comparisons:comparison_code |
成功后,网页去hub查看,已经上传成功喽。
二、下载docker hub需要的镜像
先把服务器刚刚创建的docker镜像删除,删除docker images的某个镜像
1 | docker rmi 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 | apt update |
然后一路Enter,yes即可安装成功喽,输入
1 | # 查看conda版本 |
创建名为ncsn的conda环境吧
1 | # 创建名为ncsn,python版本为3.7.11的conda环境 |
此时来讲,你的命令行前缀应该带有(ncsn),在ncsn这个conda环境后,就安装ncsn所需要的所有包、库了,找其他服务器一个一个下载就可以了,不掩饰。
但先别下载库,ncsn先空着,下面验证上传和下载是否有问题。
四、上传带有conda环境的镜像到hub并下载
到这里先理清镜像(image)和容器(container)的关系了,搞了几天问了师兄才理解一些。
首先输入
1 | exit |
退出docker,回到最初的位置
依次输入
1 | docker images |
第一个红框名为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 | docker run -it --gpus=all -p xxxx:22 -v /xxx/xxx:/code --name zwh 1073015375/comparisons:comparison_test /bin/bash |
此时进入了zwh容器,可以看到前缀(base),即说明这个镜像创建的容器,就是上面我们安装了conda版本的镜像,没毛病,继续可以看有几个conda环境,应该是可以看到有base和ncsn的(之前创建的conda环境)
后面就自己进ncsn环境,继续安装所需要的库、包即可了。以后接着重复exit退出docker,容器打包成新镜像,上传,下载到新服务器,新服务器接着创建容器,进ncsn容器,直接能用配好的环境了,实验室现有的代码就有相应的docker镜像和conda环境。