Docker使用介绍
文章目录
1. 要解决的问题:
解决环境配置的难题,开发中经常需要配置各种环境,比如配置各种深度学习框架、某个工程代码的编译环境、部署ftp
服务等等,常见的方案就是虚拟化技术!
2. 什么是Docker
docker是一种操作系统层面的虚拟化技术,一种目前很流行的Linux容器解决方案。
3. 重要概念
3.1 Container(容器)
一个虚拟化出来的操作空间,Container与主机及其他Container相互隔离;
3.2 Image(镜像)
按层打包的应用程序及依赖,可以看做是容器的模板,用来生成容器,一个容器实例也可以打包提交成新的镜像;
3.2.1 DockerHub
存储镜像仓库的网站,包含了常用的镜像;如果说Image是一个类的话,Container就是这个类的一个实例,我们就在这个实例中开展工作;或者可以把Image理解为一个模板,是只读的,Container是基于这个模板创造出来的,是可写的。
4. 镜像命令
4.1 拉取镜像
获得镜像Image的方式之一,是从DockerHub
拉取,直接下载到本地主机上:(从外网拉取前,请先用docker images查看一下已有的images,如有可用的则无需拉取)
这个示例,从dockerhub
拉取了用户mxnet
的python仓库中标签为gpu
的镜像:
docker pull mxnet/python:gpu
镜像体积一般很大,网易也有镜像站点,拉取方式如下:
docker pull hub-mirror.c.163.com/mxnet/python:gpu
4.2 查看镜像
docker images 查看docker镜像
docker images -a 列出本地所有的镜像
docker images -q 只显示镜像ID
docker images -qa 列出所有镜像ID
4.3 删除镜像
docker rmi redis 单个镜像删除
docker rmi -f redis 强制删除(针对基于镜像有运行的容器进程)
docker rmi -f redis tomcat nginx 多个镜像删除,不同镜像间以空格间隔
docker rmi -f $(docker images -q) 删除本地全部镜像
4.4 镜像的导入导出
docker save -o 要保存的文件名 要保存的镜像名/镜像ID 镜像导出为本地文件
docker save -o java8.tar lwieske/java-8 镜像导出示例
docker load --input 文件 从本地文件加载镜像
docker load < 文件名 镜像导入另一种方式
docker push 镜像名:TAG 镜像上传到仓库
注:
-
镜像导出为本地文件,之后使用SSH工具将导出的本地文件上传到另一台服务器,之后通过命令载入镜像,适用于将镜像复制到另一台服务器使用
-
push命令是上传到仓库,一般是官方仓库,具体上传过程查看Docker容器镜像上传到DockerHub仓库
4.5 修改镜像名
docker tag 镜像ID/镜像名 新镜像名称:TAG
5. 容器命令
5.1 创建容器
- 查看docker的版本:
docker version
- 如果版本在19.03以下,则需要使用
nvidia-docker
插件来建立容器,命令:
nvidia-docker run -it --name dc -v /home/dc/:/root -v /home/data:/mnt/data -p 9006:6006 --shm-size 10240m dee7dd8c55a7 bin/bash
解释:
nvidia-docker
:使用了nvidia插件方式建立容器,nvidia插件使docker能支持GPU;run
:建新的容器-t
:–tty,为创建的容器分配一个伪tty,相当于提供了交互式shell;-i
:–interactive,保持标准输入始终开启着,保证容器能收到STDIN;--name
:这个容器的名字,建议加上自己标识,明确是谁的容器;-v
:挂载一个host的目录到容器内,容器内的/root目录相当于host的/home/dc/目录,可以挂载多个目录-p
:端口映射,容器的6006端口映射到主机的9006,使用tensorboard的时候用得到,具体内容见另一篇博客本地浏览器访问Docker容器内的tensorboard可视化内容--shm-size 1024m
:可选的,有时候shared-memory不足,可以通过这个参数指定;dee7dd8c55a7
:镜像ID,也可选择镜像名- 如果版本在19.03及以上(最新版本),这些版本的docker已经原生支持nvidia的gpu,这样建立容器,与旧版只有一部分的差异:
docker run --gpus all -it --name dc -v /home/dc/:/root -v /data3:/data3 -p 9006:6006 --shm-size 10240m dee7dd8c55a7 /bin/bash
5.2 查看容器及重命名
docker ps 列出当前所有正在运行的容器
docker ps -a 列出所有的容器
docker ps -l 列出最近创建的容器
docker ps -q 只显示容器ID
docker top 容器ID或容器名称 查看容器内运行的进程
docker inspect 容器ID或容器名称 查看容器内部细节
docker rename 旧的 新的 容器重命名
5.3 进入容器
进入容器,使用shell交互
- 如果按照5.1命令建立容器,接着按回车即可进入容器;
- 其他情况下,需要知道容器名字/容器ID,通过ssh客户端连上docker主机(常用命令)
docker attach 容器名/容器ID 进到容器内,正在运行的
docker exec -it 容器名/容器ID /bin/bash 进到容器内,新建一个
需要注意的是,容器有开启和停止状态,开启状态时,容器内的进程才在运行,停止状态的容器文件不变;
开启状态的容器才可以attach进去,开启一个已停止的容器并attach进去,输入:
docker start -i 容器名/容器ID
5.4 容器的启动与退出
docker start 容器ID/容器名称 启动容器
docker restart 容器ID/容器名称 重新启动容器
docker stop 容器ID/容器名称 停止容器
docker kill 容器ID/容器名称 强制停止容器
Ctrl+p+q 只退出容器,不停止容器
exit 退出并停止容器
5.5 容器的删除
docker rm 容器ID或容器名称 删除容器
docker rm -f 容器ID或容器名称 强制删除容器
docker rm -f $(docker ps -aq) 删除多个容器
注:建立容器后,这个容器相关的文件会一直存在于主机上,占用存储空间
删除容器意味着除了存储在挂载目录的内容,其他的一切都会被删除,即这个虚拟环境被销毁;
5.6 容器的提交
从DockerHub
拉取的镜像一般都是最小环境,缺少一些我们需要的程序,在新建的容器里面,我们安装了一些程序或者设置了一些环境变量,并且希望长期保留这个环境,那么可以把这个容器提交为一个镜像,使用:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "dc" -m "dc_data" 4813edd4476f dc1004/dc:v1
创建一个新的镜像,-a 作者 -m 文字说明 原来的容器id 镜像名:标签