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