FileName: Docker.md
Auther: alvinszhang
Email: [email protected]
CreateDate: 2021-10-20
学习Docker的原因:这样一个场景,你打算学习 Machine Learning
、Deep Learning
等等,但是不想把电脑本地的环境变量搞乱,或许可以通过Anaconda去创建虚拟的Python环境,但是这样依然是在本地电脑创建的Python环境,治标不治本,而且也可能有卸载不干净的问题φ(* ̄0 ̄)。
现在我们来看一下Docker,我们可以用它创建不同版本Python的镜像(Image),基于镜像还可以创建互相隔离的容器(Container),然后在容器中进行编程环境的配置。
关键词:Docker、镜像Image、容器Container、Dockerfile、Python、Centos、Linux
安装比较简单,大家按照自己的操作系统,在Docker官网下载对应的版本就行了,在官网先注册账号登陆进去,然后会自动跳转到Docker Hub,然后在这里下载安装Docker。
安装好之后,可以在终端输入 docker
查看是否安装成功。
docker的指令有很多,我这里就介绍一下常用的指令,其他的指令你可以查看文档去学。
docker pull {image:tag} #拉取镜像
docker images #查看镜像
docker ps -a #查看容器
docker rm -f {CONTAINER ID} #删除容器
docker rmi {IMAGE ID} #删除镜像
docker run -dit {IMAGE ID} #镜像创建容器
docker exec -it {CONTAINER ID} /bin/bash #进入容器
Ctrl+P+Q #退出容器
下面我们就会简单上手。
在Docker Hub查看各种各样的镜像(Image),然后选择你喜欢的镜像,使用指令 docker pull {image:tag}
获取。这里我们以ubuntu镜像为例。
找到ubuntu镜像,建议选择特定版本的Tag,例如 ubuntu:21.04
。
然后在终端运行 docker pull ubuntu:21.04
。
依次在终端执行以下命令:
docker pull ubuntu:21.04 #获取镜像
docker images #查看镜像的{IMAGE ID}
docker run -dit {IMAGE ID} #镜像创建容器
docker ps -a #查看容器的{CONTAINER ID}
docker exec -it {CONTAINER ID} /bin/bash #进入容器
# {随意操作一下试试,例如pwd、cd等等}
exit #退出容器
可以发现这是一个极简的ubuntu系统,其中没有python环境,甚至没有vim工具,我们是无法在如此“干净”的系统中进行开发的,那我们需要手动一步步的去安装我发所需要的工具,那这样岂不是很麻烦,有没有什么办法是可以直接创建一个已经符合自己开发环境的镜像呢?这样的话,我直接用这个镜像创建出来的容器就直接可以用于开发了,不需要在容器中一步步的配置开发环境。Dockerfile,它就可以解决我们这个疑问!
大家可以先简单浏览一下教程,Dockerfile 菜鸟教程,然后我这里以centos7镜像为基础镜像,构建一个带有python3.8.12的环境的简单镜像。下面附上dockerfile内容与实践。
此链接为dockerfile,点击可以查看,简单理解一下里面的语法,把它下载下来。
这里需要一些终端的操作知识,首先将dockerfile放到本地文件夹里,然后 cd {dockerfile_path}
,然后在此目录下终端输入 docker build -t centos7:1.0.0 -f ./centos7.dockerfile .
,这个文件目录要注意一下,可以看下我下面放的截图参考一下,然后等待它build完成。
然后在上一部分那样,简单尝试一下,先列出镜像、再创建容器、最后进入容器,在终端输入vim,发现这个镜像创建的容器按照我们的dockerfile创建得很成功!
也有python3环境,dockerfile里也安装了python3的pandas、numpy等库。
我们使用dockerfile打造了个性化的镜像,那么如果想把这个镜像分享给别人呢?别人也得按照dockerfile创建一遍,这样显得有些麻烦。这个时候我们就可以把创建好的镜像上传到Docker Hub,然后别人仅仅需要执行一句 docker pull {image:tag}
就可以直接克隆下来你的镜像,这样就很方便。
首先得在Docker Hub创建一个仓库,用来存储自己制作的镜像。
在终端执行以下命令
docker login -u #登陆自己的账号,需要输入密码
docker tag {image:tag} {username/image:tag}
docker push {username/image:tag}
报错了timeout,是因为docker地址为国外仓库上传、下载速度较慢。解决办法,在docker客户端直接修改 Preferences - Docker Engine
,把里面原有的几行删掉,替换成如下的内容,这是换上了国内的阿里源。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
再重新push一遍。
Push上传成功,然后在Docker Hub官网看一下自己的镜像,官网已经同步上来了。
我先把自己电脑本地的centos7镜像删掉,以免影响从Docker Hub拉取下来的镜像,顺便在这里介绍一下如何删除镜像和容器,删除镜像的前提是保证没有基于此镜像创建的容器,所以大部分时候,要首先删除对应的容器,然后在删除镜像。
docker rm -f {CONTAINER ID} #删除容器
docker rmi {IMAGE ID} #删除镜像
测试下 docker pull alvinszhang/centos7:1.0.0
,成功!
结语:基本的docker全流程已经学习的差不多了,入门docker!
对了,这个是我的docker客户端原本 Preferences - Docker Engine
的内容,在这里记录一下,这个内容应该是没什么用的。
{
"experimental": false,
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"features": {
"buildkit": true
}
}