本文目标
介绍docker基本知识
学会打包一个自定义的docker并让其他人可以成功使用
docker进阶知识积累
参考资料
docker_practice/SUMMARY.md at master · yeasy/docker_practice (github.com)
docker-image container 基本操作 -常用命令 - iDEAAM - 博客园 (cnblogs.com)
如何玩转Docker ?这波docker实战总结(非常全面)终于赶上了! - 知乎 (zhihu.com)
-Orientation and setup | Docker Documentation
docker基本概念
docker诞生背景
docker诞生就是为了解决开发环境和多软件版本不一致的问题。
docker安装
sudo wget -qO- https://get.docker.com | sh
sudo usermod -aG docker usernamexxx
docker基本概念
docker总体架构:
注意docker daemon,负责管控命令执行
docker中有这样几个概念:
- dockerfile:
- image:
- container:
实际上你可以简单的把image理解为可执行程序,container就是运行起来的进程。
那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。
因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。
具体的使用方法就不在这里赘述了,大家可以参考docker的官方文档,那里有详细的讲解。
实战
docker常用指令
docker pull # 获取docker image
docker run -p... #运行container 端口映射
docker run -v xxx(local path):xxx(docker 内部目录)# 目录挂载
docker run -it # -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。
docker commit # 保存改动为新的image
docker build # 创建docker image
docker create #
docker attach # 进入容器(不是进入image)
docker rm [docker id] # 删除docker container
docker rmi [docker image id] # 删除docker image
docker ps # 查看正在运行的docker
docker ps -a # 查看docker运行的历史
docker images # 查看本地已有的docker镜像
docker inspect # 查看image内部具体信息
docker cp # 在host和container之间拷贝文件
docker stop # 停止container
docker search # 在远程仓库docker hub搜索镜像
docker login # 登录docker hub
docker push # 将本地镜像上传到docker hub
build自定义docker
除了用docker commit
命令,还可以编写Dockerfile
(约定俗称是这种写法)来定义和保存自己的docker。
FROM xxx # 设置基础镜像
MAINTAINER xxxx # 著名文件作者/维护者
RUN xxx # 执行命令
COPY xxx # 拷贝文件
ADD xxx # 添加文件
ENTRYPOINT xxx # 给container指定执行入口
EXPOSE xxx # 暴露端口
CMD xxx # 执行命令,给container指定执行入口
WORKDIR # 指定运行命令的路径
ENV # 为container里面环境的设置环境变量
USER # 指定执行container的用户
VOLUME # 指定container执行时挂在的卷
Dockerfile中的每一行都产生一个新的层,也就是说每一行的命令都会产生一个新的docker id。
Docker镜像为深度学习训练模型提供了一个方便的环境,用户可以在不影响系统环境的情况下实现自己任意的环境搭建,这里展示基本docker环境搭建过程。
- 任务需求:比如我现在想要在torch1.7的docker(这里简称它为base docker)基础上再安装一些自己想要安装的包,构建出一个新的docker。
- 大致逻辑:先把想要的base docker pull到本地,在本地进入此docker,再在这docker里安装自己想要的包,都安装好后,退出当前docker,把这个docker commit到一个新的docker(自己的docker)上,再push自己的docker到dockerhub repo。
- 具体步骤:
1)去dockerhub上找一个torch1.7的docker,pull下来,比如我们从torch官方的docker tags里面找到我们想要的torch1.7 develop版本。找到后,在本地运行:
docker pull pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel
上述操作是将这个docker先拉到本地。
2)进入docker:
docker run --runtime=nvidia -it --name=test --ipc=host --net=host pytorch/pytorch:1.7.1-cuda11.0-cudnn8-devel
3)进入docker后就可以尽情地配置自己的环境了。
4)配置完后,“exit”退出docker。
5)将配置好的docker commit到自己的docker(相当于复制了一份到自己的docker)。
docker ps -a # 查看并找到配置好的docker的id
docker commit [docker id] geekyutao/foresee-rl:v0 # geekyutao/foresee-rl:v0是我自己在dockerhub上创建的repo
6)在本地登录dockerhub,再把本地的自己的docker push到dockerhub上。
docker login -u [username] -p [password] # 如果报错的话,很可能是因为机器默认使用了一个docker证书
# 如果报错:删除/usr/local/bin/下的docker证书再登录
# sudo rm /usr/local/bin/docker-credential-pass
docker push geekyutao/foresee-rl:v0
7)完成!再把操作期间遗留的docker和docker image都删了。(借助docker基本操作)