1、目标镜像搜索
# docker search用于检索目标镜像,执行该命令docker会在DockerHub中检索相关镜像
# 以搜索tensorflow镜像为例
# 简单搜索
docker search tensorflow
# 条件搜索之star数量大于等于特定值,如10
docker search -f stars=10 tensorflow
# 条件搜索之官方镜像
docker search -f "is-official=true"
# 条件搜索之自动构建镜像
docker search -f "is-automated=ture"
# --------------------------------------------------------------------------------
# 注:docker search命令不足:
# 1、默认的docker search命令搜索的结果不包含详细的镜像描述,找到合适的目标镜像较为困难
# 2、默认的docker search命令搜索结果中只包含某个镜像的latest版本,返回的结果中也不含tag
# 信息,若想要安装指定软件版本的镜像则较为困难
# 推荐搜索方法:登录DockerHub(hub.docker.com),检索与查询详细的镜像信息
# --------------------------------------------------------------------------------
2、镜像获取、查阅与删除
# 以官方特定版本的tensorflow为例
docker pull tensorflow/tensorflow:1.15.5-gpu-py3
# 查阅本地中已有的镜像
docker images
docker image ls
# 本地镜像删除(需要指定镜像名(REPOSITORY)与详细的标签(TAG))
docker rmi tensorflow/tensorflow:1.15.5-gpu-py3
3、容器的创建、查看、停止、重启及删除
# 创建容器基本指令:docker run -itd --name=container_name image_name
# -i 表示以交互模式运行容器
# -d 表示后台运行容器,并返回容器ID
# -t 为容器重新分配一个伪输入终端
# --name 为容器指定名称
docker run -itd --name=tf115-gpu-py3 tensorflow/tensorflow:1.15.5-gpu-py3
# 创建容器时指定/创建登录用户:--user myuser/-u myuser
docker run -itd --name=tf115-gpu-py3 -u zxf_h tensorflow/tensorflow:1.15.5-gpu-py3
docker run -itd --name=tf115-gpu-py3 -u root tensorflow/tensorflow:1.15.5-gpu-py3
# 注:1、创建容器时指定的登录用户名可以任意设置,如zxf_h,指定的用户名在容器创建时会自动创建
# 2、指定登录的用户名后,容器将会以指定的用户名登录
# 3、若默认的容器没有默认登录的用户名(大部分容器默认为root用户),且创建容器时未指定用户名,容器启动时前缀为I have no name!
# 4、若指定用户名为root或0,则容器以管理员用户登录,而并非为名字为root的普通用户,因为root用户是默认存在的
# 查看容器--运行中的
docker ps
# 查看容器--包括已经停止的容器
docker ps -a
# 查看容器元信息
docker inspect tf115-gpu-py3
docker inspect dd33d9f9
# 停止容器:docker stop container_name/container_id
docker stop tf115-gpu-py3
docker stop dd33d9f9
# 启动/重启容器:docker start/restart container_name/container_id(restart可以使用start替代)
docker start tf115-gpu-py3
docker start dd33d9f9
docker restart tf115-gpu-py3
docker restart dd33d9f9
# 注:docker容器关闭后进行重启与创建容器时所执行的命令效果一致,
# 特别地,假如创建容器时指定了会结束的指令,即命令执行结束,
# 容器自动停止,则重启后容器还会执行相应指令,指令执行结束后,
# 容器还会自动停止
# 删除容器:docker rm container_name/container_id
docker rm tf115-gpu-py3
docker rm dd33d9f9
# 注: 1、删除容器时需要保证当前删除的容器处于关闭状态,否则无法删除
# 2、删除容器后,容器中的所有配置、产生的所有文件都将被删除,且无法恢复,谨慎处理
4、容器端口映射
# 指定端口映射:docker run -itd -p --name 容器名 宿主机端口号:容器端口号 镜像
# 以TensorBoard端口映射为例
# TensorBoard默认端口为6006,将该端口映射至宿主机的5006
docker run -itd -p 5006:6006 --name=tf115-gpu-py3 tensorflow/tensorflow:1.15.5-gpu-py3
# 假设宿主机ip为192.168.2.5,此时若访问容器提供的TensorBoard Web服务
# 则可以通过访问https://192.168.2.5:5006间接实现
# 随机端口映射:docker run -itd -P --name 容器名 镜像
docker run -itd -p 5006:6006 --name=tf115-gpu-py3 tensorflow/tensorflow:1.15.5-gpu-py3
# 映射的随机端口可以通过docker ps命令查看
# 注:若容器在创建时未进行端口映射,则在运行中的容器中创建的网络访问服务则不可通过宿主机ip与容器中端口进行访问,即容器中开放的端口服务只能映射到宿主机的特定端口才能被访问
5、容器工作目录设置
# 容器工作目录设置,容器运行后自动切换至工作目录
# docker run -itd --name=容器名 -w 工作目录路径 镜像
docker run -itd --name=tf115-gpu-py3 -w /root/zxf_h/ tensorflow/tensorflow:1.15.5-gpu-py3
# 注:指定过工作路径的容器进行commit镜像保存后,基于新镜像创建容器会保留上一次指定的工作路径,即可以不用再次指定工作路径
6、设置容器开机自启动
# 容器开机自启动,即宿主机重启后,容器会自动重启服务
# --restart=always
docker run -itd --name=tf115-gpu-py3 --restart=always tensorflow/tensorflow:1.15.5-py3
7、指定命令执行或服务启动
# 指定命令执行/指定服务启动:在命令尾部加入需要执行的指令
# 构架容器时,执行python test.py --file_path /home/file.dat
docker run -itd --name=tf115-gpu-py3 -w /root/WebTest/ tensorflow/tensorflow:1.15.5-gpu-py3 python test.py --file_path /home/file.dat
# 构建容器时,启动Django服务
# Django服务启动指令为 python manage.py runserver 0.0.0.0:8000
# 假设Django服务项目在/root/WebTest下,则创建指令如下
docker run -itd --name=tf115-gpu-py3 -w /root/WebTest/ tensorflow/tensorflow:1.15.5-gpu-py3 python manage.py runserver 0.0.0.0:8000
# 注:默认情况下指定的命令/服务执行完成后,容器会自动停止
8、文件与目录挂载
# 文件挂载:docker run -itd -v /宿主机/文件名:/容器/文件名 --name 容器名 镜像
# 将宿主机中的/root/data/pairs.txt挂载至容器中的/root/pairs.txt
docker run -itd -v /root/data/pairs.txt:/root/pairs.txt --name=tf115-gpu-py3 tensorflow/tensorflow:1.15.5-gpu-py3
# 注:docker文件挂载命令中容器中的文件路径必须写全,不能只写到上级目录
# 错误示例:-v /root/data/pairs.txt:/root/
# 正确示例:-v /root/data/pairs.txt:/root/pairs.txt
# 目录挂载:docker run -itd -v /宿主机/文件目录:/容器/目录 --name 容器名 镜像
# 将容器中的/root/data目录挂载至宿主机的/home/data目录
docker run -itd -v /home/data:/root/data --name=tf115-gpu-py3 tensorflow/tensorflow:1.15.5-gpu-py3
# 注:1、文件挂载后容器中/root/data目录下的产生的数据将写至宿主机的/home/data目录
# 即使容器被删除,容器产生的数据依然可以在宿主机中得以保留
# 2、执行docker run构建构建容器后,若宿主机或容器并没有相应目录,则docker会自动创建目录
# 3、指定过文件或目录挂载的容器进行commit镜像保存后,基于新镜像创建容器不会保留上一次指定的目录
# 挂载,因此基于新镜像创建的容器必须再次指定文件或目录挂载路径
9、容器的进入与退出
# 进入容器:docker exec -it container_name/container_id /bin/bash
docker exec -it tf115-gpu-py3 /bin/bash
docker exec -it dd33d9f9 /bin/bash
# 以管理用户root进入运行中的容器
docker exec -u root -it tf115-gpu-py3 /bin/bash
docker exec -u root -it dd33d9f9 /bin/bash
docker exec -u 0 -it tf115-gpu-py3 /bin/bash
docker exec -u 0 -it dd33d9f9 /bin/bash
# 注:此处进入的容器为运行状态下的容器,登录用户不能任意指定,进入容器时只能登录已有的用户,若登录未曾创建的用户则会报错误,样例如下
# docker exec -u new_user123 -it tf115-gpu-py3 /bin/bash
# unable to find user new_user123: no matching entries in passwd file
# 直接退出容器(容器终端无服务占用)
exit
ctrl + d
# 后台退出容器(容器终端有服务占用,如Django Web服务占用终端,此时使用后台退出可以无需关闭Web服务的情况下退出容器)
crtl + p + ctrl + q
10、在容器外部执行容器内部命令
# docker exec -it 容器名 容器内指令
# 示例
# 容器外部查看容器内运行的进程
docker exec -it tf115-gpu-py3 ps -aux
docker exec -it tf115-gpu-py3 top
# 容器外部查看容器内/root/pairs.txt文件中的内容
docker exec -it tf115-gpu-py3 cat /root/pairs.txt
11、设置root权限执行命令
# 执行命令前中加入 --privileged=true
docker run -itd --name=tf115-gpu-py3 -w /root/WebTest/ tensorflow/tensorflow:1.15.5-gpu-py3 --privileged=true python manage.py runserver 0.0.0.0:8000
12、容器网络禁用
# 容器网络禁用,加入--network none
docker run -itd --name=tf115-gpu-py3 --network none tensorflow/tensorflow:1.15.5-gpu-py3
13、文件拷贝
# 宿主机文件拷贝至容器
# docker cp /宿主机目录/文件名 容器名:/容器目录/
docker cp /home/test1.txt tf115-gpu-py3:/root/
# 容器文件拷贝至宿主机
# docker cp 容器名:/容器目录/文件名 /宿主机目录/
docker cp tf115-gpu-py3:/root/test1.txt /home/
# 宿主机文件夹拷贝至容器指定目录下
# docker cp /宿主机目录 容器名:/容器目录/
docker cp /mydir tf115-gpu-py3:/root/
# 容器文件夹拷贝至宿主机指定目录下
# docker cp 容器名:/容器目录 /宿主机目录
docker cp tf115-gpu-py3:/root/mycontainer_dir /home/
# 注:1、docker文件拷贝在宿主机中操作
# 2、docker文件拷贝时,无需保证容器处于运行状态,非运行状态的容器也可以完成文件拷贝
# 3、docker文件拷贝命令只有两个参数,一个是源路径(文件/文件夹), 一个是目标路径(文件夹),因此不支持多个文件夹或多个文件同时拷贝(通配符*展开后为多个文件,因此同样不支持),错误样例指令如下:
# docker cp docker cp /mydir1 /mydir2 tf115-gpu-py3:/root/
# docker cp docker cp /mydir1/1.txt /mydir2/2.txt tf115-gpu-py3:/root/
# docker cp docker cp /mydir1/* tf115-gpu-py3:/root/
14、查看容器日志
# 查看容器日志(容器后台执行有服务,且有日志输出,若无日志输出则打印结果为空)
# 基本命令:docker logs -ft 容器名
docker logs -ft tf115-gpu-py3
# 查看5秒内日志
docker logs -ft tf115-gpu-py3 --since 5s
# 查看3分钟内日志
docker logs -ft tf115-gpu-py3 --since 3m
# 注:1、日志查看为实时的,当容器中有新的日志输出时,终端会自动实时输出,可用于后台服务日志监测
# 2、退出日志使用Ctrl+C,此处的Ctrl+C退出的为docker logs,而不是容器后台运行的服务
15、容器的修改与保存
# 保存容器中的修改形成新的镜像
# docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name
# -a:参数可选,用于指定作者,可以写你的名字
# -m:参数可选,提交信息,可以说一下你做了哪些修改
# container_id:该参数为被修改的容器ID
# new_image_name:此为新镜像的名字,可自定义
# tag_name:此为新镜像的标签,可不写,不写时标签默认为latest
docker commit -a "zxf_h" -m "configured environment" tf115-gpu-py3 tf115-gpu-py3-cfg:1.0
docker commit -a "zxf_h" -m "configured environment" dd33d9f9 tf115-gpu-py3-cfg:1.0
# commit后,执行docker images即可看到新保存的镜像
# 使用commit后的镜像创建的容器则包含上次的修改
# 使用docker inspect 新镜像名 可以查看commit的镜像信息
docker inspect tf115-gpu-py3-cfg:1.0
16、镜像的保存与加载(save/load,导出的目标是镜像,注意与export/import的区别,可与commit组合使用,导入镜像时无需指定新的镜像名与标签,更便于版本管理,推荐使用)
# 镜像的保存
# docker save -o 导出路径/导出镜像.tar 待导出的镜像名镜像名列表(带标签)
# 保存单个镜像
docker save -o ./tf115-gpu-py3.tar tensorflow/tensorflow:1.15.5-gpu-py3
# 保存多个镜像
docker save -o ./mult-images.tar tensorflow/tensorflow:1.15.5-gpu-py3 mysql:latest
# 注:1、docker save是将“镜像”导出为tar文件,导出的目标是镜像不是容器
# 2、docker save一次可以导出多个镜像
# 镜像的加载
# docker load -i 镜像包目录/镜像包名.tar
docker load -i ./tf115-gpu-py3.tar
docker load -i ./mult-images.tar
# 注:1、docker load导入后创建的是单个或多个docker镜像,不是导入容器
17、容器的保存与加载(export/import,导出的目标是容器,注意与save/load的区别,导入镜像时需要指定新的镜像名与标签,不便于版本管理,不推荐使用)
# 容器的保存
# docker export -o 导出路径/导出容器名.tar 待导出的容器名
docker export -o ./tf115-gpu-py3.tar tf115-gpu-py3
# 注:1、docker export是将“容器”导出为tar文件,导出的目标是容器不是镜像
# 2、docker export一次只能导出一个容器
# 具体可参考doker export --help
# 容器的加载
# docker import 容器包路径/容器包名.tar 导入的镜像名:镜像标签
doker import ./tf115-gpu-py3.tar tf115-gpu-py:1.0
# 注:1、导入的镜像名与镜像标签是自定义的
# 2、docker import 导入后创建的是docker镜像,并不是直接还原为容器
# 具体可参考docker import --help
参考博客:[1] 【Docker系列】从头学起 Docker——docker run 命令详解_搞什么滚去学习的博客-CSDN博客